diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,784 @@
+# Changelog for [`duckling` package](https://github.com/facebook/duckling)
+
+## 0.2.0.0
+
+### Core
+  * Bump versions on dependencies
+  * ExampleMain: add support for setting the port
+  * Support for GHC >= 8.8.x && GHC <= 9.0.1
+  * Relicense to BSD-3
+  * Probabilistic layer bug fix
+  * Remove dependency on Data.Some
+  * Depend on regex-pcre-builtin on Windows
+  * Update cabal-version to 2.2
+  * Migrate to GitHub CI over Travis
+  * Some attempts at getting smaller parse trees (less exploitable)
+
+### Rulesets
+
+* Common
+  * Correct CDT TimeZone offset  CDT is (-300), not 540.
+  * Fixed BST and IST offsets. BST is +1 (60) and IST is +5:30 (330)
+  * Make unicode output in tests sane by not relying on `Show`
+  * Add type=value to JSON response for Email, PhoneNumber, and Url, for consistency
+  * CreditCardNumber: **new!** (duckling can now recognise credit cards)
+  * Email: Add DE (German) + IS (Icelandic) spelled out email
+  * Numeral: Don't accept dashes ('-') as token separators
+  * Time: Add Karva Chauth holiday
+  * Time: Add Vaisakhi holiday
+  * Time: Add daylight savings start/endtimes to holidays
+  * Time: Add Purim and Shushan Purim (Jewish holidays)
+  * Time: Add Guru Gobind Singh Jayanti holiday
+  * Time: Extend support for Ramadan and Eid al-Fitr from 1950 to 2050
+  * Time: Add support for Parsi New Year
+  * Time: Add support for Dayananda Saraswati Jayanti holiday
+  * Time: Extend support for Mawlid from 1950 to 1998
+  * Time: Add Rabindra Jayanti holiday
+  * Time: Add Guru Ravidass Jayanti holiday
+  * Time: Extend support for Eid al-Adha from 1950 to 2000
+  * Time: Add Krishna Janmashtami holiday
+  * Time: Add Mahavir Jayanti holiday
+  * Time: Add Maha Shivaratri holiday
+  * Time: add Ugadi holiday
+  * Volume: interval support
+
+* AF (Afrikaans)
+  * Numeral: **new!**
+
+* AR (Arabic)
+  * Add a new locale: EG (Egyptian)
+  * AmountOfMoney: Add more variants of EGP
+  * Numeral: Add support for numerals written in Arabic script
+  * Numeral: Support decimals and comma-separated integers
+  * PhoneNumber: **new!**
+  * Time: Add periodic times
+  * Time: Add rule for a week ago
+
+* BG (Bulgarian)
+  * Time: **new!**
+
+* BN (Bengali)
+  * Numeral: **new!**
+
+* CA (Catalan)
+  * Numeral: **new!**
+  * Ordinal: **new!**
+
+* DA (Danish)
+  * Ordinal: Add support for larger spelled-out ordinals
+  * Time: recognise abbreviation 'kl'
+
+* DE (German)
+  * Distance: **new!**
+  * Duration: Add more common durations
+  * Numeral: Fix typo on "fünfzehn"(15)
+  * Time: Fix wrong parsing of YYYY-MM-DD dates
+  * Time: Add rule for 'the day before yesterday'
+  * Time: Fix a bug for "fünfter"¬
+  * Time: support for "am ersten Dezember" to " am einunddreißigsten Dezember"¬
+  * Time: now recognise "der fünfte Dezember"¬
+  * Time: Add support for (pre-)computed holidays
+  * Time: Don't parse 'so'
+  * Time: improve approximations
+  * Time: Add rule for week after next
+  * Time: Add rule for montag in n wochen
+  * Volume: **new!**
+
+* EN (English)
+  * AmountOfMoney: Add support for subunits of dollars, e.g. nickels, dimes, quarters, as well as the number of coins
+  * AmountOfMoney: Add support for latent
+  * AmountOfMoney: Add support for lakh and crore
+  * AmountOfMoney: correct regex to match three letter currency codes beginning with C
+  * AmountOfMoney: Make ruleInterval{Max,Min} symmetric
+  * AmountOfMoney: Support abbreviations of lakh and crore
+  * AmountOfMoney: Add UAH currency
+  * AmountOfMoney: Add HKD
+  * AmountOfMoney: dollar and \<amount-of-money\>
+  * AmountOfMoney: dollar and a half
+  * AmountOfMoney: intersection for \<amount-of-money\> and a half
+  * AmountOfMoney: extend interval support
+  * AmountOfMoney: Add more variants of EGP
+  * Distance: Support composite distances
+  * Distance: one meter and \<distance\>
+  * Distance: \<distance\> meters and \<distance\>
+  * Distance: Add interval support
+  * Duration: Fix composite durations without delimiters.
+              It previously only worked with
+              commas/'and'-separated tokens
+  * Duration: Support more words in `ruleDurationNumeralMore`
+  * Duration: \<integer\> and a half minutes
+  * Duration: support for \<integer\> hour and \<integer\>
+  * Duration: parse Xm as X minutes and X.Y hrs as X.Y hours
+  * Duration: Leverage TimeGrain for x.y hours
+  * Duration: Support composite duration
+  * Numeral: Fix ambiguous parses when both ruleNegative and ruleMultiply apply
+  * Numeral: Extend fraction rule
+  * Numeral: Add mixed fraction rules
+  * Numeral: Add prefix of 10/100/10_000 rules
+  * Quantity: Support 'k.g' and 'k.g.' for kilograms
+  * Temperature: Support temperatures with decimal values
+  * Time: Fix palm sunday regex
+  * Time: Fix latent time of days like "ten thirty"
+  * Time: Don't parse time of days above 12 with meridiem
+          like "13 am"
+  * Time: Add rule to match \<time\> + \<timezone\>
+  * Time: Add "all week"/"rest of the week" rules
+  * Time: Parse time intervals like: 2015-03-28 17:00:00/2015-03-28 21:00:00
+  * Time: Add rules to handle "DD/MM/YYYY" or "DD MM YYYY"
+  * Time: Add support for YYYYQQ and YYQQ expressions, like
+          '2018Q4' and '18Q4'
+  * Time: Add rule for 'during \<month\>'
+  * Time: Restrict 'on' absorption to days
+  * Time: Fix durations, upper intervals should all be exclusive
+  * Time: Fix grain on some intervals for time-of-days
+  * Time: Add rule 'in \<duration\> at \<time-ofday\>
+  * Time: Add \<datetime\> - \<datetime\> (interval) timezone rule
+  * Time: '\<day\> in \<duration\> should only operate on grain \> Hour
+  * Time: Add '\<integer\> \<day-of-week\> from \<time\>' rule
+  * Time: Add \<duration\> past \<time\>
+  * Time: Make 'the week' resolve to interval from `today` to `end of week`
+  * Time: Add support for \<hour\>h\<min\>
+  * Time: Add rule for a quarter after \<hour-of-day\>
+  * Time: Support 'Martin Luther Kings Day'
+  * Time: Add more holiday aliases (Veteran Day, Mardi Gras, St. Paddy's Day)
+  * Time: Intersect "9 tomorrow morning"
+  * Time: Support 'Chinese New Years'
+  * Time: Support "Saint" Patrick's Day
+  * Time: Add Ratha-Yatra Holiday
+  * Time: Add support for Ganesh Chaturthi holiday
+  * Time: Add rama navami holiday
+  * Time: Add '\<part-of-day\> at \<time-of-day\>' rule
+  * Time: Modify 'this|last|next \<cycle\>' to capture things like "the month" in "the first Saturday of the month"
+  * Time: Support 'the \<day-of-month\> of \<month\>'
+  * Time: Add Orthodox Good Friday holiday
+  * Time: The (nth) closest (day) to (time)
+  * Time: Add rule for 'midday'
+  * Time: Fix a problem with parsing fractional minutes
+  * Time: parse 'upcoming xxx weeks' and 'xxx upcoming weeks'
+  * Time: Add new rule to parse phrase in the pattern 'xxx minutes to \<hour-of-day\>
+  * Time: Add support for spelled-out times
+  * Time: Add support to parse \<ordinal\> \<day-of-week\>
+  * Time: Fix parsing 'next \<day-of-week\>'
+  * Time: Treat 'coming' as 'next'
+  * Time: Make duckling time not treat 0:xx and 12:xx ambiguously
+  * Add 'asap', 'at the moment' to EN time
+  * Parse latent year intervals
+  * Time: last \<duration\>
+  * Time: \<time\> \<day-of-month\>
+  * Volume: Extend interval support
+  * Time: Handle 2-digit date in existing DD/MM/YYYY rule
+
+* EN_UK (English, United Kingdom)
+  * Duration: **new!**
+  * Time: **new!**
+
+* EN_US (English, United States)
+  * Time: Super Tuesday
+
+* ES (Spanish)
+  * AmountOfMoney: Add support for intervals
+  * Duration: Add support for parsing phrases like half hour, quarter of an hour
+  * Duration: Support composite durations
+  * Numeral: Fix typo of 22 (veinto -> venti)
+  * Numeral: Add locale rules, since Spain and South America use different decimal separators
+  * Numeral: parse 'cero dos' as 'dos'
+  * Numeral: composite numerals
+  * Ordinal: Add missing 'tercer' regex
+  * Quantity: **new!**
+  * Time: Add support for periodic holidays
+  * Time: Fix `ruleYearLatent` to not match numerals that could be hours
+  * Time: Make 'n horas' latent
+  * Time: Fixed a problem with parsing 'day of month' that contains 'dia'
+  * Time: Add rule for 'next week'
+  * Time: \<ordinal\> \<day-of-month\>
+  * Time: support for 'noon'
+  * Time: Allow para before timestamps
+  * Time: Add rule to parse '\<time-of-day\> (in the afternoon)'
+  * Time: Add rule to parse 'last \<day-of-week\> of \<time\>'
+  * Time: Add rule for next week
+  * Time: Add more corpus for tomorrow so that tomorrow latent doesn't prevail
+  * Time: Fix multi-word timestamps
+
+* FA (Persian)
+  * Numeral: **new!**
+
+* FI (Finnish)
+  * Numeral: **new!**
+
+* FR (French)
+  * Temperature: Support temperatures with decimal values
+  * Time: Update month interval rules to handle ordinals
+          and spelled-out numerals (e.g. "du premier au
+          quinze juin")
+  * Volume: Add 'Centilitre' type
+
+* HE (Hebrew)
+  * AmountOfMoney: add more rules
+
+* HI (Hindi)
+  * Duration: Pakhwada (पखवाड़ा) is 15 days n, not a fortnight
+  * Duration: Add support for composite duration
+  * Duration: Add support for specific times
+  * Numeral: Support more numerals
+  * Temperature: **new!**
+  * Time: Add support for quarter till, quarter past, and half
+
+* ID (Indonesian)
+  * AmountOfMoney: support intervals
+
+* IS (Icelandic)
+  * Numeral: **new!**
+
+* IT (Italian)
+  * AmountOfMoney: **new!**
+  * Distance: **new!**
+  * Duration: Fix ruleDurationAgo
+
+* KA (Georgian)
+  * AmountOfMoney: **new!**
+  * Duration: **new!**
+  * Numeral: **new!**
+  * Ordinal: **new!**
+  * Time: **new!**
+  * Time: Improvements for times in the past
+  * Time: Add support for quarters
+
+* KM (Khmer)
+  * Distance: **new!**
+  * Numeral: **new!**
+  * Ordinal: **new!**
+  * Quantity: **new!**
+  * Temperature: **new!**
+  * Volume: **new!**
+
+* KN (Kannada)
+  * Numeral: **new!**
+
+* KO (Korean)
+  * AmountOfMoney: support intervals
+
+* LO (Lao)
+  * Numeral: **new!**
+
+* ML (Malayalam)
+  * Numeral: **new!**
+  * Ordinal: **new!**
+
+* MN (Mongolian)
+  * Numeral: **new!**
+
+* NL (Dutch)
+  * AmountOfMoney: make decimal thousands separator optional
+  * Duration: Add 'anderhalf uur'
+  * Duration: support composite durations
+  * Quantity: **new!**
+  * Time: Add support for King's Day (Koningsdag)
+  * Time: stop 'for \<number\>' from resolving as times
+  * Volume: remove gallon
+  * Volume: Fix typo in milliliter
+
+* NO (Norwegian)
+  * AmountOfMoney: Parse more currencies
+  * Numeral: The written numeral 8 had a typo: "otte" -> "åtte"
+  * Numeral: Parse powers of ten with spaces as well as dots
+  * Numeral: Add more textual powers of ten
+  * Numeral: Parse textual numbers from 21 to 99 with _and_ without spaces
+  * Time: Add support for half an hour before as e.g. "halv to"
+  * Time: Add support for alternative clock denotation "klokka"
+  * Time: Add support for alternative tomorrow denotation "i morra"
+  * Time: Add some more unambiguous datetime parsing
+
+* PL (Polish)
+  * Numeral: Add support for seventy, eighty, ninety
+  * Duration: Fix typo: miej -> mniej
+  * Time: Add 'evening' to corpus
+
+* PT (Portuguese)
+  * Ordinal: Add 13..99
+  * Ordinal: Corpus, keep accents consistent
+  * Time: Last and quarter expressions
+
+* RO (Romanian)
+  * Numeral: Fix multipliers with values above 20
+             In Romanian, for numerals above 20, we
+             say '20 de milioane', not '20 milioane'.
+  * Time: Implement 'the day after tomorrow'
+
+* RU (Russian)
+  * AmountOfMoney: Add UAH currency
+  * Numeral: Be more permissive with numerals [20, 90]
+  * Time: **new!**
+
+* SK (Slovak)
+  * Numeral: **new!**
+
+* SW (Swahili)
+  * Numeral: **new!**
+
+* TA (Tamil)
+  * Ordinal: **new!**
+
+* TE (Telugu)
+  * Numeral: **new!**
+
+* TH (Thai)
+  * Numeral: **new!**
+
+* TR (Turkish)
+  * AmountOfMoney: **new!**
+  * Time: **new!**
+
+* VI (Vietnamese)
+  * AmountOfMoney: Add interval support
+  * AmountOfMoney: ruleNg, ruleDollar, ruleVND modified to better capture usage of VI
+  * Numeral: Add "ngàn" common synonym of "nghìn", and "chục",
+             colloquially used to count tens.
+  * Numeral: Remove ? in some regex where they don't make sense
+  * Time: Fix double-digit month matching
+  * Time: don't parse ngày
+
+* ZH (Chinese)
+  * Duration: Add more common expressions
+  * Numeral: Add more common expressions
+  * Time: Parse YYYY-MM
+  * Time: Value before month can be integer or chinese char
+  * Time: Add support for (pre-)computed holidays
+  * Time: Add more common expressions
+  * Volume: **new!**
+
+### Server
+  * Skip logfile creation if no logging
+  * Document how example application can use specific dimensions only
+  * Use System.FilePath.Posix instead of System.FilePath
+  * Use all dimensions by default
+  * Load timezones more leniently
+  * Docker: Reduce size of image drastically
+  * Dockerfile: Use Debian Buster
+
+## 0.1.6.1
+
+### Core
+
+* Warn against incomplete pattern matching in GHC options
+* Updated readme for custom dimensions
+* Coding style documentation
+
+### Rulesets
+
+* Common
+  * AmountOfMoney: change `financeWith` to `isAmountOfMoney` where applicable
+  * Temperature: implement temperature intervals
+
+* EN
+  * AmountOfMoney: support "grand"
+  * Time: Absorb "since" before month/year
+  * Time: Fix before/after/until/since + <year>
+  * Time: Make partial meridies latent
+  * Time: Global Youth Service Day
+  * Time: Vesak
+  * Time: Earth Hour
+  * Time: Regex update for Rosh Hashanah and Chanukkah
+  * Time: add <time> for <duration> rules
+  * Distance: Millimeter units and UK spellings
+  * Duration: Handle half time grains
+
+* EN_US
+  * Time: Fix Emancipation Day
+  * Time: Tax Day
+  * Time: Siblings Day
+  * Time: EMS Week and EMSC Day
+
+* EN_AU
+  * Time: Ekka
+
+* EN_XX
+  * Time: Administrative Professionals' Day
+  * Time: Parse 'second last week of October 2018'
+  * Time: AD/BC parsing for years
+
+* AR
+  * Numeral: Fix dual big numbers
+  * Numeral: Fix million
+
+* DA_XX
+  * Time: Remove 'man'
+
+* DE
+  * Time: Remove am/pm rule
+
+* HI
+  * Duration: **new!**
+  * TimeGrain: **new!**
+
+* NL
+  * Time: Fix Sinterklaas for Belgium
+
+* RO
+  * AmountOfMoney: Fix for values above 20
+  * AmountOfMoney: Support intervals
+  * Distance: Fix for values above 20
+  * Duration: Fix for values above 20
+  * Quantity: Fix for values above 20
+  * Temperature: Fix for values above 20
+  * Volume: Fix for values above 20
+
+* ZH
+  * Quantity: **new!**
+  * Time: Support Periodic Holidays
+
+## 0.1.6.0
+
+### Core
+
+The `value` field of `Entity` is now typed! Use `toJText` to get the JSON-encoded string back.
+
+## 0.1.5.0
+
+### Testing
+* Prompt ambiguous parses in corpus tests
+
+### Rulesets
+
+* Common
+  * Add an option to return latent time entities.
+  * AmountOfMoney: Distribute ruleUnitAmount to all languages
+  * Time: Make all years latent
+  * Lambda-case for Rule production
+  * Numeral: fix intersect rule to work with negative numbers
+  * Support custom dimensions
+
+* BG_XX:
+  * Distance: **new!**
+  * TimeGrain: **new!**
+  * Duration: **new!**
+  * Ordinal: **new!**
+
+* EN_XX
+  * Time: periodic holidays
+  * Time: handle Easter
+  * Time: parse "DD MM YYYY", "MM DD YYYY"  as date instead of only phone fix
+  * Time: added rules for the beginning / end of year / month / week
+  * Time: "late tonight"
+  * Time: "last night" and "late last night"
+  * Time: fixes in holidays
+  * Time: Return Holiday Name in response
+  * Duration: composite
+  * Time: support for this|last|next season
+  * Time: added Easter-based holidays
+  * Time: precomputed Orthodox Easter dates
+  * Time: added Orthodox Easter-based holidays
+  * Time: fix Labour Day, add Heroes' Day and National Patriots' Day
+  * Time: Chinese New Year
+  * Time: added Boss's Day
+  * Time: fix computed past series and Jewish holidays
+  * Time: added rules to cover EOY, EOM, BOY, BOM
+  * Time: rule <Day of month> of month
+  * Time: Islamic holidays
+  * Time: fix "in" + year
+  * Time: Added precomputed Jewish holiday "Tu BiShvat"
+  * Time: time + n years ago/in n years
+  * Time: make "may" latent
+  * Duration: move composite duration rule to English
+  * Time: add Diwali, Navaratri, Vasant Panchami, Holika Dahan, Holi and other Hindu holidays
+
+* EN_AU
+  * Time: add Reconciliation Day
+
+* EN_CA
+  * Time: add Discovery day
+  * Time: Add "Groundhogs day" in regex for "Groundhog Day"
+
+* EN_GB
+  * Time: fixed mother's day
+
+* EN_US
+  * Time: Washington's birthday, President day and Lincoln's birthday
+  * Time: Add "Groundhogs day" in regex for "Groundhog Day"
+
+* ES_XX
+  * Time: use `mkRuleSeasons`
+
+* DE_XX
+  * Time: return Holiday Name in response
+
+* NL_XX
+  * Time: return Holiday Name in response
+  * AmountOfMoney: **new!**
+
+* PL_XX
+  * Time: month regex fix
+
+* RU_XX
+  * Ordinal: refactor pattern match to hashmap lookup
+
+* SV_XX
+  * Distance: **new!**
+  * Distance: fix mil
+
+* TA_XX
+  * Numerals: **new!**
+
+* VI_XX
+  * AmountOfMoney: Use comma "," as decimal separator
+
+* ZH_XX
+  * Distance: **new!**
+  * Time: remove unused `ruleLastTuesdayLastJuly`
+  * Numeral/Distance/Time: generalize and expand digit specifier usage
+  * AmountOfMoney: **new!**
+
+## 0.1.4.0
+
+### Core
+* Bumped to LTS 9.10
+* API: Added `Node` to `Entity` to return the parse tree
+
+### Rulesets
+* Common
+  * AmountOfMoney: don't recursively compare cents
+  * AmountOfMoney: don't allow decreasing intervals
+  * Duration: added `type` in response
+  * Numeral: common rule to parse numbers
+  * Numeral: common rule to parse fractions
+  * Numeral: don't compose negative numbers
+  * Time: fixed empty values for past datetimes
+  * Time: fixed case sensitivity for timezones
+  * Url: fragments support
+* AR_XX
+  * AmountOfMoney: **new!**
+  * Duration: **new!**
+  * Ordinal: more rules
+  * Quantity: **new!**
+  * Temperature: **new!**
+  * Time: **new!**
+  * Volume: **new!**
+* DE_XX
+  * Numeral: fixed keiner
+  * Time: fixed this/next/last for holidays/months/days of week/seasons/weekend only
+* EL_XX
+  * Duration: **new!**
+  * Numeral: **new!**
+  * Ordinal: **new!**
+  * Time: **new!**
+* EN_GB
+  * Time: fix parsing Oct-Dec months
+* EN_XX
+  * AmountOfMoney: intervals support
+  * Distance: intervals support
+  * Email: spelled out 'dot'
+  * Numeral: prevent double negatives
+  * Numeral: skip hundred for alphabetical numbers only
+  * Quantity: intervals support
+  * Time: don't parse "at" + phone number
+  * Time: fixed date format in non-US locales
+  * Time: fixed Thanksgiving in locales
+  * Time: don't parse "this in 2 minutes"
+  * Time: spelled out times + AM/PM
+  * Time: fixed case sensitivity
+  * Time: fixed "from" + time of day
+  * Time: support MM.DD.YYYY
+* FR_XX
+  * Numeral: space as thousand separator
+* GA_XX
+  * Numeral: fix old vigesimal
+* HI_XX
+  * Numeral: **new!**
+  * Ordinal: **new!**
+* JA_XX
+  * Time: removed dimension, as it is not implemented yet
+* NE_XX
+  * Numeral: **new!**
+* NL_XX
+  * Time: **new!**
+  * Time: don't be too eager on days of week
+  * Time: today/tomorrow/yesterday evening/afternoon/morning
+  * Time: fixed this/next/last for holidays/months/days of week/seasons/weekend only
+* PT_XX
+  * Numeral: fixed rules
+* RU_XX
+  * AmountOfMoney: **new!**
+  * Distance: **new!**
+  * Duration:: **new!**
+  * Numeral: 1.5 rule, more 0 rules, fixed 11, 300 and 400
+  * Ordinal: fixes
+  * Quantity: **new!**
+  * Volume: **new!**
+* SV_XX
+  * Duration: extend support for "about" + duration
+
+### Server
+* Fixed Dockerfile
+* Added reference time parameter
+
+## 0.1.3.0
+
+### Core
+* Support locales
+* Don't allow matches in the middle of words
+
+### Rulesets
+* Common
+  * All: converted back all escaped characters to unicode
+  * Time: don't shift duration on "`Duration` before/after `Time`"
+  * Time: don't parse subsequent numbers
+  * Time: fix `nthDOWOfMonth`
+  * Time: reuse the `weekend` helper in all languages
+* BG_XX
+  * AmountOfMoney: **new!**
+  * Numeral: **new!**
+* DA_XX
+  * Time: Consolidated rules for months and days of week
+* DE_XX
+  * Time: don't parse "nächste 5"
+  * Time: Consolidated rules for months and days of week
+  * Time: Consolidated rules for holidays, instants and seasons
+* EN_CA
+  * Time: Fixed Thanksgiving Day
+* EN_GB
+  * Time: Fixed DDMM and YYYYDDMM
+* EN_XX
+  * Time: "for `Duration` from `Time`"
+  * Time: "from 10 to 16 August"
+  * Time: "August 27th-30th"
+  * Time: "23rd to 26th Oct", "1-8 september"
+  * Time: Support misspelled "tonights" and "weekends"
+  * Quantity: Support ounces
+  * Email: restrict domain extensions to letters when spelling out
+* ES_XX
+  * Time: Consolidated rules for months and days of week
+  * Ordinal: Fixed "first" variants + accents
+* FR_XX
+  * Time: don't parse "a un"
+  * Time: Consolidated rules for months and days of week
+* GA_XX
+  * Time: Consolidated rules for months and days of week
+* HE_XX
+  * Time: Consolidated rules for months
+* HR_XX
+  * Time: Consolidated rules for months and days of week
+* HU_XX
+  * Duration: **new!**
+  * Numeral: **new!**
+  * Ordinal: **new!**
+  * Time: **new!**
+* IT_XX
+  * Time: Consolidated rules for months and days of week
+* JA_XX
+  *Numeral: Optimized regex lookup
+* KA_XX
+  * Numeral: **new!**
+* NB_XX
+  * Time: Consolidated rules for months and days of week
+* NL_XX
+  * Duration: **new!**
+* PL_XX
+  * Time: don't parse "nie"
+  * Time: don't parse ordinals without context
+  * Time: Consolidated rules for months and days of week
+* PT_XX
+  * Time: don't parse "um" alone
+  * Time: don't parse "ter"
+* RO_XX
+  * Time: Consolidated rules for months and days of week
+  * Time: don't parse "sa"
+* SV_XX
+  * Ordinal: Fixed ordinals
+  * Time: "i + day-of-week"
+  * Time: Consolidated rules for months and days of week
+* VI_XX
+  * Time: Consolidated rules for months and days of week
+* ZH_TW
+  * Time: Fixed National Day
+* ZH_XX
+  * Time: Consolidated rules for months and days of week
+
+## 0.1.2.0
+
+### Core
+
+* `weekend` production helper
+* Numeral flag for Time patterns
+
+### Rulesets
+
+* FR
+  * Time
+    * `début|milieu|fin de matinée` (`early|mid|late morning`)
+    * `début|milieu|fin de après-midi` (`early|mid|late afternoon`)
+    * `début|milieu|fin de journée` (`early|mid|late day`)
+    * `début|fin de soirée` (`early|late evening`)
+    * `début|fin de mois` (`early|late month`)
+    * `début|fin d'année` (`early|late year`)
+    * `plus tard` (`later`)
+    * `plus tard que ...` (`later than ...`)
+    * `plus tard <time>` (`later than <time>`)
+    * `plus tard <part-of-day>` (`later than <part-of-day>`)
+* EN
+  * Time
+    * Support dates of type mm-dd
+    * Fix issue #50 "last weekend of october"
+    * Added a rule to handle "from <month> dd-dd"
+    * Add MM/YYYY
+* DE
+  * Time
+    * Make last dot optional in "13.03."
+    * Handle variations of "13.-15.10." correctly
+    * Treat "14/15Uhr" the same as "14-15Uhr"
+    * Extended "bis" to also match "bis zum" and "auf den"
+    * Changed `hh:mm` matching to also get the expression "17h00"
+* PT
+  * Numeral
+    * Numerals between 100 and 999 in Portuguese fixed
+* GA
+  * Ordinal
+    * Also match old-style -adh ending
+
+## 0.1.1.0
+
+### Core
+* More optimizations for `Time` internals.
+* `Entity` value is now a `Value` (was a JSON-encoded `Text`).
+
+### Rulesets
+* Common
+  * AmountOfMoney: MYR currency
+  * Duration: Helper for "<numeral>.<numeral> hours"
+* CS
+  * Distance: **new!**
+  * Numeral: **new!**
+* DE
+  * Ordinal: Don't parse "1.1."
+  * Time: Small improvements
+* EN
+  * AmountOfMoney
+    * Support pence as cents
+    * Support Malaysian ringgits
+  * Distance: Abbreviations for inches, miles
+  * Numeral: Fractions
+  * Quantity: Generic product
+  * Time
+    * Allow spaces in e.g. "2 / 15"
+    * Afternoonish
+    * Early/mid/late month
+* ID
+  * Numeral: Optimization for regex matching
+* KO
+  * Time: Fixed typo in the day after tomorrow
+* SV
+  * Time: vid
+* TR
+  * Distance: **new!**
+  * Duration: **new!**
+  * Numeral: Comma as decimal mark
+  * Temperature: **new!**
+  * Volume: **new!**
+* ZH
+  * Time: Cantonese support
+
+### Server
+* Added dockerfile
+* Fixed warnings around logs
+
+## 0.1.0.0
+
+* Initial version. Released on an unsuspecting world.
diff --git a/Duckling/AmountOfMoney/AR/Corpus.hs b/Duckling/AmountOfMoney/AR/Corpus.hs
--- a/Duckling/AmountOfMoney/AR/Corpus.hs
+++ b/Duckling/AmountOfMoney/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -87,6 +86,8 @@
              [ "42 EGP"
              , "42 جنيه مصري"
              , "42 جنيهات مصريه"
+             , "42 ج.م"
+             , "42 ج.م."
              ]
   , examples (simple QAR 42)
              [ "42 QAR"
diff --git a/Duckling/AmountOfMoney/AR/Rules.hs b/Duckling/AmountOfMoney/AR/Rules.hs
--- a/Duckling/AmountOfMoney/AR/Rules.hs
+++ b/Duckling/AmountOfMoney/AR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -52,6 +51,15 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
   }
 
+ruleEgpAbrreviation :: Rule
+ruleEgpAbrreviation = Rule
+  { name = "EGP abbreviation"
+  , pattern =
+    [ regex "ج[.]م[.]?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EGP
+  }
+
 ruleDinars :: Rule
 ruleDinars = Rule
   { name = "dinars"
@@ -391,6 +399,7 @@
   [ ruleUnitAmount
   , ruleCent
   , rulePounds
+  , ruleEgpAbrreviation
   , ruleDinars
   , ruleDirhams
   , ruleRiyals
diff --git a/Duckling/AmountOfMoney/BG/Corpus.hs b/Duckling/AmountOfMoney/BG/Corpus.hs
--- a/Duckling/AmountOfMoney/BG/Corpus.hs
+++ b/Duckling/AmountOfMoney/BG/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/AmountOfMoney/BG/Rules.hs b/Duckling/AmountOfMoney/BG/Rules.hs
--- a/Duckling/AmountOfMoney/BG/Rules.hs
+++ b/Duckling/AmountOfMoney/BG/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/AmountOfMoney/EN/AU/Corpus.hs b/Duckling/AmountOfMoney/EN/AU/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/AU/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/AU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple AUD 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple AUD 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple AUD 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple AUD 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple AUD 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/AU/Rules.hs b/Duckling/AmountOfMoney/EN/AU/Rules.hs
--- a/Duckling/AmountOfMoney/EN/AU/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/AU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -46,8 +50,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly AUD
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/BZ/Corpus.hs b/Duckling/AmountOfMoney/EN/BZ/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/BZ/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/BZ/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple Dollar 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple Dollar 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple Dollar 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple Dollar 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple Dollar 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/BZ/Rules.hs b/Duckling/AmountOfMoney/EN/BZ/Rules.hs
--- a/Duckling/AmountOfMoney/EN/BZ/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/BZ/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -48,8 +52,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly Dollar
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/CA/Corpus.hs b/Duckling/AmountOfMoney/EN/CA/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/CA/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/CA/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple CAD 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple CAD 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple CAD 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple CAD 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple CAD 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/CA/Rules.hs b/Duckling/AmountOfMoney/EN/CA/Rules.hs
--- a/Duckling/AmountOfMoney/EN/CA/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/CA/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -46,8 +50,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly CAD
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -11,12 +10,14 @@
 module Duckling.AmountOfMoney.EN.Corpus
   ( corpus
   , negativeCorpus
+  , latentCorpus
   ) where
 
 import Data.String
 import Prelude
 
 import Duckling.AmountOfMoney.Types
+import Duckling.Resolve (Options(..))
 import Duckling.Testing.Types
 
 negativeCorpus :: NegativeCorpus
@@ -29,6 +30,21 @@
 corpus :: Corpus
 corpus = (testContext, testOptions, allExamples)
 
+latentCorpus :: Corpus
+latentCorpus = (testContext, testOptions {withLatent = True}, xs)
+  where
+    xs = concat
+      [ examples (simple Unnamed 5)
+                 [ "five"
+                 , "5"
+                 , "about 5"
+                 ]
+      , examples (simple Unnamed 7.2)
+                 [ "7.2"
+                 , "7.20000"
+                 ]
+      ]
+
 allExamples :: [Example]
 allExamples = concat
   [ examples (simple Dollar 1)
@@ -59,6 +75,7 @@
              [ "USD3.14"
              , "3.14US$"
              , "US$ 3.14"
+             , "US$3 and fourteen"
              ]
   , examples (simple EUR 20)
              [ "20\x20ac"
@@ -98,7 +115,24 @@
              [ "GBP3.01"
              , "GBP 3.01"
              , "3 GBP 1 pence"
+             , "3 GBP and one"
              ]
+  , examples (simple CAD 3.03)
+             [ "CAD3.03"
+             , "CAD 3.03"
+             , "3 CAD 3 cents"
+             ]
+  , examples (simple CHF 3.04)
+             [ "CHF3.04"
+             , "CHF 3.04"
+             , "3 CHF 4 cents"
+             ]
+  , examples (simple CNY 3)
+             [ "CNY3"
+             , "CNY 3"
+             , "3 CNY"
+             , "3 yuan"
+             ]
   , examples (simple Unnamed 42)
              [ "42 bucks"
              , "around 42 bucks"
@@ -115,6 +149,12 @@
   , examples (simple EGP 42)
              [ "42 EGP"
              , "42 egyptianpound"
+             , "42 LE"
+             , "42 L.E"
+             , "42 l.e."
+             , "42 le"
+             , "42 geneh"
+             , "42 genihat masriya"
              ]
   , examples (simple QAR 42)
              [ "42 QAR"
@@ -186,11 +226,40 @@
              [ "under seven euros"
              , "less than 7 EUR"
              , "lower than 7€"
+             , "no more than 7 euros"
+             , "at most 7€"
              ]
   , examples (above Dollar 1.42)
              [ "more than 1 dollar and forty-two cents"
              , "at least $1.42"
              , "over 1.42 dollars"
              , "above a dollar and 42 cents"
+             , "no less than $1.42"
+             ]
+   , examples (simple INR 5e5)
+             [ "5 lakh rupees"
+             , "five lakhs rupees"
+             ]
+   , examples (between INR (7, 9e5))
+             [ "7-9 lakh rupees"
+             ]
+   , examples (simple INR 4e7)
+             [ "four crore rupees"
+             , "4 crores rupees"
+             ]
+   , examples (simple MNT 10)
+             [ "ten tugriks"
+             , "10 Tugrik"
+             , "10MNT"
+             ]
+   , examples (simple USD 4.7e9)
+             [ "US$4.7 billion"
+             , "a US$4.7 billion"
+             , "a US$ 4.7 billion"
+             ]
+  , examples (simple UAH 3.04)
+             [ "UAH3.04"
+             , "UAH 3.04"
+             , "3 UAH 4 kopiykas"
              ]
   ]
diff --git a/Duckling/AmountOfMoney/EN/GB/Corpus.hs b/Duckling/AmountOfMoney/EN/GB/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/GB/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/GB/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,25 @@
              ]
   , examples (simple GBP 10000)
              [ "10 grand"
+             ]
+  , examples (simple Dollar 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple Dollar 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple Dollar 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple Dollar 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/GB/Rules.hs b/Duckling/AmountOfMoney/EN/GB/Rules.hs
--- a/Duckling/AmountOfMoney/EN/GB/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/GB/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -46,8 +50,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly Dollar
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/IE/Corpus.hs b/Duckling/AmountOfMoney/EN/IE/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/IE/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/IE/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple Dollar 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple Dollar 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple Dollar 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple Dollar 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple Dollar 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/IE/Rules.hs b/Duckling/AmountOfMoney/EN/IE/Rules.hs
--- a/Duckling/AmountOfMoney/EN/IE/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/IE/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,14 +12,20 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
 
@@ -48,8 +53,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly Dollar
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/IN/Corpus.hs b/Duckling/AmountOfMoney/EN/IN/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/IN/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/IN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple Dollar 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple Dollar 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple Dollar 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple Dollar 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple Dollar 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/IN/Rules.hs b/Duckling/AmountOfMoney/EN/IN/Rules.hs
--- a/Duckling/AmountOfMoney/EN/IN/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/IN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -46,8 +50,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly Dollar
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/JM/Corpus.hs b/Duckling/AmountOfMoney/EN/JM/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/JM/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/JM/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,9 +26,28 @@
              ]
   , examples (simple JMD 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
              ]
+  , examples (simple JMD 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple JMD 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple JMD 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple JMD 0.05)
+             [ "nickel"
+             , "a nickel"
+             ]
   ]
-
 negativeExamples :: [Text]
 negativeExamples =
   [ "grand"
diff --git a/Duckling/AmountOfMoney/EN/JM/Rules.hs b/Duckling/AmountOfMoney/EN/JM/Rules.hs
--- a/Duckling/AmountOfMoney/EN/JM/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/JM/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -48,8 +52,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly JMD
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/NZ/Corpus.hs b/Duckling/AmountOfMoney/EN/NZ/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/NZ/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/NZ/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple NZD 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple NZD 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple NZD 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple NZD 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple NZD 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/NZ/Rules.hs b/Duckling/AmountOfMoney/EN/NZ/Rules.hs
--- a/Duckling/AmountOfMoney/EN/NZ/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/NZ/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -48,8 +52,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly NZD
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/PH/Corpus.hs b/Duckling/AmountOfMoney/EN/PH/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/PH/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/PH/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple Dollar 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple Dollar 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple Dollar 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple Dollar 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple Dollar 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/PH/Rules.hs b/Duckling/AmountOfMoney/EN/PH/Rules.hs
--- a/Duckling/AmountOfMoney/EN/PH/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/PH/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -48,8 +52,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) dollarCoins
+        Just . Token AmountOfMoney . withValue c $ Helpers.currencyOnly Dollar
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/Rules.hs b/Duckling/AmountOfMoney/EN/Rules.hs
--- a/Duckling/AmountOfMoney/EN/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -66,6 +65,24 @@
       _ -> Nothing
   }
 
+ruleEgpAbrreviation :: Rule
+ruleEgpAbrreviation = Rule
+  { name = "livre égyptienne"
+  , pattern =
+    [ regex "[lL].?[eE].?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EGP
+  }
+
+ruleEgpArabizi :: Rule
+ruleEgpArabizi = Rule
+  { name = "geneh"
+  , pattern =
+    [ regex "[Gg][eiy]*n[eiy]*h(at)?( m[aiey]?sr[eiy]+a?)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EGP
+  }
+
 ruleRiyals :: Rule
 ruleRiyals = Rule
   { name = "riyals"
@@ -111,6 +128,15 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly MYR
   }
 
+ruleHryvnia :: Rule
+ruleHryvnia = Rule
+  { name = "hryvnia"
+  , pattern =
+      [ regex "hryvnia" -- TODO: complete
+      ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly UAH
+  }
+
 ruleCent :: Rule
 ruleCent = Rule
   { name = "cent"
@@ -120,6 +146,15 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
 
+ruleKopiyka :: Rule
+ruleKopiyka = Rule
+  { name = "kopiyka"
+  , pattern =
+    [ regex "kopiy(ok|kas?)"
+    ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly Cent
+  }
+
 ruleBucks :: Rule
 ruleBucks = Rule
   { name = "bucks"
@@ -143,6 +178,47 @@
       _ -> Nothing
   }
 
+ruleAbsorbA :: Rule
+ruleAbsorbA = Rule
+  { name = "a <amount-of-money>"
+  , pattern =
+    [ regex "an?"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:Token AmountOfMoney fd:_) -> Just $ Token AmountOfMoney fd
+      _ -> Nothing
+  }
+
+ruleADollarCoin :: Rule
+ruleADollarCoin = Rule
+  { name = "a <dollar coin>"
+  , pattern =
+    [ regex "an?"
+    , Predicate isDollarCoin
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney fd:
+       _) -> Just . Token AmountOfMoney $ fd
+      _ -> Nothing
+  }
+
+ruleNumDollarCoins :: Rule
+ruleNumDollarCoins = Rule
+  { name = "X <dollar coins>"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate isDollarCoin
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = c}:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just d,
+                                             TAmountOfMoney.currency = cur}:
+       _) -> Just . Token AmountOfMoney $ withValue (c * d) $ currencyOnly cur
+      _ -> Nothing
+  }
+
 ruleIntersectAndXCents :: Rule
 ruleIntersectAndXCents = Rule
   { name = "intersect (and X cents)"
@@ -297,7 +373,7 @@
 ruleIntervalMax = Rule
   { name = "under/less/lower/no more than <amount-of-money>"
   , pattern =
-    [ regex "under|(less|lower|not? more) than"
+    [ regex "under|at most|(less|lower|not? more) than"
     , Predicate isSimpleAmountOfMoney
     ]
   , prod = \tokens -> case tokens of
@@ -312,7 +388,7 @@
 ruleIntervalMin = Rule
   { name = "over/above/at least/more than <amount-of-money>"
   , pattern =
-    [ regex "over|above|at least|more than"
+    [ regex "over|above|at least|(more|not? less) than"
     , Predicate isSimpleAmountOfMoney
     ]
   , prod = \tokens -> case tokens of
@@ -327,10 +403,14 @@
 rules =
   [ ruleUnitAmount
   , ruleACurrency
+  , ruleAbsorbA
   , ruleBucks
   , ruleCent
+  , ruleADollarCoin
+  , ruleNumDollarCoins
   , ruleDinars
   , ruleDirham
+  , ruleHryvnia
   , ruleIntersect
   , ruleIntersectAndNumeral
   , ruleIntersectAndXCents
@@ -341,7 +421,10 @@
   , ruleIntervalMin
   , ruleIntervalNumeralDash
   , ruleIntervalDash
+  , ruleKopiyka
   , ruleOtherPounds
+  , ruleEgpAbrreviation
+  , ruleEgpArabizi
   , rulePounds
   , rulePrecision
   , ruleRinggit
diff --git a/Duckling/AmountOfMoney/EN/TT/Corpus.hs b/Duckling/AmountOfMoney/EN/TT/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/TT/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/TT/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple TTD 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple TTD 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple TTD 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple TTD 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple TTD 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/TT/Rules.hs b/Duckling/AmountOfMoney/EN/TT/Rules.hs
--- a/Duckling/AmountOfMoney/EN/TT/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/TT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -48,8 +52,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly TTD
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/US/Corpus.hs b/Duckling/AmountOfMoney/EN/US/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/US/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/US/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple USD 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple USD 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple USD 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple USD 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple USD 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/US/Rules.hs b/Duckling/AmountOfMoney/EN/US/Rules.hs
--- a/Duckling/AmountOfMoney/EN/US/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/US/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -46,8 +50,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly USD
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
diff --git a/Duckling/AmountOfMoney/EN/ZA/Corpus.hs b/Duckling/AmountOfMoney/EN/ZA/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/ZA/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/ZA/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -27,6 +26,26 @@
              ]
   , examples (simple Dollar 10000)
              [ "10 grand"
+             , "two hundred thousand nickels"
+             ]
+  , examples (simple Dollar 1)
+             [ "four quarters"
+             , "ten dimes"
+             , "twenty nickels"
+             ]
+  , examples (simple Dollar 0.1)
+             [ "dime"
+             , "a dime"
+             , "two nickels"
+             ]
+  , examples (simple Dollar 0.25)
+             [ "quarter"
+             , "a quarter"
+             , "five nickels"
+             ]
+  , examples (simple Dollar 0.05)
+             [ "nickel"
+             , "a nickel"
              ]
   ]
 
diff --git a/Duckling/AmountOfMoney/EN/ZA/Rules.hs b/Duckling/AmountOfMoney/EN/ZA/Rules.hs
--- a/Duckling/AmountOfMoney/EN/ZA/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/ZA/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -13,17 +12,22 @@
   ( rules
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..))
 import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Regex.Types
 import Duckling.Types
 
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import qualified Duckling.AmountOfMoney.Helpers as Helpers
 import qualified Duckling.Numeral.Types as TNumeral
 
-
 ruleAGrand :: Rule
 ruleAGrand = Rule
   { name = "a grand"
@@ -48,8 +52,22 @@
       _ -> Nothing
   }
 
+ruleDollarCoin :: Rule
+ruleDollarCoin = Rule
+  { name = "dollar coin"
+  , pattern =
+    [ regex "(nickel|dime|quarter)s?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        c <- HashMap.lookup (Text.toLower match) Helpers.dollarCoins
+        Just . Token AmountOfMoney . withValue c $ currencyOnly Dollar
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAGrand
   , ruleGrand
+  , ruleDollarCoin
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -64,5 +63,19 @@
              [ "15 Pt"
              , "15pta"
              , "15Ptas"
+             ]
+  , examples (between Dollar (10, 20))
+             [ "entre 10 y 20 dólares"
+             , "de $10 y $20"
+             , "$10 - 20 dólares"
+             , "10 - 20 $"
+             ]
+  , examples (under Dollar 10)
+             [ "menos de 10 dólares"
+             , "no más de $10"
+             ]
+  , examples (above Dollar 10)
+             [ "no menos de 10 dólares"
+             , "más de $10"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -128,6 +127,114 @@
       _ -> Nothing
   }
 
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "de|entre"
+    , Predicate isPositive
+    , regex "a|y"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                                             TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just $ Token AmountOfMoney $ withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ regex "de|entre"
+    , Predicate isSimpleAmountOfMoney
+    , regex "a|y"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                                             TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                                             TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just $ Token AmountOfMoney $ withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                                             TAmountOfMoney.currency = c}:
+       _) | from < to->
+         Just $ Token AmountOfMoney $ withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                                             TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                                             TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just $ Token AmountOfMoney $ withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "less/no more than <amount-of-money>"
+  , pattern =
+    [ regex "menos de|no más de"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                                             TAmountOfMoney.currency = c}:
+       _) -> Just $ Token AmountOfMoney $ withMax to $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "no less/more than <amount-of-money>"
+  , pattern =
+    [ regex "más de|no menos de"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                                             TAmountOfMoney.currency = c}:
+       _) -> Just $ Token AmountOfMoney $ withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleUnitAmount
@@ -138,4 +245,10 @@
   , ruleIntersectAndXCents
   , ruleIntersectXCents
   , rulePounds
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , ruleIntervalMax
+  , ruleIntervalMin
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -205,7 +204,6 @@
        _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
       _ -> Nothing
   }
-
 
 rulePounds :: Rule
 rulePounds = Rule
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/AmountOfMoney/HE/Corpus.hs b/Duckling/AmountOfMoney/HE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/HE/Corpus.hs
@@ -0,0 +1,124 @@
+-- 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.
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.HE.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 HE Nothing }, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple ILS 10)
+             [ "עשר שקל"
+             , "עשרה שקלים"
+             , "עשר ש״ח"
+             , "עשר שח"
+             , "10₪"
+             ]
+  , examples (simple ILS 10000)
+             [ "עשר אלף שקל"
+             , "10000 שקלים"
+             , "10 אשח"
+             , "10 אש״ח"
+             ]
+  , examples (simple ILS 10000000)
+             [ "10 מיליון שקלים"
+             , "10 משח"
+             , "10 מש״ח"
+             ]
+  , examples (simple ILS 0.01)
+             [ "אגורה"
+             ]
+  , examples (simple ILS 1)
+             [ "שקל"
+             , "שקל אחד"
+             , "שקל בודד"
+             , "100 אגורות"
+             ]
+  , examples (simple ILS 0.05)
+             [ "חמש אגורות"
+             ]
+  , examples (simple ILS 0)
+             [ "אפס ש״ח"
+             ]
+  , examples (simple ILS 1.5)
+             [ "שקל וחצי"
+             , "1.5 ש״ח"
+             ]
+  , examples (simple ILS 2)
+             [ "שנקל"
+             , "2 שקל"
+             ]
+  , examples (simple Dollar 10)
+             [ "$10"
+             , "10$"
+             , "עשר דולר"
+             , "עשרה דולר"
+             , "עשרה דולרים"
+             , "עשר דולרים"
+             ]
+  , examples (simple Dollar 20)
+             [ "עשרים דולר"
+             ]
+  , examples (simple Dollar 2.23)
+             [ "2 דולר ו23 סנט"
+             ]
+  , examples (simple EUR 20)
+             [ "20€"
+             , "20 יורו"
+             , "EUR 20"
+             , "20 אירו"
+             ]
+  , examples (simple EUR 29.99)
+             [ "29.99 יורו"
+             ]
+  , examples (simple Pound 9)
+             [ "£9"
+             , "תשע פאונד"
+             ]
+  , examples (simple GBP 1)
+             [ "לירה שטרלינג"
+             ]
+  , examples (simple GBP 10)
+             [ "10 לירות שטרלינג"
+             ]
+  , examples (between Dollar (10, 20))
+             [ "מ10 עד 20 דולר"
+             , "מעשר עד עשרים דולר"
+             , "בין 10 ל20 דולר"
+             , "10$-20$"
+             , "10-20$"
+             , "10-20 דולר"
+             , "בין 10 דולר ל20 דולר"
+             ]
+  , examples (under EUR 7)
+             [ "פחות מ7 יורו"
+             , "עד 7 יורו"
+             , "לא יותר מ7 יורו"
+             , "מתחת ל7 יורו"
+             , "לא מעל 7 יורו"
+             ]
+  , examples (above Dollar 5)
+             [ "יותר מ5 דולר"
+             , "מעל 5 דולר"
+             , "מ5 דולר"
+             , "לא פחות מ5 דולר"
+             , "לא מתחת ל5 דולר"
+             ]
+    ]
diff --git a/Duckling/AmountOfMoney/HE/Rules.hs b/Duckling/AmountOfMoney/HE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/HE/Rules.hs
@@ -0,0 +1,348 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.AmountOfMoney.HE.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Data.String
+import Prelude
+
+import Duckling.AmountOfMoney.Helpers
+import Duckling.AmountOfMoney.Types
+  ( Currency(..)
+  , AmountOfMoneyData(..)
+  )
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+  ( isPositive
+  )
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleOneShekel :: Rule
+ruleOneShekel = Rule
+  { name    = "שקל"
+  , pattern = [regex "שקל( אחד| בודד)?"]
+  , prod    = \_ -> Just . Token AmountOfMoney $ withValue 1 $ currencyOnly ILS
+  }
+ruleTwoShekel :: Rule
+ruleTwoShekel = Rule
+  { name    = "שנקל"
+  , pattern = [regex "שנקל"]
+  , prod    = \_ -> Just . Token AmountOfMoney $ withValue 2 $ currencyOnly ILS
+  }
+ruleOneAgura :: Rule
+ruleOneAgura = Rule
+  { name    = "oneAgura"
+  , pattern = [regex "אגורה( אחת| בודדת)?"]
+  , prod    = \_ -> Just . Token AmountOfMoney $ withValue 0.01 $
+                    currencyOnly ILS
+  }
+ruleShekel :: Rule
+ruleShekel = Rule
+  { name    = "שקל"
+  , pattern = [regex "שקל(ים)?|ש״?ח"]
+  , prod    = \_ -> Just . Token AmountOfMoney $ currencyOnly ILS
+  }
+
+ruleThousandShekel :: Rule
+ruleThousandShekel = Rule
+    { name = "אש״ח"
+    , pattern =
+      [ Predicate isPositive
+      , regex "אש״?ח"
+      ]
+    , prod = \case
+        (Token Numeral NumeralData{TNumeral.value = v}:
+         _) -> Just . Token AmountOfMoney $ withValue (v*1000) $
+               currencyOnly ILS
+        _ -> Nothing
+    }
+
+ruleMillionShekel :: Rule
+ruleMillionShekel = Rule
+    { name = "מש״ח"
+    , pattern =
+      [ Predicate isPositive
+      , regex "מש״?ח"
+      ]
+    , prod = \case
+        (Token Numeral NumeralData{TNumeral.value = v}:
+         _) -> Just . Token AmountOfMoney $ withValue (v*1000000) $
+               currencyOnly ILS
+        _ -> Nothing
+    }
+ruleAgura :: Rule
+ruleAgura = Rule
+    { name = "multiple agura"
+    , pattern =
+      [ Predicate isPositive
+      , regex "אגורות"
+      ]
+    , prod = \case
+        (Token Numeral NumeralData{TNumeral.value = v}:
+         _) -> Just . Token AmountOfMoney $ withValue (v*0.01) $
+               currencyOnly ILS
+        _ -> Nothing
+    }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "ו"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just v,
+                  TAmountOfMoney.currency = c}:
+       _:
+       Token Numeral NumeralData { TNumeral.value = p }:
+       _) -> Just . Token AmountOfMoney $ withValue (v + p) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntersectAndXCents :: Rule
+ruleIntersectAndXCents = Rule
+  { name = "intersect (and X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "ו"
+    , Predicate isCents
+    ]
+  , prod = \case
+      (Token AmountOfMoney fd :
+       _ :
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just c }:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+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 "סנט(ים)?"
+      ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleEUR :: Rule
+ruleEUR = Rule
+  { name    = "€"
+  , pattern =
+    [ regex "אירו|יורו"
+    ]
+  , prod    = \_ -> Just . Token AmountOfMoney $ currencyOnly EUR
+  }
+ruleOneGBP :: Rule
+ruleOneGBP = Rule
+  { name = "OneGBP"
+  , pattern =
+    [ regex "לירה שטרלינג"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ withValue 1 $ currencyOnly GBP
+  }
+ruleGBP :: Rule
+ruleGBP = Rule
+  { name = "OneGBP"
+  , pattern =
+    [ regex "לירות שטרלינג"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly GBP
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <amount-of-money>"
+  , pattern =
+      [ regex "בערך|בדיוק|קרוב ל"
+      , Predicate isMoneyWithValue
+      ]
+  , prod = \case
+      (_:
+       token:
+       _) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+      [ regex "מ?|בין "
+      , Predicate isPositive
+      , regex "עד |ל"
+      , Predicate isSimpleAmountOfMoney
+      ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData { TNumeral.value = from }:
+       _:
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c }:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+      [ regex "מ?|בין "
+      , Predicate isSimpleAmountOfMoney
+      , regex "עד |ל"
+      , Predicate isSimpleAmountOfMoney
+      ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1 }:
+       _:
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2 }:
+       _) | from < to && c1 == c2 ->
+            Just . Token AmountOfMoney . withInterval (from, to) $
+              currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token Numeral NumeralData { TNumeral.value = from }:
+       _:
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c }:
+       _) | from < to -> Just . Token AmountOfMoney . withInterval (from, to) $
+            currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+      [ Predicate isSimpleAmountOfMoney
+      , regex "-"
+      , Predicate isSimpleAmountOfMoney
+      ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1 }:
+       _:
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2 }:
+       _) | from < to && c1 == c2 ->
+            Just . Token AmountOfMoney . withInterval (from, to) $
+              currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+      [ regex "פחות מ|עד|לא יותר מ|מתחת ל?|לא מעל"
+      , Predicate isSimpleAmountOfMoney
+      ]
+  , prod = \case
+      (_:
+       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 "יותר מ|מעל|מ|לא פחות מ|לא מתחת ל"
+      , Predicate isSimpleAmountOfMoney
+      ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData { TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c }:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleUnitAmount
+  , ruleCent
+  , ruleEUR
+  , ruleIntersectAndXCents
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePounds
+  , ruleOneGBP
+  , ruleGBP
+  , rulePrecision
+  , ruleIntersect
+  , ruleAgura
+  , ruleShekel
+  , ruleOneShekel
+  , ruleTwoShekel
+  , ruleOneAgura
+  , ruleThousandShekel
+  , ruleMillionShekel
+  , ruleDollar
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -24,11 +23,18 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (simple Dollar 10)
+  [ examples (simple Dollar 1)
+             [ "$1"
+             , "jedan dolar"
+             ]
+  , examples (simple Dollar 10)
              [ "$10"
              , "10$"
              , "deset dolara"
              ]
+  , examples (simple Cent 1)
+             [ "jedan cent"
+             ]
   , examples (simple Cent 10)
              [ "deset centa"
              ]
@@ -46,6 +52,9 @@
              , "2 dolara 23"
              , "dva dolara i 23"
              ]
+  , examples (simple HRK 1)
+             [ "jedna kuna"
+             ]
   , examples (simple HRK 2.23)
              [ "2 kune i 23 lipe"
              , "dvije kune 23 lipe"
@@ -62,6 +71,9 @@
              , "dvjesto kuna"
              , "dvjesta kuna"
              ]
+  , examples (simple EUR 1)
+             [ "jedan euro"
+             ]
   , examples (simple EUR 20)
              [ "20€"
              , "20 euros"
@@ -94,4 +106,28 @@
              [ "GBP3,01"
              , "GBP 3,01"
              ]
-  ]
+ , examples (between Dollar (100, 200))
+            [ "od 100 do 200 dolara"
+            , "od 100 dolara do 200 dolara"
+            , "otprilike 100 do 200 dolara"
+            , "otprilike 100 dolara do 200 dolara"
+            , "100 dolara - 200 dolara"
+            , "100-200 dolara"
+            , "oko 100-200 dolara"
+            , "u blizini 100-200 dolara"
+            , "skoro 100-200 dolara"
+            , "približno 100 do 200 dolara"
+            , "izmedju 100 i 200 dolara"
+            , "izmedju 100 dolara i 200 dolara"
+            ]
+  , examples (under EUR 7)
+             [ "manje od EUR 7"
+             , "ispod EUR 7"
+             ]
+  , examples (above Dollar 1.42)
+             [ "više od jednog dolara i četrdeset dva centa"
+             , "najmanje 1,42 dolara"
+             , "preko 1,42 dolara"
+             , "iznad 1,42 dolara"
+             ]
+ ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -29,6 +28,20 @@
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleACurrency :: Rule
+ruleACurrency = Rule
+  { name = "a <currency>"
+  , pattern =
+    [ regex "jed(an|na|no)"
+    , Predicate isCurrencyOnly
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney $ withValue 1 $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleUnitAmount :: Rule
 ruleUnitAmount = Rule
   { name = "<unit> <amount>"
@@ -198,9 +211,172 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AED
   }
 
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <amount-of-money>"
+  , pattern =
+    [ regex "oko|otprilike|u blizini|skoro|približno"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to->
+         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral1 :: Rule
+ruleIntervalBetweenNumeral1 = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "od|otprilike|približno"
+    , Predicate isPositive
+    , regex "do"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral2 :: Rule
+ruleIntervalBetweenNumeral2 = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "izmedju"
+    , Predicate isPositive
+    , regex "i"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween1 :: Rule
+ruleIntervalBetween1 = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ regex "od|otprilike"
+    , Predicate isSimpleAmountOfMoney
+    , regex "do"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalBetween2 :: Rule
+ruleIntervalBetween2 = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ regex "izmedju"
+    , Predicate isSimpleAmountOfMoney
+    , regex "i"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "over/above/at least/more than <amount-of-money>"
+  , pattern =
+    [ regex "više od|najmanje|preko|iznad"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+    [ regex "ispod|manje od"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
+      _ -> Nothing
+  }
+
+
 rules :: [Rule]
 rules =
-  [ ruleUnitAmount
+  [ ruleACurrency
+  , ruleUnitAmount
   , ruleDollar
   , rulePound
   , ruleOtherPounds
@@ -215,4 +391,13 @@
   , ruleKwd
   , ruleQar
   , ruleSar
+  , rulePrecision
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , ruleIntervalBetweenNumeral1
+  , ruleIntervalBetweenNumeral2
+  , ruleIntervalBetween1
+  , ruleIntervalBetween2
+  , ruleIntervalMin
+  , ruleIntervalMax
   ]
diff --git a/Duckling/AmountOfMoney/Helpers.hs b/Duckling/AmountOfMoney/Helpers.hs
--- a/Duckling/AmountOfMoney/Helpers.hs
+++ b/Duckling/AmountOfMoney/Helpers.hs
@@ -2,18 +2,19 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
-
+{-# LANGUAGE NamedFieldPuns #-}
 
 module Duckling.AmountOfMoney.Helpers
   ( currencyOnly
+  , valueOnly
   , isSimpleAmountOfMoney
   , isCent
   , isCents
+  , isDollarCoin
   , isCurrencyOnly
   , isDime
   , isMoneyWithValue
@@ -23,18 +24,42 @@
   , withMax
   , withMin
   , withValue
+  , mkLatent
+  , dollarCoins
   )
   where
 
+import Data.HashMap.Strict (HashMap)
 import Data.Maybe (isJust)
+import Data.String
+import Data.Text (Text)
 import Prelude
 
-import Duckling.AmountOfMoney.Types (Currency (..), AmountOfMoneyData (..))
+import Duckling.AmountOfMoney.Types
+  ( Currency (..)
+  , AmountOfMoneyData (..)
+  , amountOfMoneyData'
+  )
 import Duckling.Numeral.Types (getIntValue, isInteger)
 import Duckling.Dimensions.Types
 import Duckling.Types hiding (Entity(..))
 
+import qualified Data.HashMap.Strict as HashMap
+
 -- -----------------------------------------------------------------
+-- Dollar coin Types
+
+dollarCoins :: HashMap Text Double
+dollarCoins = HashMap.fromList
+  [ ("nickel", 0.05)
+  , ("nickels", 0.05)
+  , ("dime", 0.1)
+  , ("dimes", 0.1)
+  , ("quarter", 0.25)
+  , ("quarters", 0.25)
+  ]
+
+-- -----------------------------------------------------------------
 -- Patterns
 
 isCents :: Predicate
@@ -56,6 +81,12 @@
   {value = Nothing, minValue = Nothing, maxValue = Nothing}) = True
 isCurrencyOnly _ = False
 
+isDollarCoin :: Predicate
+isDollarCoin (Token AmountOfMoney AmountOfMoneyData{value = Just d, currency}) =
+  elem d [0.05, 0.1, 0.25] && elem currency [Dollar, AUD, CAD, JMD,
+                                             NZD,    SGD, TTD, USD]
+isDollarCoin _ = False
+
 isSimpleAmountOfMoney :: Predicate
 isSimpleAmountOfMoney (Token AmountOfMoney AmountOfMoneyData
   {value = Just _, minValue = Nothing, maxValue = Nothing}) = True
@@ -77,17 +108,19 @@
 -- Production
 
 currencyOnly :: Currency -> AmountOfMoneyData
-currencyOnly c = AmountOfMoneyData
-  {currency = c, value = Nothing, minValue = Nothing, maxValue = Nothing}
+currencyOnly c = amountOfMoneyData'{currency = c}
 
+valueOnly :: Double -> AmountOfMoneyData
+valueOnly x = amountOfMoneyData'{value = Just x}
+
 withValue :: Double -> AmountOfMoneyData -> AmountOfMoneyData
 withValue x fd = fd {value = Just x}
 
 withCents :: Double -> AmountOfMoneyData -> AmountOfMoneyData
 withCents x fd@AmountOfMoneyData {value = Just value} = fd
   {value = Just $ value + x / 100}
-withCents x AmountOfMoneyData {value = Nothing} = AmountOfMoneyData
-  {value = Just x, currency = Cent, minValue = Nothing, maxValue = Nothing}
+withCents x AmountOfMoneyData {value = Nothing} =
+  amountOfMoneyData'{value = Just x, currency = Cent}
 
 withInterval :: (Double, Double) -> AmountOfMoneyData -> AmountOfMoneyData
 withInterval (from, to) fd = fd
@@ -98,3 +131,6 @@
 
 withMax :: Double -> AmountOfMoneyData -> AmountOfMoneyData
 withMax x fd = fd {maxValue = Just x}
+
+mkLatent :: AmountOfMoneyData -> AmountOfMoneyData
+mkLatent fd = fd {latent = True}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -39,7 +38,7 @@
              [ "USD1,23"
              ]
   , examples (simple Dollar 2)
-             [ "2 dola"
+             [ "2 dolar"
              , "dua dolar"
              ]
   , examples (simple EUR 20)
@@ -79,5 +78,49 @@
              [ "10 yen"
              , "10¥"
              , "10 ¥."
+             ]
+  , examples (between Dollar(10, 20))
+             [ "antara 10 sampai 20 dolar"
+             , "dari 10 dolar sampai 20 dolar"
+             , "sekitar 10 sampai 20 dolar"
+             , "antara 10 hingga 20 dolar"
+             , "sekitar 10 dolar hingga 20 dolar"
+             , "kira-kira 10-20 dolar"
+             , "10-20 dolar"
+             ]
+  , examples (between IDR(1000, 10000))
+             [ "antara Rp1000 sampai Rp10000"
+             , "dari 1000 Rupiah hingga 10000 Rupiah"
+             , "sekitar 1000 sampai 10000 Rupiah"
+             , "1000-10000 Rupiah"
+             , "kira-kira Rp1000 sampai Rp10000"
+             , "dari Rp1.000 sampai Rp10.000"
+             , "antara 1.000 hingga 10.000 Rupiah"
+             , "kira-kira 1.000-10.000 Rupiah"
+             , "sekitar 1.000 hingga 10.000 Rupiah"
+             ]
+  , examples (under EUR 7)
+             [ "kurang dari 7 euro"
+             , "di bawah EUR 7"
+             , "tidak sampai 7 euro"
+             , "lebih murah dari EUR 7"
+             ]
+  , examples (under IDR 500)
+             [ "kurang dari 500 Rupiah"
+             , "tidak sampai Rp500"
+             , "di bawah Rp 500"
+             , "lebih murah dari 500 rupiah"
+             ]
+  , examples (above USD 1.42)
+             [ "di atas USD1,42"
+             , "lebih dari USD1,42"
+             , "melebihi USD1,42"
+             , "melewati USD1,42"
+             ]
+  , examples (above IDR 33000)
+             [ "di atas 33.000 Rupiah"
+             , "lebih dari Rp33000"
+             , "melebihi Rp33.000"
+             , "melewati 33000 rupiah"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -91,6 +90,126 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly JPY
   }
 
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <amount-of-money>"
+  , pattern =
+    [ regex "tepatnya|kira-kira|sekitar|hampir"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "sekitar|dari|antara"
+    , Predicate isPositive
+    , regex "sampai|hingga"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ regex "sekitar|dari|antara|kira-kira"
+    , Predicate isSimpleAmountOfMoney
+    , regex "sampai|hingga"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "\\-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "\\-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+    [ regex "(kurang|lebih murah) dari|tidak sampai|di bawah"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       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 "di atas|lebih dari|melebihi|melewati"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleUnitAmount
@@ -99,4 +218,11 @@
   , ruleIntersect
   , ruleJpy
   , rulePounds
+  , rulePrecision
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
   ]
diff --git a/Duckling/AmountOfMoney/IT/Corpus.hs b/Duckling/AmountOfMoney/IT/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/IT/Corpus.hs
@@ -0,0 +1,77 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.IT.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 IT Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Dollar 10)
+             [ "$10"
+             , "10$"
+             , "dieci dollari"
+             ]
+  , examples (simple Dollar 10000)
+             [ "$10.000"
+             , "10K$"
+             , "$10k"
+             , "10 000 dollari"
+             , "10 000,00 $"
+             ]
+  , examples (simple USD 1.23)
+             [ "USD1,23"
+             , "1 USD e 23 centesimi"
+             , "1 USD 23 centesimi"
+             ]
+  , examples (simple EUR 20)
+             [ "20€"
+             , "20 euro"
+             , "20 Euro"
+             , "20 Euro"
+             , "EUR 20"
+             ]
+  , examples (simple EUR 29.99)
+             [ "EUR29,99"
+             ]
+  , examples (simple Pound 9)
+             [ "nove sterline"
+             , "quasi nove sterline"
+             ]
+  , examples (simple GBP 3.01)
+             [ "GBP3,01"
+             , "GBP 3,01"
+             ]
+  , examples (between EUR (10, 20))
+             [ "tra 10 e 20 euro"
+             , "tra 10 euro e 20 euro"
+             , "10 - 20 euro"
+             , "10 euro - 20 euro"
+             ]
+  , examples (above EUR 10)
+             [ "almeno 10 euro"
+             , "più di 10 euro"
+             , "più di 10 euro"
+             ]
+  , examples (under Dollar 10)
+             [ "meno di 10 dollari"
+             , "non più di 10 dollari"
+             ]
+  ]
diff --git a/Duckling/AmountOfMoney/IT/Rules.hs b/Duckling/AmountOfMoney/IT/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/IT/Rules.hs
@@ -0,0 +1,270 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.IT.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.AmountOfMoney.Helpers
+import Duckling.AmountOfMoney.Types (Currency (..), AmountOfMoneyData (..))
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (isNatural, isPositive)
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Regex.Types (GroupMatch (..))
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntersectAndNumeral :: Rule
+ruleIntersectAndNumeral = Rule
+  { name = "intersect (and number)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "e"
+    , Predicate isNatural
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "precision"
+  , pattern =
+    [ regex "esattamente|quasi|più o meno|circa"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "cent(esim)i?o?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleIntersectXCents :: Rule
+ruleIntersectXCents = Rule
+  { name = "intersect (X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , Predicate isCents
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "tra"
+    , Predicate isPositive
+    , regex "e"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ regex "tra"
+    , Predicate isSimpleAmountOfMoney
+    , regex "e"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , 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, from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+    [ regex "(meno|non più) di"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , 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 "più di|almeno"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleCurrencies :: Rule
+ruleCurrencies = Rule
+  { name = "£, $"
+  , pattern =
+    [ regex "(dollari|sterline)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "dollari"  -> Just . Token AmountOfMoney $ currencyOnly Dollar
+        "sterline" -> Just . Token AmountOfMoney $ currencyOnly Pound
+        _          -> Nothing
+      _ -> Nothing
+  }
+
+ruleIntersectAndXCents :: Rule
+ruleIntersectAndXCents = Rule
+  { name = "intersect (and X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "e"
+    , Predicate isCents
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate isWithoutCents
+    , Predicate isNatural
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleUnitAmount
+  , ruleCent
+  , ruleIntersect
+  , ruleIntersectAndNumeral
+  , ruleIntersectAndXCents
+  , ruleIntersectXCents
+  , ruleIntervalBetween
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalDash
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleCurrencies
+  , rulePrecision
+  ]
diff --git a/Duckling/AmountOfMoney/KA/Corpus.hs b/Duckling/AmountOfMoney/KA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/KA/Corpus.hs
@@ -0,0 +1,136 @@
+-- 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.
+
+-- /Note/: All commented-out tests are failing due to https://github.com/facebook/duckling/issues/541
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.KA.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 KA Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Dollar 1)
+             [ "$1"
+             , "ერთი დოლარი"
+             , "1 დოლარი"
+             ]
+  , examples (simple Dollar 10)
+             [ "$10"
+             , "$ 10"
+             , "10$"
+             , "10 დოლარი"
+             , "ათი დოლარი"
+             ]
+  , examples (simple Cent 10)
+             [ "10 ცენტი"
+             , "ათი ცენტი"
+             , "10 c"
+             , "10¢"
+             ]
+  , examples (simple Dollar 1e4)
+             [ "$10K"
+             , "10k$"
+             , "$10,000"
+             ]
+  , examples (simple USD 3.14)
+             [ "USD3.14"
+             , "3.14US$"
+             , "US$ 3.14"
+             ]
+  , examples (simple EUR 20)
+             [ "20\x20ac"
+             , "20 ევრო"
+             , "EUR 20"
+             , "EUR 20.0"
+             , "20€"
+             , "20 €ur"
+             ]
+  , examples (simple Pound 10)
+             [ "\x00a3\&10"
+             , "ათი ფუნტი"
+             ]
+  , examples (simple Dollar 20.43)
+             [ "$20 და 43c"
+             , "20 დოლარი და 43c"
+             , "20 დოლარი 43 ცენტი"
+             , "ოცი დოლარი 43 ცენტი"
+             -- , "ოცი დოლარი და ორმოცდასამი ცენტი"
+             ]
+  , examples (simple GBP 3.01)
+             [ "GBP3.01"
+             , "GBP 3.01"
+             , "3 GBP 1 პენსი"
+             ]
+  , examples (simple KWD 42)
+             [ "42 KWD"
+             , "42 ქუვეითური დინარი"
+             ]
+  , examples (simple LBP 42)
+             [ "42 LBP"
+             , "42 ლიბანური ფუნტი"
+             ]
+  , examples (simple EGP 42)
+             [ "42 EGP"
+             , "42 ეგვიპტური ფუნტი"
+             ]
+  , examples (simple QAR 42)
+             [ "42 QAR"
+             , "42 კატარული რიალი"
+             ]
+  , examples (between Dollar (10, 20))
+             [ "დაახლოებით 10-20 დოლარი"
+             -- , "10 დოლარიდან 20 დოლარამდე"
+             -- , "10-დან 20 დოლარამდე"
+             , "გძეტა $10-$20"
+             , "10-20 დოლარი"
+             ]
+{-
+  , examples (between Dollar (1.1, 1.3))
+             [ "1.1-დან 1.3 დოლარამდე"
+             , "ერთი მთელი ერთი დოლარიდან ერთი მთელი სამ დოლარამდე"
+             ]
+  , examples (under EUR 7)
+             [ "7 ევრომდე"
+             , "7 ევროზე ნაკლები"
+             ]
+  , examples (above Dollar 1.42)
+             [ "1 დოლარი და 42 ცენტზე მეტი"
+             ]
+  , examples (between GEL (10, 20))
+             [ "დაახლოებით 10-20 ლარი"
+             , "10 ლარიდან 20 ლარამდე"
+             , "10-დან 20 ლარამდე"
+             , "გძეტა 10-20 ლარი"
+             , "10-20 ლარი"
+             ]
+  , examples (between GEL (1.1, 1.3))
+             [ "1.1-დან 1.3 ლარამდე"
+             , "ერთი მთელი ერთი ლარიდან ერთი მთელი სამ ლარამდე"
+             ]
+  , examples (under GEL 7)
+             [ "7 ლარამდე"
+             , "7 ლარზე ნაკლები"
+             ]
+  , examples (above GEL 1.42)
+             [ "1 ლარი და 42 თეთრზე მეტი"
+             ]
+  , examples (between GEL (1, 4))
+             [ "1ლარიდან 4ლარამდე"
+             ]
+-}
+  ]
diff --git a/Duckling/AmountOfMoney/KA/Rules.hs b/Duckling/AmountOfMoney/KA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/KA/Rules.hs
@@ -0,0 +1,347 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.KA.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.AmountOfMoney.Helpers
+import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (isNatural, isPositive)
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
+rulePounds :: Rule
+rulePounds = Rule
+  { name = "£"
+  , pattern =
+    [ regex "(გირვანქა )?სტერლინგი?ს?(ად)?თ?|(გირვანქა )?ფუნ?ტი?ს?(ად)?თ?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
+  }
+
+ruleOtherPounds :: Rule
+ruleOtherPounds = Rule
+  { name = "other pounds"
+  , pattern =
+    [ regex "(ეგვიპტური|ლიბანური) ?ფუნ?ტი?ს?(ად)?თ?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "ეგვიპტური" -> Just . Token AmountOfMoney $ currencyOnly EGP
+        "ლიბანური" -> Just . Token AmountOfMoney $ currencyOnly LBP
+        _          -> Nothing
+      _ -> Nothing
+  }
+
+ruleRiyals :: Rule
+ruleRiyals = Rule
+  { name = "riyals"
+  , pattern =
+    [ regex "(კატარული|საუდის არაბული) ?რიალი?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "კატარული" -> Just . Token AmountOfMoney $ currencyOnly QAR
+        "საუდის არაბული"  -> Just . Token AmountOfMoney $ currencyOnly SAR
+        _        -> Nothing
+      _ -> Nothing
+  }
+
+ruleDinars :: Rule
+ruleDinars = Rule
+  { name = "dinars"
+  , pattern =
+    [ regex "(ქუვეითური)? ?დინარი?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "ქუვეითური" -> Just . Token AmountOfMoney $ currencyOnly KWD
+        _         -> Nothing
+      _ -> Nothing
+  }
+
+ruleDirham :: Rule
+ruleDirham = Rule
+  { name = "დირჰემი"
+  , pattern =
+    [ regex "დირჰემი?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AED
+  }
+
+ruleRinggit :: Rule
+ruleRinggit = Rule
+  { name = "ringgit"
+  , pattern =
+    [ regex "(მალაიზი?ური? )?რინგიტი?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly MYR
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "ცენტი?ს?(ად)?თ?|თეთრი?ს?(ად)?თ?|პენსი?ს?(ად)?თ?|ევროცენტი?ს?(ად)?თ?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleLari :: Rule
+ruleLari = Rule
+  { name = "Lari"
+  , pattern =
+    [ regex "(ლარი?ს?(ად)?თ?)|GEL"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly GEL
+  }
+
+ruleDollars :: Rule
+ruleDollars = Rule
+  { name = "Dollars"
+  , pattern =
+    [ regex "დოლარი?ს?(ად)?თ?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
+  }
+
+ruleEuros :: Rule
+ruleEuros = Rule
+  { name = "Euros"
+  , pattern =
+    [ regex "ევრო?ს?დ?თ?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EUR
+  }
+
+ruleACurrency :: Rule
+ruleACurrency = Rule
+  { name = "a <currency>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _) -> Just . Token AmountOfMoney $ fd {TAmountOfMoney.value = Just 1}
+      _ -> Nothing
+  }
+
+ruleIntersectAndXCents :: Rule
+ruleIntersectAndXCents = Rule
+  { name = "intersect (and X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "და"
+    , Predicate isCents
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersectAndNumeral :: Rule
+ruleIntersectAndNumeral = Rule
+  { name = "intersect (and number)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "და"
+    , Predicate isNatural
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersectXCents :: Rule
+ruleIntersectXCents = Rule
+  { name = "intersect (X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , Predicate isCents
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <amount-of-money>"
+  , pattern =
+    [ regex "ზუსტად|იმენა|დაახლოებით|გძეტა"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-დან|დან"
+    , Predicate isSimpleAmountOfMoney
+    , regex "-ა?მდე|ა?მდე"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-დან|დან"
+    , Predicate isSimpleAmountOfMoney
+    , regex "-ა?მდე|ა?მდე"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to->
+         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-ა?მდე|ა?მდე|(-ზე|ზე) ნაკლები"
+    ]
+  , 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 =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-დან|დან|(-ზე|ზე) მეტი"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleUnitAmount
+  , ruleACurrency
+  , ruleDollars
+  , ruleCent
+  , ruleEuros
+  , ruleDinars
+  , ruleDirham
+  , ruleIntersectAndNumeral
+  , ruleIntersectAndXCents
+  , ruleIntersectXCents
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , ruleOtherPounds
+  , rulePounds
+  , rulePrecision
+  , ruleRinggit
+  , ruleRiyals
+  , ruleLari
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -75,5 +74,39 @@
              [ "십원"
              , "10원"
              , "10₩"
+             ]
+  , examples (between KRW (25000, 30000))
+             [ "25000 - 30000원"
+             , "25000원 - 30000원"
+             , "이만오천원 - 삼만원"
+             ]
+  , examples (above KRW 5000)
+             [ "5000원 이상"
+             , "5000원 초과"
+             , "오천원 이상"
+             , "오천원 초과"
+             ]
+  , examples (under KRW 10000)
+             [ "10000원 이하"
+             , "10000원 미만"
+             , "만원 이하"
+             , "만원 미만"
+             ]
+  , examples (between Dollar (10, 20))
+             [ "10 - 20 달러"
+             , "10달러 - 20달러"
+             , "십달러 - 이십달러"
+             ]
+  , examples (above Dollar 10)
+             [ "10달러 이상"
+             , "10달러 초과"
+             , "십달러 이상"
+             , "십달러 초과"
+             ]
+  , examples (under Dollar 10)
+             [ "10달러 이하"
+             , "10달러 미만"
+             , "십달러 이하"
+             , "십달러 미만"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -21,7 +20,7 @@
 import Duckling.Dimensions.Types
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
-import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
@@ -87,7 +86,7 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "cents?|센(트|츠)"
+    [ regex "센트"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
@@ -158,11 +157,108 @@
 ruleDirham = Rule
   { name = "dirham"
   , pattern =
-    [ regex "dirhams?"
+    [ regex "디르함"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AED
   }
 
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "에서"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (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 =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "부터"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (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 =
+    [ Predicate isNatural
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (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 =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (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 =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "미만|이하"
+    ]
+  , prod = \case
+      (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 =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "초과|이상"
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
+       _:
+       _) -> (Just (Token AmountOfMoney $ withMin to $ currencyOnly c))
+      _ -> Nothing
+  }
+
+
 rules :: [Rule]
 rules =
   [ ruleUnitAmount
@@ -178,4 +274,10 @@
   , ruleIntersectXCents
   , ruleKrw
   , rulePounds
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , ruleIntervalMax
+  , ruleIntervalMin
   ]
diff --git a/Duckling/AmountOfMoney/MN/Corpus.hs b/Duckling/AmountOfMoney/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/MN/Corpus.hs
@@ -0,0 +1,95 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.MN.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 MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple MNT 1)
+             [ "1 төг"
+             , "нэг төгрөг"
+             , "1 ₮"
+             , "1 төгрөг"
+             ]
+  , examples (simple MNT 10)
+             [ "10 төгрөг"
+             , "₮ 10"
+             , "10₮"
+             , "10MNT"
+             , "10төг"
+             , "10 төгрөг"
+             , "төгрөг 10"
+             , "10 төгрөгийн"
+             ]
+  , examples (simple Dollar 1)
+             [ "$1"
+             , "нэг доллар"
+             ]
+  , examples (simple Dollar 10)
+             [ "$10"
+             , "$ 10"
+             , "10$"
+             , "10 доллар"
+             , "арван доллар"
+             ]
+  , examples (simple Cent 10)
+             [ "10 цент"
+             , "арван пени"
+             , "арван цент"
+             , "10 c"
+             , "10¢"
+             ]
+  , examples (simple EUR 20)
+             [ "20€"
+             , "20 €ur"
+             , "20 евро"
+             , "Евро 20"
+             ]
+  , examples (simple Pound 10)
+             [ "\x00a3\&10"
+             , "арван фунт"
+             ]
+  , examples (simple INR 20)
+             [ "20Rs"
+             , "Rs20"
+             ]
+  , examples (simple GBP 3.01)
+             [ "GBP3.01"
+             , "GBP 3.01"
+             , "3.01 Английн фунт"
+             ]
+  , examples (under MNT 10)
+             [ "10₮-c бага"
+             ]
+  , examples (above MNT 20)
+             [ "20MNT-c их"
+             ]
+  , examples (between MNT (5, 10))
+             [ "5-c MNT10 хүртэл"
+             , "5-c ₮10 хүртэл"
+             , "5-c 10 MNT хүртэл"
+             , "MNT5-c 10 хүртэл"
+             , "MNT5-c 10₮ хооронд"
+             , "5-c ₮10-н хооронд"
+             , "MNT5-c 10₮-н хүртэл"
+             ]
+  ]
diff --git a/Duckling/AmountOfMoney/MN/Rules.hs b/Duckling/AmountOfMoney/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/MN/Rules.hs
@@ -0,0 +1,260 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.MN.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Data.String
+import Prelude
+
+import Duckling.AmountOfMoney.Helpers
+import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData(..))
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (isNatural, isPositive)
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleTugriks :: Rule
+ruleTugriks = Rule
+  { name = "төг"
+  , pattern =
+    [ regex "төг(рөг(ийн)?)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly MNT
+  }
+
+rulePounds :: Rule
+rulePounds = Rule
+  { name = "£"
+  , pattern =
+    [ regex "фунт(аар|тай|аас)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
+  }
+
+ruleGBP :: Rule
+ruleGBP = Rule
+  { name = "Mongolian GBP"
+  , pattern =
+    [ regex "Английн\\s+фунт"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly GBP
+  }
+
+ruleDollar :: Rule
+ruleDollar = Rule
+  { name = "$"
+  , pattern =
+    [ regex "доллар(ын|оор|оос|той)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "цент(ийн|ээс|ээр|тэй)?|пени|пенс(ээр|гээр|тэй|ээс|гээс)?|ц"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleEUR :: Rule
+ruleEUR = Rule
+  { name = "€"
+  , pattern =
+    [ regex "евро"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EUR
+  }
+
+ruleBucks :: Rule
+ruleBucks = Rule
+  { name = "bucks"
+  , pattern =
+    [ regex "бакс(аар|тай|аас)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Unnamed
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <amount-of-money>"
+  , pattern =
+    [ regex "яг|ойролцоогоор|бараг"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-c"
+    , Predicate isSimpleAmountOfMoney
+    , regex "(-н\\s+)?(хооронд|хүртэл)"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral2 :: Rule
+ruleIntervalBetweenNumeral2 = Rule
+  { name = "between|from <amount-of-money> to|and <numeral>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-c"
+    , Predicate isNatural
+    , regex "(-н\\s+)?(хооронд|хүртэл)"
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = to}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <amount-of-money> to|and <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-c"
+    , Predicate isSimpleAmountOfMoney
+    , regex "(-н\\s+)?(хооронд|хүртэл)"
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-c\\s+(бага|доогуур|ихгүй)"
+    ]
+  , prod = \case
+      (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 =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-c\\s+(их|дээгүүр|илүү)"
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleUnitAmount
+  , ruleBucks
+  , ruleCent
+  , ruleDollar
+  , ruleEUR
+  , ruleGBP
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetweenNumeral2
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePounds
+  , rulePrecision
+  , ruleTugriks
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -46,12 +45,479 @@
              , "10kr"
              , "ti kroner"
              , "10 NOK"
+             , "ti norske kroner"
              ]
+  , examples (simple SEK 10)
+             [ "10kronor"
+             , "10 svenske kroner"
+             , "10 svenske kr"
+             , "10 svenske kronor"
+             , "ti kronor"
+             ]
+  , examples (simple DKK 10)
+             [ "10 danske kroner"
+             , "ti danske kroner"
+             , "ti danske kr"
+             ]
+  , examples (simple AUD 10)
+             [ "10 australske dollar"
+             , "10 australske dollars"
+             ]
+  , examples (simple CAD 10)
+             [ "10 kanadiske dollar"
+             , "10 kanadiske dollars"
+             , "10 canadiske dollar"
+             , "10 canadiske dollars"
+             ]
+  , examples (simple CHF 10)
+             [ "10 sveitsiske franc"
+             , "10 sveitsiske francs"
+             ]
+  , examples (simple CNY 10)
+             [ "10 yuan"
+             , "10 kinesiske yuan"
+             , "10 kinesisk yuan"
+             , "10 renminbi"
+             , "10 kinesiske renminbi"
+             , "10 kinesisk renminbi"
+             ]
+  , examples (simple CZK 10)
+             [ "10 koruna"
+             , "10 tsjekkiske koruna"
+             ]
+  , examples (simple INR 10)
+             [ "10 rupi"
+             , "10 rupier"
+             , "10 rupee"
+             , "10 rupees"
+             , "10 indisk rupi"
+             , "10 indiske rupi"
+             , "10 indiske rupee"
+             , "10 indiske rupees"
+             , "10 indiske rupier"
+             , "10 indisk rupier"
+             , "ti rupi"
+             , "ti rupier"
+             , "ti indisk rupi"
+             , "ti indiske rupi"
+             , "ti indiske rupee"
+             , "ti indiske rupees"
+             , "ti indiske rupier"
+             , "ti indisk rupier"
+             ]
+  , examples (simple JPY 10)
+             [ "10 japanske yen"
+             , "10 yen"
+             , "ti japanske yen"
+             , "ti yen"
+             ]
+  , examples (simple PKR 10)
+             [ "10 pakistansk rupi"
+             , "10 pakistanske rupi"
+             , "10 pakistanske rupee"
+             , "10 pakistanske rupees"
+             , "10 pakistanske rupier"
+             , "10 pakistansk rupier"
+             , "ti pakistansk rupi"
+             , "ti pakistanske rupi"
+             , "ti pakistanske rupee"
+             , "ti pakistanske rupees"
+             , "ti pakistanske rupier"
+             , "ti pakistansk rupier"
+             ]
+  , examples (simple PLN 10)
+             [ "10 zloty"
+             , "10 sloty"
+             , "10 polske zloty"
+             , "10 polske sloty"
+             , "ti zloty"
+             , "ti sloty"
+             , "ti polske zloty"
+             , "ti polske sloty"
+             ]
+  , examples (simple SGD 10)
+             [ "10 singapore dollar"
+             , "10 singapore dollars"
+             , "10 singaporske dollar"
+             , "10 singaporske dollars"
+             , "ti singapore dollar"
+             , "ti singapore dollars"
+             , "ti singaporske dollar"
+             , "ti singaporske dollars"
+             ]
+  , examples (simple THB 10)
+             [ "10 bhat"
+             , "10 thai baht"
+             , "10 thai bhat"
+             , "10 thailand baht"
+             , "10 thailand bhat"
+             , "10 thailandske baht"
+             , "10 thailandske bhat"
+             , "ti baht"
+             , "ti bhat"
+             , "ti thai baht"
+             , "ti thai bhat"
+             , "ti thailand baht"
+             , "ti thailand bhat"
+             , "ti thailandske baht"
+             , "ti thailandske bhat"
+             ]
+  , examples (simple ZAR 10)
+             [ "10 rand"
+             , "10 sørafrikanske rand"
+             , "10 sør-afrikanske rand"
+             , "10 rand"
+             , "10 sørafrikanske rand"
+             , "10 sør-afrikanske rand"
+             , "ti rand"
+             , "ti sørafrikanske rand"
+             , "ti sør-afrikanske rand"
+             ]
   , examples (simple NOK 2.23)
              [ "2 kroner og 23 øre"
              , "to kroner 23 øre"
              , "to kroner og 23 øre"
              , "to kr 23"
+             ]
+  , examples (simple SEK 2.23)
+             [ "2 kronor og 23 öre"
+             , "to kronor 23 öre"
+             , "to svenske kronor 23 öre"
+             , "to svenske kroner 23 öre"
+             , "to svenske kroner 23 øre"
+             , "to kronor og 23 öre"
+             , "to svenske kronor og 23 öre"
+             , "to svenske kroner og 23 öre"
+             , "to svenske kroner og 23 øre"
+             , "to svensk kroner og 23 øre"
+             ]
+  , examples (simple DKK 2.23)
+             [ "2 danske kroner og 23 øre"
+             , "to danske kroner 23 øre"
+             , "to danske kroner og 23 øre"
+             , "to danske kr 23"
+             , "to dansk kr 23"
+             ]
+  , examples (simple USD 2.23)
+             [ "2 amerikanske dollar og 23 cent"
+             , "2 amerikanske dollars og 23 cent"
+             , "2 amerikanske dollar og 23 cents"
+             , "2 amerikanske dollars og 23 cents"
+             , "to amerikanske dollar 23 cent"
+             , "to amerikanske dollars 23 cent"
+             , "to amerikanske dollar 23 cents"
+             , "to amerikanske dollars 23 cents"
+             , "to amerikanske dollar og 23 cent"
+             , "to amerikanske dollars og 23 cent"
+             , "to amerikanske dollar og 23 cents"
+             , "to amerikanske dollars og 23 cents"
+             , "to amerikanske dollar 23"
+             , "to amerikanske dollars 23"
+             ]
+  , examples (simple AUD 2.23)
+             [ "2 australske dollar og 23 cent"
+             , "2 australske dollars og 23 cent"
+             , "2 australske dollar og 23 cents"
+             , "2 australske dollars og 23 cents"
+             , "to australske dollar 23 cent"
+             , "to australske dollars 23 cent"
+             , "to australske dollar 23 cents"
+             , "to australske dollars 23 cents"
+             , "to australske dollar og 23 cent"
+             , "to australske dollars og 23 cent"
+             , "to australske dollar og 23 cents"
+             , "to australske dollars og 23 cents"
+             , "to australske dollar 23"
+             , "to australske dollars 23"
+             ]
+  , examples (simple CAD 2.23)
+             [ "2 kanadiske dollar og 23 cent"
+             , "2 kanadiske dollars og 23 cent"
+             , "2 canadiske dollar og 23 cent"
+             , "2 canadiske dollars og 23 cent"
+             , "2 kanadiske dollar og 23 cents"
+             , "2 kanadiske dollars og 23 cents"
+             , "2 canadiske dollar og 23 cents"
+             , "2 canadiske dollars og 23 cents"
+             , "to kanadiske dollar 23 cent"
+             , "to kanadiske dollars 23 cent"
+             , "to canadiske dollar 23 cent"
+             , "to canadiske dollars 23 cent"
+             , "to kanadiske dollar 23 cents"
+             , "to kanadiske dollars 23 cents"
+             , "to canadiske dollar 23 cents"
+             , "to canadiske dollars 23 cents"
+             , "to kanadiske dollar og 23 cent"
+             , "to kanadiske dollars og 23 cent"
+             , "to canadiske dollar og 23 cent"
+             , "to canadiske dollars og 23 cent"
+             , "to kanadiske dollar og 23 cents"
+             , "to kanadiske dollars og 23 cents"
+             , "to canadiske dollar og 23 cents"
+             , "to canadiske dollars og 23 cents"
+             , "to kanadiske dollar 23"
+             , "to kanadiske dollars 23"
+             , "to canadiske dollar 23"
+             , "to canadiske dollars 23"
+             ]
+  , examples (simple CHF 2.23)
+             [ "2 sveitsiske franc og 23 rappen"
+             , "2 sveitsiske francs og 23 rappen"
+             , "2 sveitsiske franc og 23 rp"
+             , "2 sveitsiske francs og 23 rp"
+             , "2 sveitsiske franc og 23 centime"
+             , "2 sveitsiske francs og 23 centime"
+             , "2 sveitsiske franc og 23 c"
+             , "2 sveitsiske francs og 23 c"
+             , "2 sveitsiske franc og 23 centesimo"
+             , "2 sveitsiske francs og 23 centesimo"
+             , "2 sveitsiske franc og 23 ct"
+             , "2 sveitsiske francs og 23 ct"
+             , "2 sveitsiske franc og 23 rap"
+             , "2 sveitsiske francs og 23 rap"
+             , "to sveitsiske franc 23 rappen"
+             , "to sveitsiske francs 23 rappen"
+             , "to sveitsiske franc 23 rp"
+             , "to sveitsiske francs 23 rp"
+             , "to sveitsiske franc 23 centime"
+             , "to sveitsiske francs 23 centime"
+             , "to sveitsiske franc 23 c"
+             , "to sveitsiske francs 23 c"
+             , "to sveitsiske franc 23 centesimo"
+             , "to sveitsiske francs 23 centesimo"
+             , "to sveitsiske franc 23 ct"
+             , "to sveitsiske francs 23 ct"
+             , "to sveitsiske franc 23 rap"
+             , "to sveitsiske francs 23 rap"
+             , "to sveitsiske franc og 23 rappen"
+             , "to sveitsiske francs og 23 rappen"
+             , "to sveitsiske franc og 23 rp"
+             , "to sveitsiske francs og 23 rp"
+             , "to sveitsiske franc og 23 centime"
+             , "to sveitsiske francs og 23 centime"
+             , "to sveitsiske franc og 23 c"
+             , "to sveitsiske francs og 23 c"
+             , "to sveitsiske franc og 23 centesimo"
+             , "to sveitsiske francs og 23 centesimo"
+             , "to sveitsiske franc og 23 ct"
+             , "to sveitsiske francs og 23 ct"
+             , "to sveitsiske franc og 23 rap"
+             , "to sveitsiske francs og 23 rap"
+             , "to sveitsiske franc 23"
+             , "to sveitsiske francs 23"
+             ]
+  , examples (simple CNY 2.23)
+             [ "2 yuan og 23 fen"
+             , "2 kinesiske yuan og 23 fen"
+             , "2 renminbi og 23 fen"
+             , "2 kinesiske renminbi og 23 fen"
+             , "to yuan 23 fen"
+             , "to kinesiske yuan 23 fen"
+             , "to renminbi 23 fen"
+             , "to kinesiske renminbi 23 fen"
+             , "to yuan og 23 fen"
+             , "to kinesiske yuan og 23 fen"
+             , "to renminbi og 23 fen"
+             , "to kinesiske renminbi og 23 fen"
+             , "to yuan 23"
+             , "to kinesiske yuan 23"
+             , "to renminbi 23"
+             , "to kinesiske renminbi 23"
+             ]
+  , examples (simple CZK 2.23)
+             [ "2 koruna og 23 haleru"
+             , "2 tsjekkiske koruna og 23 haleru"
+             , "to koruna 23 haleru"
+             , "to tsjekkiske koruna 23 haleru"
+             , "to koruna og 23 haleru"
+             , "to tsjekkiske koruna og 23 haleru"
+             , "to koruna 23"
+             , "to tsjekkiske koruna 23"
+             ]
+  , examples (simple HKD 2.23)
+             [ "2 hong kong dollar og 23 cent"
+             , "2 hong kong dollar og 23 cents"
+             , "2 hong kong dollars og 23 cent"
+             , "2 hong kong dollars og 23 cents"
+             , "2 hong kong dollar og 23 cents"
+             , "2 hong kong dollars og 23 cents"
+             , "to hong kong dollar 23 cent"
+             , "to hong kong dollars 23 cent"
+             , "to hong kong dollar 23 cents"
+             , "to hong kong dollars 23 cents"
+             , "to hong kong dollar og 23 cent"
+             , "to hong kong dollars og 23 cent"
+             , "to hong kong dollar og 23 cents"
+             , "to hong kong dollars og 23 cents"
+             , "to hong kong dollar 23"
+             , "to hong kong dollars 23"
+             ]
+  , examples (simple INR 2.23)
+             [ "2 indiske rupi og 23 paise"
+             , "2 indiske rupier og 23 paise"
+             , "to indiske rupi 23 paise"
+             , "to indiske rupier 23 paise"
+             , "to indiske rupier 23 paise"
+             , "to indiske rupi og 23 paise"
+             , "to indiske rupier og 23 paise"
+             , "to indiske rupi 23"
+             , "to indiske rupier 23"
+             ]
+  , examples (simple NZD 2.23)
+             [ "2 new zealand dollar og 23 cent"
+             , "2 new zealand dollars og 23 cent"
+             , "2 new zealand dollars og 23 cents"
+             , "2 new zealandske dollar og 23 cent"
+             , "2 new zealandske dollars og 23 cent"
+             , "2 new zealandske dollars og 23 cents"
+             , "2 new zealand dollar og 23 cents"
+             , "2 new zealand dollars og 23 cents"
+             , "2 nz dollar og 23 cents"
+             , "2 nz dollars og 23 cents"
+             , "to new zealand dollar 23 cent"
+             , "to new zealand dollars 23 cent"
+             , "to new zealand dollars 23 cents"
+             , "to new zealandske dollar 23 cent"
+             , "to new zealandske dollars 23 cent"
+             , "to new zealandske dollars 23 cents"
+             , "to new zealand dollar 23 cents"
+             , "to new zealand dollars 23 cents"
+             , "to new zealand dollars 23 cent"
+             , "to new zealand dollar og 23 cent"
+             , "to new zealand dollars og 23 cent"
+             , "to new zealandske dollar og 23 cent"
+             , "to new zealandske dollars og 23 cent"
+             , "to new zealandske dollars og 23 cents"
+             , "to new zealand dollar og 23 cents"
+             , "to new zealand dollars og 23 cent"
+             , "to new zealand dollars og 23 cents"
+             , "to new zealand dollar 23"
+             , "to new zealand dollars 23"
+             , "to new zealandske dollar 23"
+             , "to new zealandske dollars 23"
+             , "to nz dollar 23"
+             , "to nz dollars 23"
+             ]
+  , examples (simple PLN 2.23)
+             [ "2 zloty og 23 groszy"
+             , "2 sloty og 23 groszy"
+             , "2 polske zloty og 23 groszy"
+             , "2 polske sloty og 23 groszy"
+             , "to zloty 23 groszy"
+             , "to sloty 23 groszy"
+             , "to polske zloty 23 groszy"
+             , "to polske sloty 23 groszy"
+             , "to zloty og 23 groszy"
+             , "to sloty og 23 groszy"
+             , "to polske zloty og 23 groszy"
+             , "to polske sloty og 23 groszy"
+             , "to zloty 23"
+             , "to sloty 23"
+             , "to polske zloty 23"
+             , "to polske sloty 23"
+             ]
+  , examples (simple SGD 2.23)
+             [ "2 singapore dollar og 23 cent"
+             , "2 singapore dollars og 23 cent"
+             , "2 singaporske dollar og 23 cent"
+             , "2 singaporske dollars og 23 cent"
+             , "2 singapore dollar og 23 cents"
+             , "2 singapore dollars og 23 cents"
+             , "to singapore dollar 23 cent"
+             , "to singapore dollars 23 cent"
+             , "to singaporske dollar 23 cent"
+             , "to singaporske dollars 23 cent"
+             , "to singapore dollar 23 cents"
+             , "to singapore dollars 23 cents"
+             , "to singapore dollar og 23 cent"
+             , "to singapore dollars og 23 cent"
+             , "to singaporske dollar og 23 cent"
+             , "to singaporske dollars og 23 cent"
+             , "to singapore dollar og 23 cents"
+             , "to singapore dollars og 23 cents"
+             , "to singapore dollar 23"
+             , "to singapore dollars 23"
+             , "to singaporske dollar 23"
+             , "to singaporske dollars 23"
+             ]
+  , examples (simple ZAR 2.23)
+             [ "2 rand og 23 cent"
+             , "2 sørafrikanske rand og 23 cent"
+             , "2 sørafrikanske rand og 23 cents"
+             , "2 sør-afrikanske rand og 23 cent"
+             , "2 sør-afrikanske rand og 23 cents"
+             , "to rand 23 cent"
+             , "to sørafrikanske rand 23 cent"
+             , "to sørafrikanske rand 23 cents"
+             , "to sør-afrikanske rand 23 cent"
+             , "to sør-afrikanske rand 23 cents"
+             , "to rand og 23 cent"
+             , "to sørafrikanske rand og 23 cent"
+             , "to sørafrikanske rand og 23 cents"
+             , "to sør-afrikanske rand og 23 cent"
+             , "to sør-afrikanske rand og 23 cents"
+             , "to rand 23"
+             , "to sørafrikanske rand 23"
+             , "to sør-afrikanske rand 23"
+             ]
+  , examples (simple THB 2.23)
+             [ "2 baht og 23 satang"
+             , "2 bhat og 23 satang"
+             , "2 thai baht og 23 satang"
+             , "2 thai bhat og 23 satang"
+             , "2 thailandske baht og 23 satang"
+             , "2 thailandske bhat og 23 satang"
+             , "to baht 23 satang"
+             , "to bhat 23 satang"
+             , "to thai baht 23 satang"
+             , "to thai bhat 23 satang"
+             , "to thailandske baht 23 satang"
+             , "to thailandske bhat 23 satang"
+             , "to baht og 23 satang"
+             , "to bhat og 23 satang"
+             , "to thai baht og 23 satang"
+             , "to thai bhat og 23 satang"
+             , "to thailandske baht og 23 satang"
+             , "to thailandske bhat og 23 satang"
+             , "to baht 23"
+             , "to bhat 23"
+             , "to thai baht 23"
+             , "to thai bhat 23"
+             , "to thailandske baht 23"
+             , "to thailandske bhat 23"
+             ]
+  , examples (simple Cent 10)
+             [ "ti cent"
+             , "ti cents"
+             , "ti pence"
+             , "ti penny"
+             , "ti pennies"
+             , "10 cent"
+             , "10 cents"
+             , "10 cents"
+             , "10 pence"
+             , "10 penny"
+             , "10 øre"
+             , "10 ører"
+             , "10 öre"
+             , "10 örer"
+             , "10 p"
+             , "10 c"
+             , "10 fen"
+             , "10 haleru"
+             , "10 groszy"
+             , "10 paise"
+             , "10 paisa"
+             , "10 centesimo"
+             , "10 centesimi"
+             , "10 centime"
+             , "10 centimes"
+             , "10 ct"
+             , "10 rap"
+             , "10 rappen"
+             , "10 rappens"
+             , "10 rp"
+             , "10 satang"
              ]
   , examples (simple EUR 20)
              [ "20€"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -37,7 +36,7 @@
   , prod = \case
       (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
        Token Numeral NumeralData{TNumeral.value = v}:
-       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+       _) -> Just $ Token AmountOfMoney . withValue v $ currencyOnly c
       _ -> Nothing
   }
 
@@ -49,11 +48,11 @@
     , regex "og"
     , Predicate isNatural
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        _:
        Token Numeral NumeralData{TNumeral.value = c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
       _ -> Nothing
   }
 
@@ -64,7 +63,7 @@
     [ regex "omtrent|cirka|rundt|ca"
     , Predicate isMoneyWithValue
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (_:token:_) -> Just token
       _ -> Nothing
   }
@@ -73,9 +72,10 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "cents?|penn(y|ies)|(ø)re"
+    [ regex "cent(?:\\b|s)|\\bc\\b|pen(?:ce|ny|nies)|\\bp\\b|(?:ø|ö)rer?|fen|haleru|groszy|pais(?:e|a)\
+           \|centesim(?:o|i)|centimes?|\\bct?\\b|\\brp?\\b|rap(?:pen)?s?|satang"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly Cent
   }
 
 ruleIntersectXCents :: Rule
@@ -85,26 +85,10 @@
     [ Predicate isWithoutCents
     , Predicate isCents
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
-      _ -> Nothing
-  }
-
-ruleIntersectXCentsWithAnd :: Rule
-ruleIntersectXCentsWithAnd = Rule
-  { name = "intersect (X cents) with and"
-  , pattern =
-    [ Predicate isWithoutCents
-    , regex "og"
-    , Predicate isCents
-    ]
-  , prod = \tokens -> case tokens of
-      (Token AmountOfMoney fd:
-       _:
-       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
       _ -> Nothing
   }
 
@@ -112,18 +96,18 @@
 ruleNok = Rule
   { name = "NOK"
   , pattern =
-    [ regex "kr(oner)?"
+    [ regex "(?:norske? ?)?kr(?:oner?)?"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly NOK
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly NOK
   }
 
 rulePound :: Rule
 rulePound = Rule
   { name = "£"
   , pattern =
-    [ regex "pund?"
+    [ regex "po?und?s?"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly Pound
   }
 
 ruleIntersectAndXCents :: Rule
@@ -134,11 +118,11 @@
     , regex "og"
     , Predicate isCents
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        _:
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
       _ -> Nothing
   }
 
@@ -149,10 +133,10 @@
     [ Predicate isWithoutCents
     , Predicate isNatural
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        Token Numeral NumeralData{TNumeral.value = c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
       _ -> Nothing
   }
 
@@ -162,9 +146,171 @@
   , pattern =
     [ regex "dirhams?"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AED
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly AED
   }
 
+ruleSEK :: Rule
+ruleSEK = Rule
+  { name = "SEK"
+  , pattern =
+    [ regex "(?:svenske? )?kron(?:a|or)|svenske? kr(?:oner?)?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly SEK
+  }
+
+ruleGBP :: Rule
+ruleGBP = Rule
+  { name = "GBP"
+  , pattern =
+    [ regex "(?:britiske?|engelske?) po?unds?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly GBP
+  }
+
+ruleDKK :: Rule
+ruleDKK = Rule
+  { name = "DKK"
+  , pattern =
+    [ regex "danske? kr(?:oner?)?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly DKK
+  }
+
+ruleUSD :: Rule
+ruleUSD = Rule
+  { name = "USD"
+  , pattern =
+    [ regex "amerikanske? dollars?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly USD
+  }
+
+ruleAUD :: Rule
+ruleAUD = Rule
+  { name = "AUD"
+  , pattern =
+    [ regex "australske? dollars?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly AUD
+  }
+
+ruleCAD :: Rule
+ruleCAD = Rule
+  { name = "CAD"
+  , pattern =
+    [ regex "(?:k|c)anadiske? dollars?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly CAD
+  }
+
+ruleCHF :: Rule
+ruleCHF = Rule
+  { name = "CHF"
+  , pattern =
+    [ regex "sveitsiske? francs?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly CHF
+  }
+
+ruleCNY :: Rule
+ruleCNY = Rule
+  { name = "CNY"
+  , pattern =
+    [ regex "(?:kinesiske? )?(?:yuan|renminbi)"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly CNY
+  }
+
+ruleCZK :: Rule
+ruleCZK = Rule
+  { name = "CZK"
+  , pattern =
+    [ regex "(?:tsjekkiske? )?koruna"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly CZK
+  }
+
+ruleHKD :: Rule
+ruleHKD = Rule
+  { name = "HKD"
+  , pattern =
+    [ regex "hong kong dollars?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly HKD
+  }
+
+ruleINR :: Rule
+ruleINR = Rule
+  { name = "INR"
+  , pattern =
+    [ regex "(?:indiske? )?rup(?:i(?:er)?|ees?)"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly INR
+  }
+
+ruleJPY :: Rule
+ruleJPY = Rule
+  { name = "JPY"
+  , pattern =
+    [ regex "japanske? yen"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly JPY
+  }
+
+ruleNZD :: Rule
+ruleNZD = Rule
+  { name = "NZD"
+  , pattern =
+    [ regex "(?:nz|new zealand(?:ske)?) dollars?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly NZD
+  }
+
+rulePKR :: Rule
+rulePKR = Rule
+  { name = "PKR"
+  , pattern =
+    [ regex "pakistanske? rup(?:i(?:er)?|ees?)"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly PKR
+  }
+
+rulePLN :: Rule
+rulePLN = Rule
+  { name = "PLN"
+  , pattern =
+    [ regex "(?:polske? )?(?:z|s)?lotys?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly PLN
+  }
+
+ruleSGD :: Rule
+ruleSGD = Rule
+  { name = "SGD"
+  , pattern =
+    [ regex "singapor(?:e|ske?) dollars?"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly SGD
+  }
+
+ruleTHB :: Rule
+ruleTHB = Rule
+  { name = "THB"
+  , pattern =
+    [ regex "(?:thai(?:land(?:ske?)?)? )?b(?:ah|ha)t"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly THB
+  }
+
+ruleZAR :: Rule
+ruleZAR = Rule
+  { name = "ZAR"
+  , pattern =
+    [ regex "(?:sør(?: |-)?afrika(?:nske?)? )?rand"
+    ]
+  , prod = const $ Just $ Token AmountOfMoney $ currencyOnly ZAR
+  }
+
 rules :: [Rule]
 rules =
   [ ruleUnitAmount
@@ -175,7 +321,24 @@
   , ruleIntersectAndNumeral
   , ruleIntersectAndXCents
   , ruleIntersectXCents
-  , ruleIntersectXCentsWithAnd
   , ruleNok
   , rulePound
+  , ruleSEK
+  , ruleDKK
+  , ruleUSD
+  , ruleAUD
+  , ruleCAD
+  , ruleGBP
+  , ruleCHF
+  , ruleCNY
+  , ruleCZK
+  , ruleHKD
+  , ruleINR
+  , ruleJPY
+  , ruleNZD
+  , rulePKR
+  , rulePLN
+  , ruleSGD
+  , ruleTHB
+  , ruleZAR
   ]
diff --git a/Duckling/AmountOfMoney/NL/Corpus.hs b/Duckling/AmountOfMoney/NL/Corpus.hs
--- a/Duckling/AmountOfMoney/NL/Corpus.hs
+++ b/Duckling/AmountOfMoney/NL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -47,6 +46,8 @@
              [ "$10K"
              , "10k$"
              , "$10000"
+             , "$10.000"
+             , "$10.000,00"
              , "10000,00 $"
              ]
   , examples (simple USD 3.14)
diff --git a/Duckling/AmountOfMoney/NL/Rules.hs b/Duckling/AmountOfMoney/NL/Rules.hs
--- a/Duckling/AmountOfMoney/NL/Rules.hs
+++ b/Duckling/AmountOfMoney/NL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/AmountOfMoney/PT/Rules.hs b/Duckling/AmountOfMoney/PT/Rules.hs
--- a/Duckling/AmountOfMoney/PT/Rules.hs
+++ b/Duckling/AmountOfMoney/PT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/AmountOfMoney/RU/Corpus.hs b/Duckling/AmountOfMoney/RU/Corpus.hs
--- a/Duckling/AmountOfMoney/RU/Corpus.hs
+++ b/Duckling/AmountOfMoney/RU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -140,6 +139,15 @@
              , "42RM"
              , "RM42"
              , "MYR42"
+             ]
+  , examples (simple UAH 3.04)
+             [ "UAH 3.04"
+             , "UAH3.04"
+             , "3.04 грн"
+             , "грн 3.04"
+             , "₴3.04"
+             , "₴ 3.04"
+             , "3.04₴"
              ]
   , examples (between Dollar (10, 20))
              [ "между 10 и 20 долларами"
diff --git a/Duckling/AmountOfMoney/RU/Rules.hs b/Duckling/AmountOfMoney/RU/Rules.hs
--- a/Duckling/AmountOfMoney/RU/Rules.hs
+++ b/Duckling/AmountOfMoney/RU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -97,6 +96,15 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Unnamed
   }
 
+ruleHryvnia :: Rule
+ruleHryvnia = Rule
+  { name = "Hryvnia"
+  , pattern =
+    [ regex "грн"
+    ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly UAH
+  }
+
 ruleIntersectAndXCents :: Rule
 ruleIntersectAndXCents = Rule
   { name = "intersect (and X cents)"
@@ -304,6 +312,7 @@
   , ruleCent
   , ruleDollar
   , ruleEUR
+  , ruleHryvnia
   , ruleIntersect
   , ruleIntersectAndNumeral
   , ruleIntersectAndXCents
diff --git a/Duckling/AmountOfMoney/Rules.hs b/Duckling/AmountOfMoney/Rules.hs
--- a/Duckling/AmountOfMoney/Rules.hs
+++ b/Duckling/AmountOfMoney/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -41,12 +40,15 @@
   , ("cad", CAD)
   , ("¢", Cent)
   , ("c", Cent)
+  , ("chf", CHF)
   , ("cny", CNY)
+  , ("czk", CZK)
   , ("rmb", CNY)
   , ("yuan", CNY)
   , ("$", Dollar)
   , ("dinar", Dinar)
   , ("dinars", Dinar)
+  , ("dkk", DKK)
   , ("dollar", Dollar)
   , ("dollars", Dollar)
   , ("egp", EGP)
@@ -60,9 +62,13 @@
   , ("€uros", EUR)
   , ("€urs", EUR)
   , ("gbp", GBP)
+  , ("gel", GEL)
+  , ("hkd", HKD)
   , ("hrk", HRK)
   , ("idr", IDR)
   , ("ils", ILS)
+  , ("₪", ILS)
+  , ("nis", ILS)
   , ("inr", INR)
   , ("iqd", IQD)
   , ("rs", INR)
@@ -73,15 +79,23 @@
   , ("jod", JOD)
   , ("¥", JPY)
   , ("jpy", JPY)
+  , ("lari", GEL)
+  , ("\x20BE", GEL)
   , ("yen", JPY)
   , ("krw", KRW)
   , ("kwd", KWD)
   , ("lbp", LBP)
   , ("mad", MAD)
+  , ("mnt", MNT)
   , ("myr", MYR)
   , ("rm", MYR)
+  , ("₮", MNT)
+  , ("tugrik", MNT)
+  , ("tugriks", MNT)
   , ("nok", NOK)
   , ("nzd", NZD)
+  , ("pkr", PKR)
+  , ("pln", PLN)
   , ("£", Pound)
   , ("pt", PTS)
   , ("pta", PTS)
@@ -100,17 +114,24 @@
   , ("sgd", SGD)
   , ("shekel", ILS)
   , ("shekels", ILS)
+  , ("thb", THB)
   , ("ttd", TTD)
+  , ("₴", UAH)
+  , ("uah", UAH)
   , ("usd", USD)
   , ("us$", USD)
   , ("vnd", VND)
+  , ("zar", ZAR)
+  , ("tl", TRY)
+  , ("lira", TRY)
+  , ("₺", TRY)
   ]
 
 ruleCurrencies :: Rule
 ruleCurrencies = Rule
   { name = "currencies"
   , pattern =
-    [ regex "(aed|aud|bgn|brl|byn|¢|c|cad|cny|\\$|dinars?|dollars?|egp|(e|€)uro?s?|€|gbp|hrk|idr|ils|inr|iqd|jmd|jod|¥|jpy|krw|kwd|lbp|mad|myr|rm|nok|nzd|£|pta?s?|qar|₽|rs\\.?|riy?als?|ron|rub|rupees?|sar|sek|sgb|shekels?|ttd|us(d|\\$)|vnd|yen|yuan)"
+    [ regex "(aed|aud|bgn|brl|byn|¢|cad|chf|cny|c|\\$|dinars?|dkk|dollars?|egp|(e|€)uro?s?|€|gbp|gel|\x20BE|hkd|hrk|idr|ils|₪|inr|iqd|jmd|jod|¥|jpy|lari|krw|kwd|lbp|mad|₮|mnt|tugriks?|myr|rm|nis|nok|nzd|£|pkr|pln|pta?s?|qar|₽|rs\\.?|riy?als?|ron|rub|rupees?|sar|sek|sgb|shekels?|thb|ttd|₴|uah|us(d|\\$)|vnd|yen|yuan|zar|tl|lira|₺)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
@@ -133,8 +154,21 @@
       _ -> Nothing
   }
 
+ruleAmountLatent :: Rule
+ruleAmountLatent = Rule
+  { name = "<amount> (latent)"
+  , pattern =
+    [ Predicate isPositive
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token AmountOfMoney . mkLatent $ valueOnly v
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleAmountUnit
+  , ruleAmountLatent
   , ruleCurrencies
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/AmountOfMoney/TR/Corpus.hs b/Duckling/AmountOfMoney/TR/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/TR/Corpus.hs
@@ -0,0 +1,55 @@
+-- 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.
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.TR.Corpus
+  ( corpus
+  ) where
+
+import Data.String (fromString)
+import Prelude
+
+import Duckling.AmountOfMoney.Types
+import Duckling.Testing.Types
+import Duckling.Locale
+import Duckling.Resolve
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple TRY 10000)
+             [ "10 bin lira"
+             , "on bin lira"
+             , "10000 lira"
+             ]
+  , examples (simple TRY 1)
+             [ "bir lira"
+             , "1 lira"
+             ]
+  , examples (simple Cent 10)
+             [ "on kuruş"
+             , "10 kuruş"
+             ]
+  , examples (simple Cent 25)
+             [ "25 kuruş"
+             , "yirmi beş kuruş"
+             ]
+  , examples (simple Cent 5)
+             [ "beş kuruş"
+             , "5 kuruş"
+             ]
+  , examples (simple Cent 66)
+             [ "altmış altı kuruş"
+             , "66 kuruş"
+             ]
+  , examples (simple TRY 100.75)
+             [ "yüz lira yetmiş beş kuruş"
+             , "100 lira 75 kuruş"
+             ]
+  ]
diff --git a/Duckling/AmountOfMoney/TR/Rules.hs b/Duckling/AmountOfMoney/TR/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/TR/Rules.hs
@@ -0,0 +1,160 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.AmountOfMoney.TR.Rules
+  ( rules
+  ) where
+
+import Data.String (fromString)
+import Prelude
+
+import Duckling.AmountOfMoney.Helpers
+import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (isNatural, isPositive)
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just $ Token AmountOfMoney $ withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
+rulePounds :: Rule
+rulePounds = Rule
+  { name = "₺"
+  , pattern =
+    [ regex "₺"
+    ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly TRY
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "kuruş?"
+    ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleADollarCoin :: Rule
+ruleADollarCoin = Rule
+  { name = "a <dollar coin>"
+  , pattern =
+    [ regex "kuruş"
+    , Predicate isDollarCoin
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       Token AmountOfMoney fd:
+       _) -> Just $ Token AmountOfMoney fd
+      _ -> Nothing
+  }
+
+ruleNumDollarCoins :: Rule
+ruleNumDollarCoins = Rule
+  { name = "X <dollar coins>"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate isDollarCoin
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = c}:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just d,
+                                             TAmountOfMoney.currency = cur}:
+       _) -> Just $ Token AmountOfMoney $ withValue (c * d) $ currencyOnly cur
+      _ -> Nothing
+  }
+
+ruleIntersectAndXCents :: Rule
+ruleIntersectAndXCents = Rule
+  { name = "intersect (and X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "(lira|tl)"
+    , Predicate isCents
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate isWithoutCents
+    , Predicate isNatural
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersectAndNumeral :: Rule
+ruleIntersectAndNumeral = Rule
+  { name = "intersect (and number)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "(lira|tl)"
+    , Predicate isNatural
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       _:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersectXCents :: Rule
+ruleIntersectXCents = Rule
+  { name = "intersect (X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , Predicate isCents
+    ]
+  , prod = \tokens -> case tokens of
+      (Token AmountOfMoney fd:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleUnitAmount
+  , ruleCent
+  , ruleADollarCoin
+  , ruleNumDollarCoins
+  , ruleIntersect
+  , ruleIntersectAndNumeral
+  , ruleIntersectAndXCents
+  , ruleIntersectXCents
+  , rulePounds
+  ]
diff --git a/Duckling/AmountOfMoney/Types.hs b/Duckling/AmountOfMoney/Types.hs
--- a/Duckling/AmountOfMoney/Types.hs
+++ b/Duckling/AmountOfMoney/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -23,7 +22,7 @@
 import Prelude
 import qualified Data.HashMap.Strict as H
 
-import Duckling.Resolve (Resolve(..))
+import Duckling.Resolve (Resolve(..), Options(..))
 
 data Currency
   -- ambiguous
@@ -42,10 +41,14 @@
   | BRL
   | BYN
   | CAD
+  | CHF
   | CNY
+  | CZK
+  | DKK
   | EGP
   | EUR
   | GBP
+  | HKD
   | HRK
   | IDR
   | ILS
@@ -54,13 +57,17 @@
   | JMD
   | JOD
   | JPY
+  | GEL
   | KRW
   | KWD
   | LBP
   | MAD
+  | MNT
   | MYR
   | NOK
   | NZD
+  | PKR
+  | PLN
   | PTS
   | QAR
   | RON
@@ -68,9 +75,13 @@
   | SAR
   | SEK
   | SGD
+  | THB
   | TTD
   | USD
   | VND
+  | ZAR
+  | UAH
+  | TRY
   deriving (Eq, Generic, Hashable, Show, Ord, NFData)
 
 instance ToJSON Currency where
@@ -88,10 +99,14 @@
   toJSON BRL     = "BRL"
   toJSON BYN     = "BYN"
   toJSON CAD     = "CAD"
+  toJSON CHF     = "CHF"
   toJSON CNY     = "CNY"
+  toJSON CZK     = "CZK"
+  toJSON DKK     = "DKK"
   toJSON EGP     = "EGP"
   toJSON EUR     = "EUR"
   toJSON GBP     = "GBP"
+  toJSON HKD     = "HKD"
   toJSON HRK     = "HRK"
   toJSON IDR     = "IDR"
   toJSON ILS     = "ILS"
@@ -100,47 +115,71 @@
   toJSON JMD     = "JMD"
   toJSON JOD     = "JOD"
   toJSON JPY     = "JPY"
+  toJSON GEL     = "GEL"
   toJSON KRW     = "KRW"
   toJSON KWD     = "KWD"
   toJSON LBP     = "LBP"
   toJSON MAD     = "MAD"
+  toJSON MNT     = "MNT"
   toJSON MYR     = "MYR"
   toJSON NOK     = "NOK"
   toJSON NZD     = "NZD"
   toJSON PTS     = "PTS"
+  toJSON PKR     = "PKR"
+  toJSON PLN     = "PLN"
   toJSON QAR     = "QAR"
   toJSON RON     = "RON"
   toJSON RUB     = "RUB"
   toJSON SAR     = "SAR"
   toJSON SEK     = "SEK"
   toJSON SGD     = "SGD"
+  toJSON THB     = "THB"
   toJSON TTD     = "TTD"
   toJSON USD     = "USD"
   toJSON VND     = "VND"
+  toJSON ZAR     = "ZAR"
+  toJSON UAH     = "UAH"
+  toJSON TRY     = "TRY"
 
 data AmountOfMoneyData = AmountOfMoneyData
   { value    :: Maybe Double
   , currency :: Currency
   , minValue :: Maybe Double
   , maxValue :: Maybe Double
+  , latent   :: Bool
   }
   deriving (Eq, Generic, Hashable, Show, Ord, NFData)
 
 instance Resolve AmountOfMoneyData where
   type ResolvedValue AmountOfMoneyData = AmountOfMoneyValue
+  resolve _ Options {withLatent = False} AmountOfMoneyData {latent = True} =
+    Nothing
   resolve _ _ AmountOfMoneyData {value = Nothing, minValue = Nothing
-                              , maxValue = Nothing} = Nothing
-  resolve _ _ AmountOfMoneyData {value = Just value, currency} =
-    Just (simple currency value, False)
+                              , maxValue = Nothing} =
+    Nothing
+  resolve _ _ AmountOfMoneyData {value = Just value, currency, latent} =
+    Just (simple currency value, latent)
   resolve _ _ AmountOfMoneyData {value = Nothing, currency = c
-                              , minValue = Just from, maxValue = Just to} =
-    Just (between c (from, to), False)
+                              , minValue = Just from, maxValue = Just to
+                              , latent} =
+    Just (between c (from, to), latent)
   resolve _ _ AmountOfMoneyData {value = Nothing, currency = c
-                              , minValue = Just v, maxValue = Nothing} =
-    Just (above c v, False)
+                              , minValue = Just v, maxValue = Nothing
+                              , latent} =
+    Just (above c v, latent)
   resolve _ _ AmountOfMoneyData {value = Nothing, currency = c
-                              , minValue = Nothing, maxValue = Just v} =
-    Just (under c v, False)
+                              , minValue = Nothing, maxValue = Just v
+                              , latent} =
+    Just (under c v, latent)
+
+amountOfMoneyData' :: AmountOfMoneyData
+amountOfMoneyData' = AmountOfMoneyData
+  { value = Nothing
+  , currency = Unnamed
+  , minValue = Nothing
+  , maxValue = Nothing
+  , latent = False
+  }
 
 data IntervalDirection = Above | Under
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
diff --git a/Duckling/AmountOfMoney/VI/Corpus.hs b/Duckling/AmountOfMoney/VI/Corpus.hs
--- a/Duckling/AmountOfMoney/VI/Corpus.hs
+++ b/Duckling/AmountOfMoney/VI/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -100,5 +99,40 @@
   , examples (simple AED 1)
              [ "1 AED."
              , "1 dirham"
+             ]
+  , examples (between VND (1000, 2000))
+             [ "giữa 1000 và 2000 đồng"
+             , "giữa 1000 đồng và 2000 đồng"
+             , "từ 1000 đồng đến 2000 đồng"
+             , "từ 1000 VNĐ tới 2000 VNĐ"
+             , "từ 1000 đến 2000 đồng"
+             , "khoảng 1000-2000 đồng"
+             , "khoảng chừng từ 1000 đến 2000 đồng"
+             , "tầm khoảng 1000 tới 2000 đồng"
+             , "xấp xỉ VND1000-VND2000"
+             , "1000-2000 đồng"
+             ]
+  , examples (between Dollar (1.1, 1.3))
+             [ "giữa 1,1 và 1,3 đô la"
+             , "từ 1 phẩy 1 đến một chấm ba đô la"
+             ]
+  , examples (under VND 7000)
+             [ "dưới bảy ngàn đồng"
+             , "ít hơn bảy nghìn đồng"
+             , "kém hơn 7k đồng"
+             , "không tới 7000 đồng"
+             , "không cao hơn 7000 đồng"
+             , "không hơn 7.000 đồng"
+             , "không quá 7.000 đồng"
+             , "từ 7000 đồng trở xuống"
+             ]
+  , examples (above Dollar 1.42)
+             [ "nhiều hơn 1 đô la và bốn mươi hai xen"
+             , "ít nhất $1,42"
+             , "hơn 1,42 đô la"
+             , "trên một đô la và 42 xu"
+             , "không ít hơn 1,42 đô la"
+             , "cao hơn $1,42"
+             , "từ $1,42 trở lên"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -45,7 +44,7 @@
 ruleNg = Rule
   { name = "đồng"
   , pattern =
-    [ regex "đồng?"
+    [ regex "đ(ồng)?"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly VND
   }
@@ -54,7 +53,7 @@
 ruleDollar = Rule
   { name = "$"
   , pattern =
-    [ regex "đô la|đô mỹ|đ(ô)?"
+    [ regex "đô( la)?( mỹ)?"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
   }
@@ -63,7 +62,7 @@
 ruleVnd = Rule
   { name = "VNĐ"
   , pattern =
-    [ regex "vn(Đ|\\$)"
+    [ regex "vn(Đ|D|\\$)"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly VND
   }
@@ -72,7 +71,7 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "xen|xu?|penn(y|ies)"
+    [ regex "xen|xu|cắc|penn(y|ies)"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
@@ -81,7 +80,7 @@
 rulePounds = Rule
   { name = "£"
   , pattern =
-    [ regex "pounds?"
+    [ regex "pounds?|pao"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
   }
@@ -93,7 +92,7 @@
     [ Predicate isWithoutCents
     , Predicate isNatural
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        Token Numeral NumeralData{TNumeral.value = c}:
        _) -> Just . Token AmountOfMoney $ withCents c fd
@@ -108,7 +107,7 @@
     , regex "và"
     , Predicate isNatural
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        _:
        Token Numeral NumeralData{TNumeral.value = c}:
@@ -123,7 +122,7 @@
     [ Predicate isWithoutCents
     , Predicate isCents
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
        _) -> Just . Token AmountOfMoney $ withCents c fd
@@ -138,7 +137,7 @@
     , regex "và"
     , Predicate isCents
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token AmountOfMoney fd:
        _:
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
@@ -155,6 +154,158 @@
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AED
   }
 
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <amount-of-money>"
+  , pattern =
+    [ regex "đúng|chính xác|khoảng( chừng)?|tầm|xấp xỉ|gần"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "từ|giữa|khoảng"
+    , Predicate isPositive
+    , regex "đến|tới|và"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "từ|giữa <amount-of-money> đến|tới|và <amount-of-money>"
+  , pattern =
+    [ regex "từ|giữa"
+    , Predicate isSimpleAmountOfMoney
+    , regex "đến|tới|và"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to->
+         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<amount-of-money> - <amount-of-money>"
+  , pattern =
+    [ Predicate isSimpleAmountOfMoney
+    , regex "-"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <amount-of-money>"
+  , pattern =
+    [ regex "dưới|(bé|ít|thấp|kém|không( cao| nhiều)?) hơn|không (đến|tới|quá)|(nhiều|cao) nhất"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalMax2 :: Rule
+ruleIntervalMax2 = Rule
+  { name = "under <amount-of-money>"
+  , pattern =
+    [ regex "từ"
+    , Predicate isSimpleAmountOfMoney
+    , regex "trở xuống"
+    ]
+  , prod = \case
+      (_:
+       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 "trên|(lớn |nhiều |cao |không (thấp|ít|kém) )?hơn|(ít|thấp) nhất"
+    , Predicate isSimpleAmountOfMoney
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
+ruleIntervalMin2 :: Rule
+ruleIntervalMin2 = Rule
+  { name = "above <amount-of-money>"
+  , pattern =
+    [ regex "từ"
+    , Predicate isSimpleAmountOfMoney
+    , regex "trở lên"
+    ]
+  , prod = \case
+      (_:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleUnitAmount
@@ -165,7 +316,16 @@
   , ruleIntersectAndNumeral
   , ruleIntersectVXXuxen
   , ruleIntersectXXuxen
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalDash
+  , ruleIntervalNumeralDash
+  , ruleIntervalMax
+  , ruleIntervalMax2
+  , ruleIntervalMin
+  , ruleIntervalMin2
   , ruleNg
   , rulePounds
+  , rulePrecision
   , ruleVnd
   ]
diff --git a/Duckling/AmountOfMoney/ZH/Corpus.hs b/Duckling/AmountOfMoney/ZH/Corpus.hs
--- a/Duckling/AmountOfMoney/ZH/Corpus.hs
+++ b/Duckling/AmountOfMoney/ZH/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -29,12 +28,14 @@
   [ examples (simple Cent 5)
              [ "五分"
              , "5分"
+             , "五仙"
              ]
   , examples (simple Cent 20)
              [ "20分"
              , "二十分"
              , "2角"
              , "两毛"
+             , "两毫"
              ]
   , examples (simple Cent 25)
              [ "25分"
@@ -45,11 +46,27 @@
   , examples (simple Dollar 7)
              [ "7块"
              , "七元"
+             , "七蚊"
              ]
+  , examples (simple Dollar 5.5)
+             [ "五個半"
+             ]
+  , examples (simple Dollar 1.5)
+             [ "個半"
+             , "一個半"
+             ]
+  , examples (simple Dollar 1.9)
+             [ "個九"
+             ]
   , examples (simple CNY 3.14)
              [ "3.14人民币"
              , "人民幣3.14"
              ]
+  , examples (simple HKD 3.14)
+             [ "3.14港幣"
+             , "港幣3.14"
+             , "港幣三個一毫四"
+             ]
   , examples (under Dollar 1.2)
              [ "1.2元以下"
              , "最多一块二角"
@@ -59,10 +76,12 @@
              [ "3.04块以上"
              , "至少三块四分"
              , "至少三块零四"
+             , "起碼三蚊零四"
              ]
   , examples (between Dollar (5.6, 5.78))
              [ "5.6到5.78元"
              , "五元六角-五元七毛八分"
              , "五块六到五块七毛八"
+             , "五蚊六毫至五蚊七毫八"
              ]
   ]
diff --git a/Duckling/AmountOfMoney/ZH/Rules.hs b/Duckling/AmountOfMoney/ZH/Rules.hs
--- a/Duckling/AmountOfMoney/ZH/Rules.hs
+++ b/Duckling/AmountOfMoney/ZH/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -17,12 +16,11 @@
 import Data.Maybe
 import Data.String
 import Prelude
-import qualified Data.Text as Text
 
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency (..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural, isPositive, oneOf)
+import Duckling.Numeral.Helpers (isNatural, isPositive, oneOf, numberBetween, decimalsToDouble)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Regex.Types
 import Duckling.Types
@@ -35,7 +33,7 @@
   , pattern =
     [ regex "人民币|人民幣"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly CNY
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly CNY
   }
 
 ruleCNYPrefix :: Rule
@@ -47,17 +45,39 @@
     ]
   , prod = \case
       (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
-        Just . Token AmountOfMoney . withValue v $ currencyOnly CNY
+        Just $ Token AmountOfMoney $ withValue v $ currencyOnly CNY
       _ -> Nothing
   }
 
+ruleHKD :: Rule
+ruleHKD = Rule
+  { name = "HKD"
+  , pattern =
+    [ regex "港幣"
+    ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly HKD
+  }
+
+ruleHKDPrefix :: Rule
+ruleHKDPrefix = Rule
+  { name = "hkd prefix"
+  , pattern =
+    [ regex "港幣"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just $ Token AmountOfMoney $ withValue v $ currencyOnly HKD
+      _ -> Nothing
+  }
+
 ruleCent :: Rule
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "分"
+    [ regex "分|仙"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly Cent
 }
 
 ruleDime :: Rule
@@ -65,11 +85,11 @@
   { name = "dime"
   , pattern =
     [ Predicate isPositive
-    , regex "角|毛"
+    , regex "角|毛|毫"
     ]
   , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:_) ->
-        Just . Token AmountOfMoney $
+        Just $ Token AmountOfMoney $
         withCents (v * 10) $ currencyOnly Cent
       _ -> Nothing
   }
@@ -78,9 +98,9 @@
 ruleDollar = Rule
   { name = "dollar"
   , pattern =
-    [ regex "元|圆|块"
+    [ regex "元|圆|块|蚊|個"
     ]
-  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
+  , prod = \_ -> Just $ Token AmountOfMoney $ currencyOnly Dollar
   }
 
 rulePrecision :: Rule
@@ -118,7 +138,7 @@
       (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just d}:
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
        _) ->
-         Just . Token AmountOfMoney $ withCents (c + d) $ currencyOnly Cent
+         Just $ Token AmountOfMoney $ withCents (c + d) $ currencyOnly Cent
       _ -> Nothing
   }
 
@@ -132,10 +152,23 @@
   , prod = \case
       (Token AmountOfMoney fd:
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
       _ -> Nothing
   }
 
+ruleIntersectDollarsAndAHalf :: Rule
+ruleIntersectDollarsAndAHalf = Rule
+  { name = "<amount-of-money> and a half"
+  , pattern =
+    [ Predicate $ and . sequence [isSimpleAmountOfMoney, isWithoutCents]
+    , regex "半"
+    ]
+  , prod = \case
+      (Token AmountOfMoney fd:_) ->
+        Just $ Token AmountOfMoney $ withCents 50 fd
+      _ -> Nothing
+  }
+
 ruleIntersect :: Rule
 ruleIntersect = Rule
   { name = "intersect (implicit 0 delimited cents)"
@@ -147,7 +180,7 @@
   , prod = \case
       (Token AmountOfMoney fd:_:
        Token Numeral NumeralData{TNumeral.value = c}:
-       _) -> Just . Token AmountOfMoney $ withCents c fd
+       _) -> Just $ Token AmountOfMoney $ withCents c fd
       _ -> Nothing
   }
 
@@ -161,7 +194,7 @@
   , prod = \case
       (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just v}:
        Token Numeral NumeralData{TNumeral.value = c}:
-       _) -> Just . Token AmountOfMoney $ withCents (v + c) $ currencyOnly Cent
+       _) -> Just $ Token AmountOfMoney $ withCents (v + c) $ currencyOnly Cent
       _ -> Nothing
   }
 
@@ -175,16 +208,38 @@
   , prod = \case
       (Token AmountOfMoney fd:
        Token Numeral NumeralData{TNumeral.value = d}:
-       _) -> Just . Token AmountOfMoney $ withCents (d * 10) fd
+       _) -> Just $ Token AmountOfMoney $ withCents (d * 10) fd
       _ -> Nothing
   }
 
+ruleOneDollarAndAHalf :: Rule
+ruleOneDollarAndAHalf = Rule
+  { name = "one dollar and a half (short form)"
+  , pattern =
+    [ regex "個半"
+    ]
+  , prod = \_ -> Just $ Token AmountOfMoney $ withValue 1.5 (currencyOnly Dollar)
+  }
+
+ruleOneDollarAnd :: Rule
+ruleOneDollarAnd = Rule
+  { name = "one dollar and x dimes (short form)"
+  , pattern =
+    [ regex "個"
+    , numberBetween 1 10
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just $ Token AmountOfMoney $ withValue (1 + decimalsToDouble(v)) (currencyOnly Dollar)
+      _ -> Nothing
+  }
+
 ruleIntervalNumeralDash :: Rule
 ruleIntervalNumeralDash = Rule
   { name = "<numeral> - <amount-of-money>"
   , pattern =
     [ Predicate isPositive
-    , regex "-|~|到"
+    , regex "-|~|到|至"
     , Predicate isSimpleAmountOfMoney
     ]
   , prod = \case
@@ -193,7 +248,7 @@
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
                   TAmountOfMoney.currency = c}:
        _) | from < to ->
-         Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
+         Just $ Token AmountOfMoney $ withInterval (from, to) $ currencyOnly c
       _ -> Nothing
   }
 
@@ -202,7 +257,7 @@
   { name = "<amount-of-money> - <amount-of-money>"
   , pattern =
     [ Predicate isSimpleAmountOfMoney
-    , regex "-|~|到"
+    , regex "-|~|到|至"
     , Predicate isSimpleAmountOfMoney
     ]
   , prod = \case
@@ -212,7 +267,7 @@
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
                   TAmountOfMoney.currency = c2}:
        _) | from < to && c1 == c2 ->
-        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+        Just $ Token AmountOfMoney $ withInterval (from, to) $ currencyOnly c1
       _ -> Nothing
   }
 
@@ -220,7 +275,7 @@
 ruleIntervalBound = Rule
   { name = "under/less/lower/no more than <amount-of-money> (最多|至少|最少)"
   , pattern =
-    [ regex "(最多|至少|最少)"
+    [ regex "(最多|至少|最少|起碼)"
     , Predicate isSimpleAmountOfMoney
     ]
   , prod = \case
@@ -228,9 +283,10 @@
        Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
                   TAmountOfMoney.currency = c}:
        _) -> case match of
-        "最多" -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
-        "最少" -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
-        "至少" -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+        "最多" -> Just $ Token AmountOfMoney $ withMax to $ currencyOnly c
+        "最少" -> Just $ Token AmountOfMoney $ withMin to $ currencyOnly c
+        "至少" -> Just $ Token AmountOfMoney $ withMin to $ currencyOnly c
+        "起碼" -> Just $ Token AmountOfMoney $ withMin to $ currencyOnly c
         _ -> Nothing
       _ -> Nothing
   }
@@ -247,8 +303,8 @@
                   TAmountOfMoney.currency = c}:
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case match of
-        "以下" -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
-        "以上" -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+        "以下" -> Just $ Token AmountOfMoney $ withMax to $ currencyOnly c
+        "以上" -> Just $ Token AmountOfMoney $ withMin to $ currencyOnly c
         _ -> Nothing
       _ -> Nothing
   }
@@ -258,6 +314,8 @@
   [ ruleCent
   , ruleCNY
   , ruleCNYPrefix
+  , ruleHKD
+  , ruleHKDPrefix
   , ruleDime
   , ruleDollar
   , ruleIntersect
@@ -265,10 +323,13 @@
   , ruleIntersect3
   , ruleIntersectDimesAndCents
   , ruleIntersectDollarsAndDimesCents
+  , ruleIntersectDollarsAndAHalf
   , ruleIntervalDash
   , ruleIntervalNumeralDash
   , ruleIntervalBound
   , ruleIntervalBound2
   , rulePrecision
   , rulePrecision2
+  , ruleOneDollarAndAHalf
+  , ruleOneDollarAnd
   ]
diff --git a/Duckling/Api.hs b/Duckling/Api.hs
--- a/Duckling/Api.hs
+++ b/Duckling/Api.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NamedFieldPuns #-}
@@ -36,22 +35,22 @@
 import Duckling.Types
 
 -- | Parses `input` and returns a curated list of entities found.
-parse :: Text -> Context -> Options -> [Some Dimension] -> [Entity]
+parse :: Text -> Context -> Options -> [Seal Dimension] -> [Entity]
 parse input ctx options = map (formatToken input) . analyze input ctx options .
   HashSet.fromList
 
-supportedDimensions :: HashMap Lang [Some Dimension]
+supportedDimensions :: HashMap Lang [Seal Dimension]
 supportedDimensions =
   HashMap.fromList [ (l, allDimensions l) | l <- [minBound..maxBound] ]
 
 -- | Returns a curated list of resolved tokens found
 -- When `targets` is non-empty, returns only tokens of such dimensions.
-analyze :: Text -> Context -> Options -> HashSet (Some Dimension)
+analyze :: Text -> Context -> Options -> HashSet (Seal Dimension)
   -> [ResolvedToken]
 analyze input context@Context{..} options targets =
   rank (classifiers locale) targets
   . filter (\Resolved{node = Node{token = (Token d _)}} ->
-      HashSet.null targets || HashSet.member (This d) targets
+      HashSet.null targets || HashSet.member (Seal d) targets
     )
   $ parseAndResolve (rulesFor locale targets) input context options
 
diff --git a/Duckling/Core.hs b/Duckling/Core.hs
--- a/Duckling/Core.hs
+++ b/Duckling/Core.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NoRebindableSyntax #-}
@@ -21,7 +20,8 @@
   , Range(..)
   , Region(..)
   , ResolvedVal(..)
-  , Some(..)
+  , Seal(..)
+  , withSeal
   , fromName
   , makeLocale
   , toJText
diff --git a/Duckling/CreditCardNumber/Corpus.hs b/Duckling/CreditCardNumber/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/CreditCardNumber/Corpus.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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.CreditCardNumber.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Prelude
+import Data.String
+import qualified Data.Text as T
+
+import Duckling.CreditCardNumber.Types
+import Duckling.CreditCardNumber.Helpers
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext, testOptions, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext, testOptions, examples)
+  where
+    examples =
+      [ T.replicate (minNumberDigits - 1) "0"
+      , T.replicate (maxNumberDigits + 1) "0"
+      , "invalid"
+      , "4111111111111110"
+      , "41111111-1111-1111"
+      , "371449635398430"
+      , "3714496353-98431"
+      , "6011111111111110"
+      , "60111111-1111-1117"
+      , "5555555555554440"
+      , "55555555-5555-4444"
+      , "30569309025900"
+      , "3056930902-5904"
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples
+      (CreditCardNumberValue "4111111111111111" Visa)
+      [ "4111111111111111"
+      , "4111-1111-1111-1111"
+      ]
+  , examples
+      (CreditCardNumberValue "371449635398431" Amex)
+      [ "371449635398431"
+      , "3714-496353-98431"
+      ]
+  , examples
+      (CreditCardNumberValue "6011111111111117" Discover)
+      [ "6011111111111117"
+      , "6011-1111-1111-1117"
+      ]
+  , examples
+      (CreditCardNumberValue "5555555555554444" Mastercard)
+      [ "5555555555554444"
+      , "5555-5555-5555-4444"
+      ]
+  , examples
+      (CreditCardNumberValue "30569309025904" DinerClub)
+      [ "30569309025904"
+      , "3056-930902-5904"
+      ]
+  , examples
+      (CreditCardNumberValue "3530111333300000" Other)
+      [ "3530111333300000" ]
+  ]
diff --git a/Duckling/CreditCardNumber/Helpers.hs b/Duckling/CreditCardNumber/Helpers.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/CreditCardNumber/Helpers.hs
@@ -0,0 +1,123 @@
+-- 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.
+
+
+module Duckling.CreditCardNumber.Helpers
+  ( otherCreditCardNumberRegex
+  , visaCreditCardNumberRegex
+  , amexCreditCardNumberRegex
+  , discoverCreditCardNumberRegex
+  , mastercardCreditCardNumberRegex
+  , dinerClubCreditCardNumberRegex
+  , isValidCreditCardNumber
+  , minNumberDigits
+  , maxNumberDigits
+  , creditCard
+  ) where
+
+import Data.Text (Text)
+import Prelude
+import Data.String
+
+import Duckling.CreditCardNumber.Types (CreditCardNumberData(..))
+import qualified Duckling.CreditCardNumber.Types as TCreditCardNumber
+import qualified Data.Text as T
+import qualified Data.Char as C
+import qualified Data.Bits as B
+
+-- -----------------------------------------------------------------
+-- Patterns
+
+otherCreditCardNumberRegex :: String
+otherCreditCardNumberRegex =
+  concat [ "("
+         , "(?!" , visaCreditCardNumberRegex, ")"
+         , "(?!" , amexCreditCardNumberRegex, ")"
+         , "(?!" , discoverCreditCardNumberRegex, ")"
+         , "(?!" , mastercardCreditCardNumberRegex, ")"
+         , "(?!" , dinerClubCreditCardNumberRegex, ")"
+         , "\\d{" , show minNumberDigits , "," , show maxNumberDigits , "}"
+         , ")"
+         ]
+
+-- | Visa credit card regex informed by latest BIN info
+visaCreditCardNumberRegex :: String
+visaCreditCardNumberRegex = "(" ++ withoutDashes ++ "|" ++ withDashes ++")"
+  where
+    withoutDashes = "4[0-9]{15}"
+    withDashes = "4[0-9]{3}-[0-9]{4}-[0-9]{4}-[0-9]{4}"
+
+-- | American Express credit card regex informed by latest BIN info
+amexCreditCardNumberRegex :: String
+amexCreditCardNumberRegex = "(" ++ withoutDashes ++ "|" ++ withDashes ++")"
+  where
+    withoutDashes = "3[47][0-9]{13}"
+    withDashes = "3[47][0-9]{2}-[0-9]{6}-[0-9]{5}"
+
+-- | Discover credit card regex informed by latest BIN info
+discoverCreditCardNumberRegex :: String
+discoverCreditCardNumberRegex = "(" ++ withoutDashes ++ "|" ++ withDashes ++")"
+  where
+    withoutDashes = "6(?:011|[45][0-9]{2})[0-9]{12}"
+    withDashes = "6(?:011|[45][0-9]{2})-[0-9]{4}-[0-9]{4}-[0-9]{4}"
+
+-- | Mastercard credit card regex informed by latest BIN info
+mastercardCreditCardNumberRegex :: String
+mastercardCreditCardNumberRegex =
+  "(" ++ withoutDashes ++ "|" ++ withDashes ++")"
+  where
+    withoutDashes = "5[1-5][0-9]{14}"
+    withDashes = "5[1-5][0-9]{2}-[0-9]{4}-[0-9]{4}-[0-9]{4}"
+
+-- | Diner Club credit card regex informed by latest BIN info
+dinerClubCreditCardNumberRegex :: String
+dinerClubCreditCardNumberRegex = "(" ++ withoutDashes ++ "|" ++ withDashes ++")"
+  where
+    withoutDashes = "3(?:0[0-5]|[68][0-9])[0-9]{11}"
+    withDashes = "3(?:0[0-5]|[68][0-9])[0-9]-[0-9]{6}-[0-9]{4}"
+
+-- -----------------------------------------------------------------
+-- Validation
+
+-- | An implementation of the Luhn algorithm (see
+-- https://en.wikipedia.org/wiki/Luhn_algorithm) to check if a given credit card
+-- number is valid
+isValidCreditCardNumber :: Text -> Bool
+isValidCreditCardNumber ccNum =
+  T.length ccNum >= minNumberDigits &&
+  T.length ccNum <= maxNumberDigits &&
+  validCheckSum
+  where
+  validCheckSum :: Bool
+  validCheckSum =
+    T.all C.isDigit ccNum &&
+    fst (T.foldr f (0, 0) ccNum) `rem` 10 == 0
+    where
+    f char (checksum, e) =
+      let
+        val = C.digitToInt char
+        -- every even digit should be doubled
+        d = sumDigits (B.shift val e)
+      in (checksum + d, 1 - e)
+    -- we only need sum of digits for numbers from 0 to 18
+    sumDigits a
+      | a > 9 = a - 9
+      | otherwise = a
+
+minNumberDigits :: Int
+minNumberDigits = 8
+
+maxNumberDigits :: Int
+maxNumberDigits = 19
+
+-- -----------------------------------------------------------------
+-- Production
+
+creditCard :: Text -> TCreditCardNumber.Issuer -> CreditCardNumberData
+creditCard ccNum i =
+  CreditCardNumberData { TCreditCardNumber.number = ccNum
+                       , TCreditCardNumber.issuer = i
+                       }
diff --git a/Duckling/CreditCardNumber/Rules.hs b/Duckling/CreditCardNumber/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/CreditCardNumber/Rules.hs
@@ -0,0 +1,72 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.CreditCardNumber.Rules
+  ( rules ) where
+
+import Prelude
+import Data.String
+import Data.Text (Text)
+import Data.Bool
+import qualified Data.Text as T
+import qualified Data.Char as C
+
+import Duckling.Dimensions.Types
+import Duckling.CreditCardNumber.Helpers
+import qualified Duckling.CreditCardNumber.Types as TCreditCardNumber
+import Duckling.Regex.Types
+import Duckling.Types
+
+creditCards :: [(Text, PatternItem, TCreditCardNumber.Issuer)]
+creditCards =
+  [ ( "visa credit card number"
+    , regex visaCreditCardNumberRegex
+    , TCreditCardNumber.Visa
+    )
+  , ( "amex card number"
+    , regex amexCreditCardNumberRegex
+    , TCreditCardNumber.Amex
+    )
+  , ( "discover card number"
+    , regex discoverCreditCardNumberRegex
+    , TCreditCardNumber.Discover
+    )
+  , ( "mastercard card number"
+    , regex mastercardCreditCardNumberRegex
+    , TCreditCardNumber.Mastercard
+    )
+  , ( "diner club card number"
+    , regex dinerClubCreditCardNumberRegex
+    , TCreditCardNumber.DinerClub
+    )
+  , ( "credit card number"
+    , regex otherCreditCardNumberRegex
+    , TCreditCardNumber.Other
+    )
+  ]
+
+rules :: [Rule]
+rules = map go creditCards
+  where
+    go :: (Text, PatternItem, TCreditCardNumber.Issuer) -> Rule
+    go (name, regexPattern, i) = Rule
+      { name = name
+      , pattern = [ regexPattern ]
+      , prod = \case
+          (Token RegexMatch (GroupMatch (ccNumGroup:_)):_) ->
+            bool
+              Nothing
+              (Just $ Token CreditCardNumber $ creditCard ccNum i)
+              (isValidCreditCardNumber ccNum)
+            where
+              ccNum = T.filter C.isDigit ccNumGroup
+          _ -> Nothing
+      }
diff --git a/Duckling/CreditCardNumber/Types.hs b/Duckling/CreditCardNumber/Types.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/CreditCardNumber/Types.hs
@@ -0,0 +1,61 @@
+-- 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.
+
+
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Duckling.CreditCardNumber.Types where
+
+import Control.DeepSeq
+import Data.Aeson
+import Data.Hashable
+import Data.Text (Text)
+import qualified Data.Text as Text
+import GHC.Generics
+
+import Prelude
+
+import Duckling.Resolve (Resolve(..))
+
+data Issuer
+  = Visa
+  | Amex
+  | Discover
+  | Mastercard
+  | DinerClub
+  | Other
+  deriving (Eq, Generic, Hashable, Ord, Show, NFData)
+
+instance ToJSON Issuer where
+  toJSON = String . Text.toLower . Text.pack . show
+
+data CreditCardNumberData = CreditCardNumberData
+  { number :: Text
+  , issuer :: Issuer
+  }
+  deriving (Eq, Generic, Hashable, Ord, Show, NFData)
+
+instance Resolve CreditCardNumberData where
+  type ResolvedValue CreditCardNumberData = CreditCardNumberValue
+  resolve _ _ CreditCardNumberData {number, issuer} =
+    Just (CreditCardNumberValue number issuer, False)
+
+data CreditCardNumberValue = CreditCardNumberValue
+  { vNumber :: Text
+  , vIssuer :: Issuer
+  }
+  deriving (Eq, Ord, Show)
+
+instance ToJSON CreditCardNumberValue where
+  toJSON (CreditCardNumberValue number issuer) =
+    object [ "value" .= number
+           , "issuer" .= issuer
+           ]
diff --git a/Duckling/Debug.hs b/Duckling/Debug.hs
--- a/Duckling/Debug.hs
+++ b/Duckling/Debug.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NamedFieldPuns #-}
@@ -37,20 +36,20 @@
 -- -----------------------------------------------------------------
 -- API
 
-debug :: Locale -> Text -> [Some Dimension] -> IO [Entity]
+debug :: Locale -> Text -> [Seal Dimension] -> IO [Entity]
 debug locale = debugCustom testContext {locale = locale} testOptions
 
-allParses :: Locale -> Text -> [Some Dimension] -> IO [Entity]
+allParses :: Locale -> Text -> [Seal Dimension] -> IO [Entity]
 allParses l sentence targets = debugTokens sentence $ parses l sentence targets
 
-fullParses :: Locale -> Text -> [Some Dimension] -> IO [Entity]
+fullParses :: Locale -> Text -> [Seal Dimension] -> IO [Entity]
 fullParses l sentence targets = debugTokens sentence .
   filter (\Resolved{range = Range start end} -> start == 0 && end == n) $
   parses l sentence targets
   where
     n = Text.length sentence
 
-debugCustom :: Context -> Options -> Text -> [Some Dimension] -> IO [Entity]
+debugCustom :: Context -> Options -> Text -> [Seal Dimension] -> IO [Entity]
 debugCustom context options sentence targets = debugTokens sentence .
   analyze sentence context options $ HashSet.fromList targets
 
@@ -60,12 +59,12 @@
 -- -----------------------------------------------------------------
 -- Internals
 
-parses :: Locale -> Text -> [Some Dimension] -> [ResolvedToken]
+parses :: Locale -> Text -> [Seal Dimension] -> [ResolvedToken]
 parses l sentence targets = flip filter tokens $
   \Resolved{node = Node{token = (Token d _)}} ->
     case targets of
       [] -> True
-      _ -> elem (This d) targets
+      _ -> elem (Seal d) targets
   where
     tokens = parseAndResolve rules sentence testContext {locale = l} testOptions
     rules = rulesFor l $ HashSet.fromList targets
diff --git a/Duckling/Dimensions.hs b/Duckling/Dimensions.hs
--- a/Duckling/Dimensions.hs
+++ b/Duckling/Dimensions.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -22,8 +21,11 @@
 import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.Dimensions.Common as CommonDimensions
+import qualified Duckling.Dimensions.AF as AFDimensions
 import qualified Duckling.Dimensions.AR as ARDimensions
 import qualified Duckling.Dimensions.BG as BGDimensions
+import qualified Duckling.Dimensions.BN as BNDimensions
+import qualified Duckling.Dimensions.CA as CADimensions
 import qualified Duckling.Dimensions.CS as CSDimensions
 import qualified Duckling.Dimensions.DA as DADimensions
 import qualified Duckling.Dimensions.DE as DEDimensions
@@ -31,6 +33,8 @@
 import qualified Duckling.Dimensions.EN as ENDimensions
 import qualified Duckling.Dimensions.ES as ESDimensions
 import qualified Duckling.Dimensions.ET as ETDimensions
+import qualified Duckling.Dimensions.FA as FADimensions
+import qualified Duckling.Dimensions.FI as FIDimensions
 import qualified Duckling.Dimensions.FR as FRDimensions
 import qualified Duckling.Dimensions.GA as GADimensions
 import qualified Duckling.Dimensions.HE as HEDimensions
@@ -38,10 +42,16 @@
 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.IS as ISDimensions
 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.KM as KMDimensions
+import qualified Duckling.Dimensions.KN as KNDimensions
 import qualified Duckling.Dimensions.KO as KODimensions
+import qualified Duckling.Dimensions.LO as LODimensions
+import qualified Duckling.Dimensions.ML as MLDimensions
+import qualified Duckling.Dimensions.MN as MNDimensions
 import qualified Duckling.Dimensions.MY as MYDimensions
 import qualified Duckling.Dimensions.NB as NBDimensions
 import qualified Duckling.Dimensions.NE as NEDimensions
@@ -50,44 +60,53 @@
 import qualified Duckling.Dimensions.PT as PTDimensions
 import qualified Duckling.Dimensions.RO as RODimensions
 import qualified Duckling.Dimensions.RU as RUDimensions
+import qualified Duckling.Dimensions.SK as SKDimensions
 import qualified Duckling.Dimensions.SV as SVDimensions
+import qualified Duckling.Dimensions.SW as SWDimensions
 import qualified Duckling.Dimensions.TA as TADimensions
+import qualified Duckling.Dimensions.TE as TEDimensions
+import qualified Duckling.Dimensions.TH as THDimensions
 import qualified Duckling.Dimensions.TR as TRDimensions
 import qualified Duckling.Dimensions.UK as UKDimensions
 import qualified Duckling.Dimensions.VI as VIDimensions
 import qualified Duckling.Dimensions.ZH as ZHDimensions
 
-allDimensions :: Lang -> [Some Dimension]
+
+allDimensions :: Lang -> [Seal Dimension]
 allDimensions lang = CommonDimensions.allDimensions ++ langDimensions lang
 
 -- | Augments `targets` with all dependent dimensions.
-explicitDimensions :: HashSet (Some Dimension) -> HashSet (Some Dimension)
+explicitDimensions :: HashSet (Seal Dimension) -> HashSet (Seal Dimension)
 explicitDimensions targets = HashSet.union targets deps
   where
     deps = HashSet.unions . map dependents $ HashSet.toList targets
 
 -- | Ordinal depends on Numeral for JA, KO, and ZH.
-dependents :: Some Dimension -> HashSet (Some Dimension)
-dependents (This Distance) = HashSet.singleton (This Numeral)
-dependents (This Duration) = HashSet.fromList [This Numeral, This TimeGrain]
-dependents (This Numeral) = HashSet.empty
-dependents (This Email) = HashSet.empty
-dependents (This AmountOfMoney) = HashSet.singleton (This Numeral)
-dependents (This Ordinal) = HashSet.singleton (This Numeral)
-dependents (This PhoneNumber) = HashSet.empty
-dependents (This Quantity) = HashSet.singleton (This Numeral)
-dependents (This RegexMatch) = HashSet.empty
-dependents (This Temperature) = HashSet.singleton (This Numeral)
-dependents (This Time) =
-  HashSet.fromList [This Numeral, This Duration, This Ordinal, This TimeGrain]
-dependents (This TimeGrain) = HashSet.empty
-dependents (This Url) = HashSet.empty
-dependents (This Volume) = HashSet.singleton (This Numeral)
-dependents (This (CustomDimension dim)) = dimDependents dim
+dependents :: Seal Dimension -> HashSet (Seal Dimension)
+dependents (Seal CreditCardNumber) = HashSet.empty
+dependents (Seal Distance) = HashSet.singleton (Seal Numeral)
+dependents (Seal Duration) = HashSet.fromList [Seal Numeral, Seal TimeGrain]
+dependents (Seal Numeral) = HashSet.empty
+dependents (Seal Email) = HashSet.empty
+dependents (Seal AmountOfMoney) = HashSet.singleton (Seal Numeral)
+dependents (Seal Ordinal) = HashSet.singleton (Seal Numeral)
+dependents (Seal PhoneNumber) = HashSet.empty
+dependents (Seal Quantity) = HashSet.singleton (Seal Numeral)
+dependents (Seal RegexMatch) = HashSet.empty
+dependents (Seal Temperature) = HashSet.singleton (Seal Numeral)
+dependents (Seal Time) =
+  HashSet.fromList [Seal Numeral, Seal Duration, Seal Ordinal, Seal TimeGrain]
+dependents (Seal TimeGrain) = HashSet.empty
+dependents (Seal Url) = HashSet.empty
+dependents (Seal Volume) = HashSet.singleton (Seal Numeral)
+dependents (Seal (CustomDimension dim)) = dimDependents dim
 
-langDimensions :: Lang -> [Some Dimension]
+langDimensions :: Lang -> [Seal Dimension]
+langDimensions AF = AFDimensions.allDimensions
 langDimensions AR = ARDimensions.allDimensions
 langDimensions BG = BGDimensions.allDimensions
+langDimensions BN = BNDimensions.allDimensions
+langDimensions CA = CADimensions.allDimensions
 langDimensions CS = CSDimensions.allDimensions
 langDimensions DA = DADimensions.allDimensions
 langDimensions DE = DEDimensions.allDimensions
@@ -95,6 +114,8 @@
 langDimensions EN = ENDimensions.allDimensions
 langDimensions ES = ESDimensions.allDimensions
 langDimensions ET = ETDimensions.allDimensions
+langDimensions FA = FADimensions.allDimensions
+langDimensions FI = FIDimensions.allDimensions
 langDimensions FR = FRDimensions.allDimensions
 langDimensions GA = GADimensions.allDimensions
 langDimensions HE = HEDimensions.allDimensions
@@ -102,10 +123,16 @@
 langDimensions HR = HRDimensions.allDimensions
 langDimensions HU = HUDimensions.allDimensions
 langDimensions ID = IDDimensions.allDimensions
+langDimensions IS = ISDimensions.allDimensions
 langDimensions IT = ITDimensions.allDimensions
 langDimensions JA = JADimensions.allDimensions
 langDimensions KA = KADimensions.allDimensions
+langDimensions KM = KMDimensions.allDimensions
+langDimensions KN = KNDimensions.allDimensions
 langDimensions KO = KODimensions.allDimensions
+langDimensions LO = LODimensions.allDimensions
+langDimensions ML = MLDimensions.allDimensions
+langDimensions MN = MNDimensions.allDimensions
 langDimensions MY = MYDimensions.allDimensions
 langDimensions NB = NBDimensions.allDimensions
 langDimensions NE = NEDimensions.allDimensions
@@ -114,8 +141,12 @@
 langDimensions PT = PTDimensions.allDimensions
 langDimensions RO = RODimensions.allDimensions
 langDimensions RU = RUDimensions.allDimensions
+langDimensions SK = SKDimensions.allDimensions
 langDimensions SV = SVDimensions.allDimensions
+langDimensions SW = SWDimensions.allDimensions
 langDimensions TA = TADimensions.allDimensions
+langDimensions TE = TEDimensions.allDimensions
+langDimensions TH = THDimensions.allDimensions
 langDimensions TR = TRDimensions.allDimensions
 langDimensions UK = UKDimensions.allDimensions
 langDimensions VI = VIDimensions.allDimensions
diff --git a/Duckling/Dimensions/AF.hs b/Duckling/Dimensions/AF.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/AF.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.
+
+
+module Duckling.Dimensions.AF
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/AR.hs b/Duckling/Dimensions/AR.hs
--- a/Duckling/Dimensions/AR.hs
+++ b/Duckling/Dimensions/AR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.AR
@@ -12,13 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/BG.hs b/Duckling/Dimensions/BG.hs
--- a/Duckling/Dimensions/BG.hs
+++ b/Duckling/Dimensions/BG.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.BG
@@ -12,10 +11,11 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/BN.hs b/Duckling/Dimensions/BN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/BN.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.
+
+
+module Duckling.Dimensions.BN
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/CA.hs b/Duckling/Dimensions/CA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/CA.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.
+
+
+module Duckling.Dimensions.CA
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/CS.hs b/Duckling/Dimensions/CS.hs
--- a/Duckling/Dimensions/CS.hs
+++ b/Duckling/Dimensions/CS.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.CS
@@ -12,8 +11,8 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Numeral
+  [ Seal Distance
+  , Seal Numeral
   ]
diff --git a/Duckling/Dimensions/Common.hs b/Duckling/Dimensions/Common.hs
--- a/Duckling/Dimensions/Common.hs
+++ b/Duckling/Dimensions/Common.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.Common
@@ -12,11 +11,12 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This AmountOfMoney
-  , This Email
-  , This Numeral
-  , This PhoneNumber
-  , This Url
+  [ Seal AmountOfMoney
+  , Seal CreditCardNumber
+  , Seal Email
+  , Seal Numeral
+  , Seal PhoneNumber
+  , Seal Url
   ]
diff --git a/Duckling/Dimensions/DA.hs b/Duckling/Dimensions/DA.hs
--- a/Duckling/Dimensions/DA.hs
+++ b/Duckling/Dimensions/DA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.DA
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/DE.hs b/Duckling/Dimensions/DE.hs
--- a/Duckling/Dimensions/DE.hs
+++ b/Duckling/Dimensions/DE.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.DE
@@ -12,10 +11,12 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/EL.hs b/Duckling/Dimensions/EL.hs
--- a/Duckling/Dimensions/EL.hs
+++ b/Duckling/Dimensions/EL.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.EL
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/EN.hs b/Duckling/Dimensions/EN.hs
--- a/Duckling/Dimensions/EN.hs
+++ b/Duckling/Dimensions/EN.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.EN
@@ -12,14 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/ES.hs b/Duckling/Dimensions/ES.hs
--- a/Duckling/Dimensions/ES.hs
+++ b/Duckling/Dimensions/ES.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.ES
@@ -12,13 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/ET.hs b/Duckling/Dimensions/ET.hs
--- a/Duckling/Dimensions/ET.hs
+++ b/Duckling/Dimensions/ET.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.ET
@@ -12,8 +11,8 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral
-  , This Ordinal
+  [ Seal Numeral
+  , Seal Ordinal
   ]
diff --git a/Duckling/Dimensions/FA.hs b/Duckling/Dimensions/FA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/FA.hs
@@ -0,0 +1,16 @@
+-- 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.
+
+module Duckling.Dimensions.FA
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions  =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/FI.hs b/Duckling/Dimensions/FI.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/FI.hs
@@ -0,0 +1,16 @@
+-- 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.
+
+module Duckling.Dimensions.FI
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions  =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/FR.hs b/Duckling/Dimensions/FR.hs
--- a/Duckling/Dimensions/FR.hs
+++ b/Duckling/Dimensions/FR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.FR
@@ -12,14 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/GA.hs b/Duckling/Dimensions/GA.hs
--- a/Duckling/Dimensions/GA.hs
+++ b/Duckling/Dimensions/GA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.GA
@@ -12,13 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/HE.hs b/Duckling/Dimensions/HE.hs
--- a/Duckling/Dimensions/HE.hs
+++ b/Duckling/Dimensions/HE.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.HE
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/HI.hs b/Duckling/Dimensions/HI.hs
--- a/Duckling/Dimensions/HI.hs
+++ b/Duckling/Dimensions/HI.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.HI
@@ -12,9 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Temperature
   ]
diff --git a/Duckling/Dimensions/HR.hs b/Duckling/Dimensions/HR.hs
--- a/Duckling/Dimensions/HR.hs
+++ b/Duckling/Dimensions/HR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.HR
@@ -12,14 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/HU.hs b/Duckling/Dimensions/HU.hs
--- a/Duckling/Dimensions/HU.hs
+++ b/Duckling/Dimensions/HU.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.HU
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/ID.hs b/Duckling/Dimensions/ID.hs
--- a/Duckling/Dimensions/ID.hs
+++ b/Duckling/Dimensions/ID.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.ID
@@ -12,8 +11,8 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral
-  , This Ordinal
+  [ Seal Numeral
+  , Seal Ordinal
   ]
diff --git a/Duckling/Dimensions/IS.hs b/Duckling/Dimensions/IS.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/IS.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.
+
+
+module Duckling.Dimensions.IS
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/IT.hs b/Duckling/Dimensions/IT.hs
--- a/Duckling/Dimensions/IT.hs
+++ b/Duckling/Dimensions/IT.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.IT
@@ -12,12 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/JA.hs b/Duckling/Dimensions/JA.hs
--- a/Duckling/Dimensions/JA.hs
+++ b/Duckling/Dimensions/JA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.JA
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Temperature
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Temperature
   ]
diff --git a/Duckling/Dimensions/KA.hs b/Duckling/Dimensions/KA.hs
--- a/Duckling/Dimensions/KA.hs
+++ b/Duckling/Dimensions/KA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.KA
@@ -12,6 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral ]
+  [ Seal Numeral
+  , Seal Ordinal
+  , Seal Duration
+  , Seal Time
+  ]
diff --git a/Duckling/Dimensions/KM.hs b/Duckling/Dimensions/KM.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/KM.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.
+
+
+module Duckling.Dimensions.KM
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Distance
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Volume
+  ]
diff --git a/Duckling/Dimensions/KN.hs b/Duckling/Dimensions/KN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/KN.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.
+
+
+module Duckling.Dimensions.KN
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/KO.hs b/Duckling/Dimensions/KO.hs
--- a/Duckling/Dimensions/KO.hs
+++ b/Duckling/Dimensions/KO.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.KO
@@ -12,14 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/LO.hs b/Duckling/Dimensions/LO.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/LO.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.
+
+
+module Duckling.Dimensions.LO
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/ML.hs b/Duckling/Dimensions/ML.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/ML.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.
+
+
+module Duckling.Dimensions.ML
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral,
+    Seal Ordinal
+  ]
diff --git a/Duckling/Dimensions/MN.hs b/Duckling/Dimensions/MN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/MN.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.
+
+
+module Duckling.Dimensions.MN
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Volume
+  ]
diff --git a/Duckling/Dimensions/MY.hs b/Duckling/Dimensions/MY.hs
--- a/Duckling/Dimensions/MY.hs
+++ b/Duckling/Dimensions/MY.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.MY
@@ -12,7 +11,7 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral
+  [ Seal Numeral
   ]
diff --git a/Duckling/Dimensions/NB.hs b/Duckling/Dimensions/NB.hs
--- a/Duckling/Dimensions/NB.hs
+++ b/Duckling/Dimensions/NB.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.NB
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/NE.hs b/Duckling/Dimensions/NE.hs
--- a/Duckling/Dimensions/NE.hs
+++ b/Duckling/Dimensions/NE.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.NE
@@ -12,7 +11,7 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral
+  [ Seal Numeral
   ]
diff --git a/Duckling/Dimensions/NL.hs b/Duckling/Dimensions/NL.hs
--- a/Duckling/Dimensions/NL.hs
+++ b/Duckling/Dimensions/NL.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.NL
@@ -12,12 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/PL.hs b/Duckling/Dimensions/PL.hs
--- a/Duckling/Dimensions/PL.hs
+++ b/Duckling/Dimensions/PL.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.PL
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/PT.hs b/Duckling/Dimensions/PT.hs
--- a/Duckling/Dimensions/PT.hs
+++ b/Duckling/Dimensions/PT.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.PT
@@ -12,14 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/RO.hs b/Duckling/Dimensions/RO.hs
--- a/Duckling/Dimensions/RO.hs
+++ b/Duckling/Dimensions/RO.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.RO
@@ -12,14 +11,14 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/RU.hs b/Duckling/Dimensions/RU.hs
--- a/Duckling/Dimensions/RU.hs
+++ b/Duckling/Dimensions/RU.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.RU
@@ -12,12 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Volume
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/SK.hs b/Duckling/Dimensions/SK.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/SK.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.SK
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/SV.hs b/Duckling/Dimensions/SV.hs
--- a/Duckling/Dimensions/SV.hs
+++ b/Duckling/Dimensions/SV.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.SV
@@ -12,11 +11,11 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/SW.hs b/Duckling/Dimensions/SW.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/SW.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.
+
+
+module Duckling.Dimensions.SW
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/TA.hs b/Duckling/Dimensions/TA.hs
--- a/Duckling/Dimensions/TA.hs
+++ b/Duckling/Dimensions/TA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.TA
@@ -12,7 +11,8 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral
+  [ Seal Numeral
+  , Seal Ordinal
   ]
diff --git a/Duckling/Dimensions/TE.hs b/Duckling/Dimensions/TE.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/TE.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.
+
+
+module Duckling.Dimensions.TE
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/TH.hs b/Duckling/Dimensions/TH.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/TH.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.
+
+
+module Duckling.Dimensions.TH
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Seal Dimension]
+allDimensions =
+  [ Seal Numeral
+  ]
diff --git a/Duckling/Dimensions/TR.hs b/Duckling/Dimensions/TR.hs
--- a/Duckling/Dimensions/TR.hs
+++ b/Duckling/Dimensions/TR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.TR
@@ -12,12 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Temperature
-  , This Volume
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Temperature
+  , Seal Time
+  , Seal Volume
   ]
diff --git a/Duckling/Dimensions/Types.hs b/Duckling/Dimensions/Types.hs
--- a/Duckling/Dimensions/Types.hs
+++ b/Duckling/Dimensions/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,7 +10,7 @@
 
 
 module Duckling.Dimensions.Types
-  ( Some(..)
+  ( Seal(..)
   , Dimension(..)
 
   , fromName
@@ -19,7 +18,6 @@
   ) where
 
 import Data.Maybe
-import Data.Some
 import Data.Text (Text)
 import Prelude
 import qualified Data.HashMap.Strict as HashMap
@@ -29,6 +27,7 @@
 
 toName :: Dimension a -> Text
 toName RegexMatch = "regex"
+toName CreditCardNumber = "credit-card-number"
 toName Distance = "distance"
 toName Duration = "duration"
 toName Email = "email"
@@ -44,20 +43,22 @@
 toName Volume = "volume"
 toName (CustomDimension dim) = Text.pack (show dim)
 
-fromName :: Text -> Maybe (Some Dimension)
+fromName :: Text -> Maybe (Seal Dimension)
 fromName name = HashMap.lookup name m
   where
     m = HashMap.fromList
-      [ ("amount-of-money", This AmountOfMoney)
-      , ("distance", This Distance)
-      , ("duration", This Duration)
-      , ("email", This Email)
-      , ("number", This Numeral)
-      , ("ordinal", This Ordinal)
-      , ("phone-number", This PhoneNumber)
-      , ("quantity", This Quantity)
-      , ("temperature", This Temperature)
-      , ("time", This Time)
-      , ("url", This Url)
-      , ("volume", This Volume)
+      [ ("amount-of-money", Seal AmountOfMoney)
+      , ("credit-card-number", Seal CreditCardNumber)
+      , ("distance", Seal Distance)
+      , ("duration", Seal Duration)
+      , ("email", Seal Email)
+      , ("number", Seal Numeral)
+      , ("ordinal", Seal Ordinal)
+      , ("phone-number", Seal PhoneNumber)
+      , ("quantity", Seal Quantity)
+      , ("temperature", Seal Temperature)
+      , ("time", Seal Time)
+      , ("time-grain", Seal TimeGrain)
+      , ("url", Seal Url)
+      , ("volume", Seal Volume)
       ]
diff --git a/Duckling/Dimensions/UK.hs b/Duckling/Dimensions/UK.hs
--- a/Duckling/Dimensions/UK.hs
+++ b/Duckling/Dimensions/UK.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.UK
@@ -12,8 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Numeral
-  , This Ordinal
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/VI.hs b/Duckling/Dimensions/VI.hs
--- a/Duckling/Dimensions/VI.hs
+++ b/Duckling/Dimensions/VI.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.VI
@@ -12,10 +11,10 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Duration
-  , This Numeral
-  , This Ordinal
-  , This Time
+  [ Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Time
   ]
diff --git a/Duckling/Dimensions/ZH.hs b/Duckling/Dimensions/ZH.hs
--- a/Duckling/Dimensions/ZH.hs
+++ b/Duckling/Dimensions/ZH.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.ZH
@@ -12,13 +11,13 @@
 
 import Duckling.Dimensions.Types
 
-allDimensions :: [Some Dimension]
+allDimensions :: [Seal Dimension]
 allDimensions =
-  [ This Distance
-  , This Duration
-  , This Numeral
-  , This Ordinal
-  , This Quantity
-  , This Temperature
-  , This Time
+  [ Seal Distance
+  , Seal Duration
+  , Seal Numeral
+  , Seal Ordinal
+  , Seal Quantity
+  , Seal Temperature
+  , Seal Time
   ]
diff --git a/Duckling/Distance/BG/Corpus.hs b/Duckling/Distance/BG/Corpus.hs
--- a/Duckling/Distance/BG/Corpus.hs
+++ b/Duckling/Distance/BG/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/BG/Rules.hs b/Duckling/Distance/BG/Rules.hs
--- a/Duckling/Distance/BG/Rules.hs
+++ b/Duckling/Distance/BG/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/CS/Rules.hs b/Duckling/Distance/CS/Rules.hs
--- a/Duckling/Distance/CS/Rules.hs
+++ b/Duckling/Distance/CS/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Distance/DE/Corpus.hs b/Duckling/Distance/DE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/DE/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.DE.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Distance.Types
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale DE Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Kilometre 3)
+             [ "3 kilometer"
+             , "3 km"
+             , "3km"
+             , "3,0 km"
+             ]
+  , examples (simple Mile 8)
+             [ "acht meilen"
+             , "8 meilen"
+             ]
+  , examples (simple Metre 9)
+             [ "9m"
+             ]
+  , examples (simple Centimetre 2)
+             [ "2cm"
+             , "2 zentimeter"
+             ]
+  , examples (simple Inch 5)
+             [ "5''"
+             , "fünf zoll"
+             , "5\""
+             ]
+  , examples (simple Metre 1.87)
+             [ "1,87 meter"
+             ]
+  , examples (between Kilometre (3, 5))
+             [ "zwischen 3 und 5 kilometern"
+             , "von 3km bis 5km"
+             , "um die 3-5 kilometer"
+             , "etwa 3km-5km"
+             , "3-5 kilometer"
+             ]
+  , examples (under Mile 3.5)
+             [ "unter 3,5 meilen"
+             , "weniger als 3,5meilen"
+             --, "niedriger als dreikommafünf meilen"
+             ]
+  , examples (above Inch 5)
+             [ "mehr als fünf zoll"
+             , "mindestens 5''"
+             , "über 5\""
+             ]
+  , examples (between Millimetre (5, 6))
+             [ "zwischen 5 und sechs Millimetern"
+             , "zwischen 5 und sechs millimeter"
+             , "5-6 mm"
+             ]
+  ]
diff --git a/Duckling/Distance/DE/Rules.hs b/Duckling/Distance/DE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/DE/Rules.hs
@@ -0,0 +1,172 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Distance.DE.Rules (rules) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Helpers
+import Duckling.Distance.Types (DistanceData(..))
+import qualified Duckling.Distance.Types as TDistance
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types (NumeralData(..))
+import qualified Duckling.Numeral.Types as TNumeral
+import Duckling.Types
+
+distances :: [(Text, String, TDistance.Unit)]
+distances =
+  [ -- Imperial
+    ("miles", "meilen?", TDistance.Mile)
+  , ("inch", "(\"|''|zoll)", TDistance.Inch)
+              -- Metric
+  , ("km", "k(ilo)?m(etern?)?", TDistance.Kilometre)
+  , ("meters", "m(etern?)?", TDistance.Metre)
+  , ("centimeters", "(cm|[zc]entimetern?)", TDistance.Centimetre)
+  , ("millimeters", "(mm|millimetern?)", TDistance.Millimetre)
+  ]
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <dist>"
+  , pattern =
+    [ regex "genau|exakt|präzise|ungefähr|(in )?etwa|nahe?( an)?|um( die)?|fast|rund|gut"
+    , dimension Distance
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleDistances :: [Rule]
+ruleDistances = map go distances
+  where
+    go :: (Text, String, TDistance.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [ dimension Distance, regex regexPattern ]
+      , prod = \case
+          (Token Distance dd:_) -> Just . Token Distance $ withUnit u dd
+          _ -> Nothing
+      }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <dist>"
+  , pattern =
+    [ regex "zwischen|von"
+    , Predicate isPositive
+    , regex "bis|und"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       _) | from < to ->
+        Just . Token Distance . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <dist> to|and <dist>"
+  , pattern =
+    [ regex "zwischen|von"
+    , Predicate isSimpleDistance
+    , regex "und|bis"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Distance DistanceData{TDistance.value = Just from, TDistance.unit = Just u1}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Distance . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <dist>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       _) | from < to ->
+         Just . Token Distance . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<dist> - <dist>"
+  , pattern =
+    [ Predicate isSimpleDistance
+    , regex "-"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Distance DistanceData{TDistance.value = Just from, TDistance.unit = Just u1}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Distance . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <dist>"
+  , pattern =
+    [ regex "unter|höchstens|maximal|(weniger|nicht mehr) als"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       _) -> Just . Token Distance . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "over/above/at least/more than <dist>"
+  , pattern =
+    [ regex "über|(mehr|nicht weniger) als|mindestens|wenigstens|minimal"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       _) -> Just . Token Distance . withMin to $ unitOnly u
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePrecision
+  ]
+    ++ ruleDistances
diff --git a/Duckling/Distance/EN/Corpus.hs b/Duckling/Distance/EN/Corpus.hs
--- a/Duckling/Distance/EN/Corpus.hs
+++ b/Duckling/Distance/EN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -51,6 +50,52 @@
   , examples (simple Metre 1.87)
              [ "1.87 meters"
              ]
+  -- Composite values:
+  , examples (simple Inch 94)
+             [ "7 feet and 10 inches"
+             , "7 feet, 10 inches"
+             , "7 feet 10 inches"
+             ]
+  , examples (simple Metre 2001)
+             [ "2 km and 1 meter"
+             , "2 kilometer, 1 metre"
+             , "2 kilometer 1 metre"
+             ]
+  , examples (simple Inch 166)
+             [ "2 yards 7 ft 10 inches"
+             , "2 yds, 7 feet and 10 inches"
+             , "2 yards, 7 feet, 10 in"
+             ]
+  , examples (simple Foot 13)
+             [ "2 yards and 7 feet"
+             , "2 yards, 7 feet"
+             , "2 yd 7'"
+             ]
+  , examples (simple Centimetre 1000806)
+             [ "10 kms 8 metres 6 cm"
+             , "10 kms, 8 meters, 6 cm"
+             , "10 kms, 8 meters and 6 centimeters"
+--             , "10 kms, 8 meters, and 6 cm" -- Oxford comma not supported
+             ]
+  , examples (simple Metre 1.3048)
+             [ "1 meter and 1 foot"
+             ]
+  , examples (simple Kilometre 2.609344)
+             [ "1 kilometer and 1 mile"
+             ]
+  , examples (simple M 3)
+             -- The original, ambiguous "m" unit is preserved
+             [ "3m"
+             ]
+  , examples (simple Centimetre 305)
+             -- The ambiguous "m" unit is inferred as "meteres"
+             [ "3m and 5cm"
+             ]
+  , examples (simple Foot 5281)
+             -- The ambiguous "m" unit is inferred as "miles"
+             [ "1m and 1ft"
+             ]
+  -- Ranges:
   , examples (between Kilometre (3, 5))
              [ "between 3 and 5 kilometers"
              , "from 3km to 5km"
diff --git a/Duckling/Distance/EN/Rules.hs b/Duckling/Distance/EN/Rules.hs
--- a/Duckling/Distance/EN/Rules.hs
+++ b/Duckling/Distance/EN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,54 +23,23 @@
 import Duckling.Numeral.Helpers
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
-import qualified Duckling.Distance.Types as TDistance
+import qualified Duckling.Distance.Types as TDist
 import qualified Duckling.Numeral.Types as TNumeral
 
-ruleDistanceFeetInch :: Rule
-ruleDistanceFeetInch = Rule
-  { name = "<distance|feet> <distance|inch>"
-  , pattern =
-    [ Predicate $ isDistanceOfUnit TDistance.Foot
-    , Predicate $ isDistanceOfUnit TDistance.Inch
-    ]
-  , prod = \case
-      (Token Distance DistanceData {TDistance.value = Just feet}:
-       Token Distance DistanceData {TDistance.value = Just inches}:
-       _) -> Just . Token Distance . withUnit TDistance.Inch . distance $
-        feet * 12 + inches
-      _ -> Nothing
-  }
 
-ruleDistanceFeetAndInch :: Rule
-ruleDistanceFeetAndInch = Rule
-  { name = "<distance|feet> and <distance|inch>"
-  , pattern =
-    [ Predicate $ isDistanceOfUnit TDistance.Foot
-    , regex "and"
-    , Predicate $ isDistanceOfUnit TDistance.Inch
-    ]
-  , prod = \case
-      (Token Distance DistanceData {TDistance.value = Just feet}:
-       _:
-       Token Distance DistanceData {TDistance.value = Just inches}:
-       _) -> Just . Token Distance . withUnit TDistance.Inch . distance $
-        feet * 12 + inches
-      _ -> Nothing
-  }
-
-distances :: [(Text, String, TDistance.Unit)]
+distances :: [(Text, String, TDist.Unit)]
 distances = [ -- Imperial
-              ("miles", "mi(le(s)?)?", TDistance.Mile)
-            , ("yard", "y(ar)?ds?", TDistance.Yard)
-            , ("feet", "('|f(oo|ee)?ts?)", TDistance.Foot)
-            , ("inch", "(\"|''|in(ch(es)?)?)", TDistance.Inch)
+              ("miles", "mi(le(s)?)?", TDist.Mile)
+            , ("yard", "y(ar)?ds?", TDist.Yard)
+            , ("feet", "('|f(oo|ee)?ts?)", TDist.Foot)
+            , ("inch", "(\"|''|in(ch(es)?)?)", TDist.Inch)
               -- Metric
-            , ("km", "k(ilo)?m?(et(er|re))?s?", TDistance.Kilometre)
-            , ("meters", "met(er|re)s?", TDistance.Metre)
-            , ("centimeters", "cm|centimet(er|re)s?", TDistance.Centimetre)
-            , ("millimeters", "mm|millimet(er|re)s?", TDistance.Millimetre)
+            , ("km", "k(ilo)?m?(et(er|re))?s?", TDist.Kilometre)
+            , ("meters", "met(er|re)s?", TDist.Metre)
+            , ("centimeters", "cm|centimet(er|re)s?", TDist.Centimetre)
+            , ("millimeters", "mm|millimet(er|re)s?", TDist.Millimetre)
               -- Ambiguous
-            , ("m (miles or meters)", "m", TDistance.M)
+            , ("m (miles or meters)", "m", TDist.M)
             ]
 
 rulePrecision :: Rule
@@ -89,7 +57,7 @@
 ruleDistances :: [Rule]
 ruleDistances = map go distances
   where
-    go :: (Text, String, TDistance.Unit) -> Rule
+    go :: (Text, String, TDist.Unit) -> Rule
     go (name, regexPattern, u) = Rule
       { name = name
       , pattern = [ dimension Distance, regex regexPattern ]
@@ -111,7 +79,7 @@
       (_:
        Token Numeral NumeralData{TNumeral.value = from}:
        _:
-       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       Token Distance DistanceData{TDist.value=Just to, TDist.unit=Just u}:
        _) | from < to ->
         Just . Token Distance . withInterval (from, to) $ unitOnly u
       _ -> Nothing
@@ -128,9 +96,9 @@
     ]
   , prod = \case
       (_:
-       Token Distance DistanceData{TDistance.value = Just from, TDistance.unit = Just u1}:
+       Token Distance DistanceData{TDist.value=Just from, TDist.unit=Just u1}:
        _:
-       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u2}:
+       Token Distance DistanceData{TDist.value=Just to, TDist.unit=Just u2}:
        _) | from < to && u1 == u2 ->
         Just . Token Distance . withInterval (from, to) $ unitOnly u1
       _ -> Nothing
@@ -147,7 +115,7 @@
   , prod = \case
       (Token Numeral NumeralData{TNumeral.value = from}:
        _:
-       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       Token Distance DistanceData{TDist.value=Just to, TDist.unit=Just u}:
        _) | from < to ->
          Just . Token Distance . withInterval (from, to) $ unitOnly u
       _ -> Nothing
@@ -162,9 +130,9 @@
     , Predicate isSimpleDistance
     ]
   , prod = \case
-      (Token Distance DistanceData{TDistance.value = Just from, TDistance.unit = Just u1}:
+      (Token Distance DistanceData{TDist.value=Just from, TDist.unit=Just u1}:
        _:
-       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u2}:
+       Token Distance DistanceData{TDist.value=Just to, TDist.unit=Just u2}:
        _) | from < to && u1 == u2 ->
         Just . Token Distance . withInterval (from, to) $ unitOnly u1
       _ -> Nothing
@@ -179,7 +147,7 @@
     ]
   , prod = \case
       (_:
-       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       Token Distance DistanceData{TDist.value=Just to, TDist.unit=Just u}:
        _) -> Just . Token Distance . withMax to $ unitOnly u
       _ -> Nothing
   }
@@ -193,20 +161,53 @@
     ]
   , prod = \case
       (_:
-       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u}:
+       Token Distance DistanceData{TDist.value=Just to, TDist.unit=Just u}:
        _) -> Just . Token Distance . withMin to $ unitOnly u
       _ -> Nothing
   }
 
+-- | NOTE: Oxford comma is not supported.
+ruleCompositeDistanceCommasAnd :: Rule
+ruleCompositeDistanceCommasAnd = Rule
+  { name = "composite <distance> (with ,/and)"
+  , pattern =
+    [ Predicate isSimpleDistance
+    , regex ",|and"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Distance DistanceData{TDist.value=Just v1, TDist.unit=Just u1}:
+       _:
+       Token Distance DistanceData{TDist.value=Just v2, TDist.unit=Just u2}:
+       _) | u1 /= u2 && v1 > 0 && v2 > 0 -> Token Distance <$>
+                                              distanceSum v1 u1 v2 u2
+      _ -> Nothing
+  }
+
+ruleCompositeDistance :: Rule
+ruleCompositeDistance = Rule
+  { name = "composite <distance>"
+  , pattern =
+    [ Predicate isSimpleDistance
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Distance DistanceData{TDist.value=Just v1, TDist.unit=Just u1}:
+       Token Distance DistanceData{TDist.value=Just v2, TDist.unit=Just u2}:
+       _) | u1 /= u2 && v1 > 0 && v2 > 0 -> Token Distance <$>
+                                              distanceSum v1 u1 v2 u2
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
-  [ ruleDistanceFeetInch
-  , ruleDistanceFeetAndInch
-  , ruleIntervalBetweenNumeral
+  [ ruleIntervalBetweenNumeral
   , ruleIntervalBetween
   , ruleIntervalMax
   , ruleIntervalMin
   , ruleIntervalNumeralDash
   , ruleIntervalDash
-  , rulePrecision]
-  ++ ruleDistances
+  , rulePrecision
+  , ruleCompositeDistanceCommasAnd
+  , ruleCompositeDistance
+  ] ++ ruleDistances
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Distance/HR/Rules.hs b/Duckling/Distance/HR/Rules.hs
--- a/Duckling/Distance/HR/Rules.hs
+++ b/Duckling/Distance/HR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/Helpers.hs b/Duckling/Distance/Helpers.hs
--- a/Duckling/Distance/Helpers.hs
+++ b/Duckling/Distance/Helpers.hs
@@ -2,14 +2,14 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 
 module Duckling.Distance.Helpers
   ( distance
+  , distanceSum
   , isDistanceOfUnit
   , isSimpleDistance
   , unitOnly
@@ -21,11 +21,13 @@
   ) where
 
 import Prelude
+import Data.Semigroup ((<>))
 
 import Duckling.Dimensions.Types
 import Duckling.Distance.Types (DistanceData(..))
 import Duckling.Types
 import qualified Duckling.Distance.Types as TDistance
+import qualified Duckling.DistanceUnits.Types as DGTypes
 
 -- -----------------------------------------------------------------
 -- Patterns
@@ -36,7 +38,8 @@
 isSimpleDistance _ = False
 
 isDistanceOfUnit :: TDistance.Unit -> Predicate
-isDistanceOfUnit unit (Token Distance DistanceData {TDistance.unit = Just u}) = unit == u
+isDistanceOfUnit unit (Token Distance DistanceData {TDistance.unit = Just u}) =
+    unit == u
 isDistanceOfUnit _ _ = False
 
 -- -----------------------------------------------------------------
@@ -47,6 +50,22 @@
                           , TDistance.unit = Nothing
                           , TDistance.minValue = Nothing
                           , TDistance.maxValue = Nothing}
+
+distanceSum ::
+     Double
+  -> TDistance.Unit
+  -> Double
+  -> TDistance.Unit
+  -> Maybe DistanceData
+distanceSum v1 u1 v2 u2 = unwrapContext $ cd1 <> cd2
+  where
+    wrapContext v u = DGTypes.ContextualDistance v $ DGTypes.toSystemUnit u
+    cd1 = wrapContext v1 u1
+    cd2 = wrapContext v2 u2
+
+    unwrapContext DGTypes.Nonrelatable = Nothing
+    unwrapContext (DGTypes.ContextualDistance v u) =
+        Just $ withUnit (DGTypes.toRawUnit u) $ distance v
 
 unitOnly :: TDistance.Unit -> DistanceData
 unitOnly u = DistanceData {TDistance.unit = Just u
diff --git a/Duckling/Distance/IT/Corpus.hs b/Duckling/Distance/IT/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/IT/Corpus.hs
@@ -0,0 +1,50 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.IT.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Distance.Types
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale IT Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Kilometre 3)
+             [ "3 kilometri"
+             , "3 chilometri"
+             , "3 km"
+             , "3km"
+             ]
+  , examples (simple Kilometre 3.0)
+             [ "3,0 km"
+             ]
+  , examples (simple Mile 8)
+             [ "8 miglia"
+             ]
+  , examples (simple Metre 9)
+             [ "9 metri"
+             , "9m"
+             ]
+  , examples (simple Centimetre 2)
+             [ "2cm"
+             , "2 centimetri"
+             ]
+  ]
diff --git a/Duckling/Distance/IT/Rules.hs b/Duckling/Distance/IT/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/IT/Rules.hs
@@ -0,0 +1,81 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.IT.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Helpers
+import Duckling.Types
+import qualified Duckling.Distance.Types as TDistance
+
+ruleLatentDistKm :: Rule
+ruleLatentDistKm = Rule
+  { name = "<latent dist> km"
+  , pattern =
+    [ dimension Distance
+    , regex "km|(k|ch)(ilo)?m?(etr)o?i?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Kilometre dd
+      _ -> Nothing
+  }
+
+ruleDistMeters :: Rule
+ruleDistMeters = Rule
+  { name = "<dist> meters"
+  , pattern =
+    [ dimension Distance
+    , regex "metro?i?|m"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Metre dd
+      _ -> Nothing
+  }
+
+ruleDistCentimeters :: Rule
+ruleDistCentimeters = Rule
+  { name = "<dist> centimeters"
+  , pattern =
+    [ dimension Distance
+    , regex "cm|centimetro?i?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Centimetre dd
+      _ -> Nothing
+  }
+
+ruleDistMiles :: Rule
+ruleDistMiles = Rule
+  { name = "<dist> miles"
+  , pattern =
+    [ dimension Distance
+    , regex "miglio?a?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Mile dd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDistCentimeters
+  , ruleDistMeters
+  , ruleDistMiles
+  , ruleLatentDistKm
+  ]
diff --git a/Duckling/Distance/KM/Corpus.hs b/Duckling/Distance/KM/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/KM/Corpus.hs
@@ -0,0 +1,59 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.KM.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Distance.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext{locale = makeLocale KM Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Kilometre 3)
+             [ "3 km"
+             , "៣គីឡូ"
+             , "បីគីឡូម៉ែត្រ"
+             ]
+  , examples (simple Centimetre 2)
+             [ "2cm"
+             , "២សង់ទីម៉ែត្រ"
+             , "ពីរសង់ទីម៉ែត្រ"
+             ]
+  , examples (between Metre (3, 5))
+             [ "ចាប់ពី 3 ដល់ 5 m"
+             , "ចន្លោះពី ៣ ដល់ ៥ម៉ែត្រ"
+             , "ចន្លោះ ៣ម៉ែត្រ និង ៥ម៉ែត្រ"
+             , "ប្រហែល ៣-៥ ម៉ែត្រ"
+             , "~3-5ម៉ែត្រ"
+             ]
+  , examples (under Centimetre 4)
+             [ "តិចជាងបួនសង់ទីម៉ែត្រ"
+             , "មិនលើស៤សង់ទីម៉ែត្រ"
+             , "ក្រោម៤សង់ទីម៉ែត្រ"
+             , "យ៉ាងច្រើន៤សង់ទីម៉ែត្រ"
+             ]
+  , examples (above Millimetre 10)
+             [ "ច្រើនជាងដប់មីលីម៉ែត្រ"
+             , "មិនតិចជាងដប់មីលីម៉ែត្រ"
+             , "លើសពីដប់មីលីម៉ែត្រ"
+             , "យ៉ាងតិចដប់មីលីម៉ែត្រ"
+             ]
+  ]
diff --git a/Duckling/Distance/KM/Rules.hs b/Duckling/Distance/KM/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/KM/Rules.hs
@@ -0,0 +1,178 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.KM.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Helpers
+import Duckling.Distance.Types (DistanceData(..))
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Types
+import qualified Duckling.Distance.Types as TDistance
+import qualified Duckling.Numeral.Types as TNumeral
+
+distances :: [(Text, String, TDistance.Unit)]
+distances = [ ("km", "km|គីឡូ(ម៉ែត្រ)?", TDistance.Kilometre)
+            , ("meters", "m|ម៉ែត្រ", TDistance.Metre)
+            , ("centimeters", "cm|សង់ទីម៉ែត្រ", TDistance.Centimetre)
+            , ("millimeters", "mm|មីលីម៉ែត្រ", TDistance.Millimetre)
+            ]
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <dist>"
+  , pattern =
+    [ regex "\\~|ប្រហែល"
+    , dimension Distance
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleDistances :: [Rule]
+ruleDistances = map go distances
+  where
+    go :: (Text, String, TDistance.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [ dimension Distance, regex regexPattern ]
+      , prod = \case
+          (Token Distance dd:_) -> Just . Token Distance $ withUnit u dd
+          _ -> Nothing
+      }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <dist>"
+  , pattern =
+    [ regex "ចន្លោះ(ពី)?|ចាប់ពី"
+    , Predicate isPositive
+    , regex "និង|ដល់"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to,
+                                   TDistance.unit = Just u}:
+       _) | from < to ->
+        Just . Token Distance . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <dist> to|and <dist>"
+  , pattern =
+    [ regex "ចន្លោះ(ពី)?|ចាប់ពី"
+    , Predicate isSimpleDistance
+    , regex "និង|ដល់"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Distance DistanceData{TDistance.value = Just from,
+                                   TDistance.unit = Just u1}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to,
+                                   TDistance.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Distance . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <dist>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to,
+                                   TDistance.unit = Just u}:
+       _) | from < to ->
+         Just . Token Distance . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<dist> - <dist>"
+  , pattern =
+    [ Predicate isSimpleDistance
+    , regex "-"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Distance DistanceData{TDistance.value = Just from,
+                                   TDistance.unit = Just u1}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to,
+                                   TDistance.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Distance . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "Max Rule"
+  , pattern =
+    [ regex "ក្រោម|តិចជាង|មិនដល់|យ៉ាងច្រើន|មិនលើស"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Distance DistanceData{TDistance.value = Just to,
+                                   TDistance.unit = Just u}:
+       _) -> Just . Token Distance . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "Min Rule"
+  , pattern =
+    [ regex "លើស(ពី)?|មិនតិចជាង|លើ|ច្រើនជាង|យ៉ាងតិច|យ៉ាងហោច"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (_:
+       Token Distance DistanceData{TDistance.value = Just to,
+                                   TDistance.unit = Just u}:
+       _) -> Just . Token Distance . withMin to $ unitOnly u
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePrecision
+  ]
+  ++ ruleDistances
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Distance/MN/Corpus.hs b/Duckling/Distance/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/MN/Corpus.hs
@@ -0,0 +1,57 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.MN.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Distance.Types
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Kilometre 3)
+             [ "3 километр"
+             , "3 км"
+             , "3км"
+             ]
+  , examples (simple Mile 8)
+             [ "8 миль"
+             ]
+  , examples (simple Metre 1)
+             [ "1 м"
+             , "1 метр"
+             ]
+  , examples (simple Centimetre 2)
+             [ "2см"
+             ]
+  , examples (simple Millimetre 4)
+             [ "4мм"
+             , "4 миллиметр"
+             ]
+  , examples (simple Inch 5)
+             [ "5 инч"
+             , "5\""
+             ]
+  , examples (simple Foot 35)
+             [ "35 фут"
+             , "35'"
+             ]
+  , examples (simple Yard 47)
+             [ "47 яард"
+             ]
+  ]
diff --git a/Duckling/Distance/MN/Rules.hs b/Duckling/Distance/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/MN/Rules.hs
@@ -0,0 +1,49 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Distance.MN.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Helpers
+import Duckling.Distance.Types (DistanceData(..))
+import Duckling.Types
+import qualified Duckling.Distance.Types as TDistance
+
+distances :: [(Text, String, TDistance.Unit)]
+distances = [ ("<latent dist> km", "км|километр", TDistance.Kilometre)
+            , ("<latent dist> feet", "('|фут)", TDistance.Foot)
+            , ("<latent dist> inch", "(\"|''|дюйм|инч)", TDistance.Inch)
+            , ("<latent dist> yard", "яард", TDistance.Yard)
+            , ("<dist> meters", "м(етр(ийн|ээр)?)?", TDistance.Metre)
+            , ("<dist> centimeters", "см|сантиметр", TDistance.Centimetre)
+            , ("<dist> millimeters", "мм|миллиметр", TDistance.Millimetre)
+            , ("<dist> miles", "мил(и|ь)", TDistance.Mile)
+            ]
+
+ruleDistances :: [Rule]
+ruleDistances = map go distances
+  where
+    go :: (Text, String, TDistance.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [ dimension Distance, regex regexPattern ]
+      , prod = \tokens -> case tokens of
+          (Token Distance dd:_) -> Just . Token Distance $ withUnit u dd
+          _ -> Nothing
+      }
+
+rules :: [Rule]
+rules = ruleDistances
diff --git a/Duckling/Distance/NL/Corpus.hs b/Duckling/Distance/NL/Corpus.hs
--- a/Duckling/Distance/NL/Corpus.hs
+++ b/Duckling/Distance/NL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/NL/Rules.hs b/Duckling/Distance/NL/Rules.hs
--- a/Duckling/Distance/NL/Rules.hs
+++ b/Duckling/Distance/NL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Distance/RU/Corpus.hs b/Duckling/Distance/RU/Corpus.hs
--- a/Duckling/Distance/RU/Corpus.hs
+++ b/Duckling/Distance/RU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/RU/Rules.hs b/Duckling/Distance/RU/Rules.hs
--- a/Duckling/Distance/RU/Rules.hs
+++ b/Duckling/Distance/RU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Distance/Rules.hs b/Duckling/Distance/Rules.hs
--- a/Duckling/Distance/Rules.hs
+++ b/Duckling/Distance/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Distance/SV/Corpus.hs b/Duckling/Distance/SV/Corpus.hs
--- a/Duckling/Distance/SV/Corpus.hs
+++ b/Duckling/Distance/SV/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/SV/Rules.hs b/Duckling/Distance/SV/Rules.hs
--- a/Duckling/Distance/SV/Rules.hs
+++ b/Duckling/Distance/SV/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Distance/TR/Rules.hs b/Duckling/Distance/TR/Rules.hs
--- a/Duckling/Distance/TR/Rules.hs
+++ b/Duckling/Distance/TR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Distance/Types.hs b/Duckling/Distance/Types.hs
--- a/Duckling/Distance/Types.hs
+++ b/Duckling/Distance/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
diff --git a/Duckling/Distance/ZH/Corpus.hs b/Duckling/Distance/ZH/Corpus.hs
--- a/Duckling/Distance/ZH/Corpus.hs
+++ b/Duckling/Distance/ZH/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -68,5 +67,31 @@
              , "1 miles"
              , "1英里"
              , "一英裏"
+             ]
+  , examples (simple Metre 1.9)
+             [ "1.9 m"
+             , "1.9米"
+             , "米九"
+             ]
+  , examples (simple Metre 3.9)
+             [ "3.9 m"
+             , "3.9米"
+             , "三米九"
+             ]
+  , examples (between Metre (1.6, 3.9))
+             [ "1.6m-3.9m"
+             , "1.6~3.9米"
+             , "一點六至三點九公尺"
+             , "米六到三米九"
+             ]
+  , examples (under Mile 3.5)
+             [ "最多三點五英里"
+             , "3.5英裏以下"
+             ]
+  , examples (above Inch 5)
+             [ "至少5\""
+             , "最少五吋"
+             , "五英吋以上"
+             , "起碼五英寸"
              ]
   ]
diff --git a/Duckling/Distance/ZH/Rules.hs b/Duckling/Distance/ZH/Rules.hs
--- a/Duckling/Distance/ZH/Rules.hs
+++ b/Duckling/Distance/ZH/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,7 +17,10 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Distance.Helpers
-import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Distance.Types (DistanceData(..))
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types
+import Duckling.Regex.Types
 import Duckling.Types
 import qualified Duckling.Distance.Types as TDistance
 import qualified Duckling.Numeral.Types as TNumeral
@@ -70,7 +72,7 @@
     [ dimension Distance
     , regex "'|f(oo|ee)?ts?|英尺|呎"
     , dimension Distance
-    , regex "''|inch(es)?|英寸|英吋|吋"
+    , regex "''|\"|inch(es)?|英寸|英吋|吋"
     ]
   , prod = \case
       (Token Distance dd:_) ->
@@ -83,7 +85,7 @@
   { name = "<dist> inch"
   , pattern =
     [ dimension Distance
-    , regex "''|inch(es)?|英寸|英吋|吋"
+    , regex "''|\"|inch(es)?|英寸|英吋|吋"
     ]
   , prod = \case
       (Token Distance dd:_) ->
@@ -117,6 +119,107 @@
       _ -> Nothing
   }
 
+ruleDistOneMeterAnd :: Rule
+ruleDistOneMeterAnd = Rule
+  { name = "one meter and <dist>"
+  , pattern =
+    [ regex "米"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Distance $ withUnit TDistance.Metre (distance (1 + v/10))
+      _ -> Nothing
+  }
+
+ruleDistMetersAnd :: Rule
+ruleDistMetersAnd = Rule
+  { name = "<dist> meters and <dist>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "米"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:_:
+        Token Numeral NumeralData{TNumeral.value = v2}:_) ->
+        Just . Token Distance $ withUnit TDistance.Metre (distance (v1 + v2/10))
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <dist>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-|~|到|至"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to,
+       TDistance.unit = Just u}:_) | from < to ->
+         Just $ Token Distance $ withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<dist> - <dist>"
+  , pattern =
+    [ Predicate isSimpleDistance
+    , regex "-|~|到|至"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token Distance DistanceData{TDistance.value = Just from,
+                  TDistance.unit = Just u1}:
+       _:
+       Token Distance DistanceData{TDistance.value = Just to, TDistance.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+         Just $ Token Distance $ withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalBound :: Rule
+ruleIntervalBound = Rule
+  { name = "under/less/lower/no more than <amount-of-money> (最多|至少|最少)"
+  , pattern =
+    [ regex "(最多|至少|最少|起碼)"
+    , Predicate isSimpleDistance
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       Token Distance DistanceData{TDistance.value = Just to,
+                  TDistance.unit = Just u}:
+       _) -> case match of
+        "最多" -> Just $ Token Distance $ withMax to $ unitOnly u
+        "最少" -> Just $ Token Distance $ withMin to $ unitOnly u
+        "至少" -> Just $ Token Distance $ withMin to $ unitOnly u
+        "起碼" -> Just $ Token Distance $ withMin to $ unitOnly u
+        _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleIntervalBound2 :: Rule
+ruleIntervalBound2 = Rule
+  { name = "under/less/lower/no more than <amount-of-money> (以下|以上)"
+  , pattern =
+    [ Predicate isSimpleDistance
+    , regex "(以下|以上)"
+    ]
+  , prod = \case
+      (Token Distance DistanceData{TDistance.value = Just to,
+                  TDistance.unit = Just u}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case match of
+        "以下" -> Just $ Token Distance $ withMax to $ unitOnly u
+        "以上" -> Just $ Token Distance $ withMin to $ unitOnly u
+        _ -> Nothing
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleDistCentimeters
@@ -126,4 +229,12 @@
   , ruleDistKm
   , ruleDistMeters
   , ruleDistMiles
+  , ruleDistOneMeterAnd
+  , ruleDistMetersAnd
+  , ruleDistOneMeterAnd
+  , ruleDistMetersAnd
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , ruleIntervalBound
+  , ruleIntervalBound2
   ]
diff --git a/Duckling/DistanceUnits/Types.hs b/Duckling/DistanceUnits/Types.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/DistanceUnits/Types.hs
@@ -0,0 +1,190 @@
+-- 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.
+
+
+-- | This module shadows names of some units previously defined in
+-- 'Duckling.Distance.Types'.
+-- Therefore, the units from that module must be used qualified by module.
+module Duckling.DistanceUnits.Types
+  ( ContextualDistance (..)
+  , toSystemUnit
+  , toRawUnit
+  ) where
+
+import Data.Semigroup
+import Data.Tuple.Extra (both)
+import Prelude
+
+import qualified Duckling.Distance.Types as TDist
+
+
+-- | Supports deferred resolution of ambiguous units.
+-- Note that this sum type cannot be simply replaced by
+-- "Maybe (ContextualDistance Double DeferrableUnit)"
+-- (with "Nothing" representing "Nonrelatable").
+-- See "NOTE A" below.
+data ContextualDistance
+  = Nonrelatable
+    -- ^ If two different ambiguous units were to be composed, then
+    -- it would not be possible to decide which to resolve to. As of today,
+    -- this won't happen since for now "M" is the lone ambiguous unit.
+  | ContextualDistance Double DeferrableUnit
+
+-- | This represents Units that have not yet been established as unrelatable.
+-- The "Definite" constructor is purposely listed in front of "Ambiguous",
+-- so that it will be preferred when taking choosing the "min" between
+-- an "Ambiguous" and "Definite" unit.
+data DeferrableUnit
+  = Definite SystemUnit
+  | Ambiguous AmbiguousUnit
+  deriving (Eq, Ord)
+
+-- | These measurement-system-specific units exist to disambiguate
+-- the \"M\" of the 'Unit' type and to maintain the measurement-system context
+-- for resolving to the appropriate precision.
+--
+-- It's also just handy to have separate programmatically accessible lists
+-- of units for each type of measurement system.
+data SystemUnit
+  = Metric MetricUnit
+  | Imperial ImperialUnit
+  deriving (Eq, Ord)
+
+data ImperialUnit
+  = Inch
+  | Foot
+  | Yard
+  | Mile
+  deriving (Eq, Ord)
+
+data MetricUnit
+  = Millimetre
+  | Centimetre
+  | Metre
+  | Kilometre
+  deriving (Eq, Ord)
+
+-- | Currently there is only one actually ambiguous unit, but this design allows
+-- for expansion.
+data AmbiguousUnit
+  = M -- ^ "Miles" or "Metres"
+  deriving (Eq, Ord)
+
+-- | Represents a value with an unambiguous unit
+data UnitValuePair = UnitValuePair SystemUnit Double
+
+sumScaledUnits :: SystemUnit -> (UnitValuePair, UnitValuePair) -> Double
+sumScaledUnits preferredUnit = uncurry (+) . both (scaleUnits preferredUnit)
+
+-- | Determine the definite meaning of an "Ambiguous" unit using the context of
+-- another "Definite" unit
+reconcileAmbiguousWithDefinite ::
+     Double
+  -> AmbiguousUnit
+  -> Double
+  -> SystemUnit
+  -> ContextualDistance
+reconcileAmbiguousWithDefinite av au dv du =
+  ContextualDistance combinedValue $ Definite preferredUnit
+  where
+    resolvedAmbiguousUnit = resolveUnit au du
+    preferredUnit = du `min` resolvedAmbiguousUnit
+    combinedValue = sumScaledUnits preferredUnit
+      (UnitValuePair resolvedAmbiguousUnit av, UnitValuePair du dv)
+
+-- | When both Metric and Imperial units are given, resolve to Metric.
+-- Otherwise, preserve the original measurement system and use the smaller unit.
+-- For the purpose of this resolution, all Metric units are considered "smaller"
+-- than Imperial units.
+instance Semigroup ContextualDistance where
+
+  _ <> Nonrelatable = Nonrelatable
+  Nonrelatable <> _ = Nonrelatable
+
+  (ContextualDistance v1 u@(Ambiguous u1))
+    <> (ContextualDistance v2 (Ambiguous u2))
+      | u1 == u2  = ContextualDistance (v1 + v2) u
+      | otherwise = Nonrelatable
+      -- NOTE A: Needing to return "Nonrelatable" in this edge case is why
+      -- the two-member "ContextualDistance" sum type cannot be simply
+      -- represented as (Maybe (ContextualDistance Double DeferrableUnit)).
+
+  (ContextualDistance av (Ambiguous au))
+    <> (ContextualDistance dv (Definite du)) =
+      reconcileAmbiguousWithDefinite av au dv du
+
+  (ContextualDistance dv (Definite du))
+    <> (ContextualDistance av (Ambiguous au)) =
+      reconcileAmbiguousWithDefinite av au dv du
+
+  (ContextualDistance v1 (Definite u1))
+    <> (ContextualDistance v2 (Definite u2)) =
+      ContextualDistance v $ Definite u
+      where
+        v = sumScaledUnits u (UnitValuePair u1 v1, UnitValuePair u2 v2)
+        u = u1 `min` u2
+
+resolveUnit :: AmbiguousUnit -> SystemUnit -> SystemUnit
+resolveUnit M (Metric _) = Metric Metre
+resolveUnit M (Imperial _) = Imperial Mile
+
+
+-- | Disambiguation of original Unit type
+toSystemUnit :: TDist.Unit -> DeferrableUnit
+toSystemUnit TDist.M          = Ambiguous M
+toSystemUnit TDist.Millimetre = Definite $ Metric Millimetre
+toSystemUnit TDist.Centimetre = Definite $ Metric Centimetre
+toSystemUnit TDist.Metre      = Definite $ Metric Metre
+toSystemUnit TDist.Kilometre  = Definite $ Metric Kilometre
+toSystemUnit TDist.Inch       = Definite $ Imperial Inch
+toSystemUnit TDist.Foot       = Definite $ Imperial Foot
+toSystemUnit TDist.Yard       = Definite $ Imperial Yard
+toSystemUnit TDist.Mile       = Definite $ Imperial Mile
+
+-- | Reconversion to original Unit type
+toRawUnit :: DeferrableUnit -> TDist.Unit
+toRawUnit (Ambiguous M) = TDist.M
+toRawUnit (Definite (Metric Millimetre)) = TDist.Millimetre
+toRawUnit (Definite (Metric Centimetre)) = TDist.Centimetre
+toRawUnit (Definite (Metric Metre)) = TDist.Metre
+toRawUnit (Definite (Metric Kilometre)) = TDist.Kilometre
+toRawUnit (Definite (Imperial Inch)) = TDist.Inch
+toRawUnit (Definite (Imperial Foot)) = TDist.Foot
+toRawUnit (Definite (Imperial Yard)) = TDist.Yard
+toRawUnit (Definite (Imperial Mile)) = TDist.Mile
+
+-- | Convert a distance to the given units.
+-- This only works if the unit is unambiguous.
+scaleUnits ::
+     SystemUnit -- ^ target unit
+  -> UnitValuePair -- ^ Original unit and value
+  -> Double
+scaleUnits targetUnit (UnitValuePair startingUnit v)
+  | startingUnit == targetUnit = v
+  | otherwise = inSIUnits v startingUnit / inSIUnits 1 targetUnit
+
+-- | This is used when distances
+-- must be normalized across measurement systems.
+-- The Metric metre is the Standard International unit of distance.
+inSIUnits :: Double -> SystemUnit -> Double
+inSIUnits val (Metric u) = inMetres u val
+inSIUnits val (Imperial u) = inInches u val * metersPerInch
+
+-- | This conversion factor is exact.
+metersPerInch :: Double
+metersPerInch = 0.0254
+
+inMetres :: Fractional a => MetricUnit -> a -> a
+inMetres Millimetre n = n / 1000
+inMetres Centimetre n = n / 100
+inMetres Metre      n = n
+inMetres Kilometre  n = n * 1000
+
+inInches :: Num a => ImperialUnit -> a -> a
+inInches Inch n = n
+inInches Foot n = 12   * n
+inInches Yard n = 3    * inInches Foot n
+inInches Mile n = 5280 * inInches Foot n
diff --git a/Duckling/Duration/AR/Corpus.hs b/Duckling/Duration/AR/Corpus.hs
--- a/Duckling/Duration/AR/Corpus.hs
+++ b/Duckling/Duration/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/AR/Rules.hs b/Duckling/Duration/AR/Rules.hs
--- a/Duckling/Duration/AR/Rules.hs
+++ b/Duckling/Duration/AR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Duration/BG/Corpus.hs b/Duckling/Duration/BG/Corpus.hs
--- a/Duckling/Duration/BG/Corpus.hs
+++ b/Duckling/Duration/BG/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/BG/Rules.hs b/Duckling/Duration/BG/Rules.hs
--- a/Duckling/Duration/BG/Rules.hs
+++ b/Duckling/Duration/BG/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -37,7 +36,7 @@
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
-      (_:Token TimeGrain grain:_) -> Token Duration <$> timesOneAndAHalf grain 0
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 0
       _ -> Nothing
   }
 
@@ -49,7 +48,7 @@
     , regex "и половина"
     ]
   , prod = \tokens -> case tokens of
-      (Token TimeGrain grain:_) -> Token Duration <$> timesOneAndAHalf grain 1
+      (Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 1
       _ -> Nothing
   }
 
@@ -64,7 +63,7 @@
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v}:
        Token TimeGrain grain:
-       _) -> timesOneAndAHalf grain (floor $ v) >>= Just . Token Duration
+       _) -> nPlusOneHalf grain (floor $ v) >>= Just . Token Duration
       _ -> Nothing
   }
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,136 +2,248 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Duration.DE.Rules
   ( rules ) where
 
-import Control.Monad (join)
-import qualified Data.Text as Text
-import Prelude
-import Data.String
 
 import Duckling.Dimensions.Types
 import Duckling.Duration.Helpers
-import Duckling.Numeral.Helpers (parseInteger)
-import Duckling.Numeral.Types (NumeralData (..))
-import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Regex.Types
+import Control.Monad (join)
+import qualified Data.Text as Text
+import Prelude
+import Duckling.Numeral.Helpers (parseInteger)
+import Duckling.Duration.Types (DurationData(..))
+import qualified Duckling.Duration.Types as TDuration
+import Data.String
+import Duckling.Numeral.Types (NumeralData(..))
 import qualified Duckling.TimeGrain.Types as TG
+import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Types
 
+ruleQuarterOfAnHour :: Rule
+ruleQuarterOfAnHour = Rule
+  { name = "quarter of an hour"
+  , pattern =
+    [ regex "(einer? )?Viertelstunde"
+    ]
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 15
+  }
+
 ruleHalfAnHour :: Rule
 ruleHalfAnHour = Rule
   { name = "half an hour"
   , pattern =
-    [ regex "(1/2\\s?|(einer )halbe?n? )stunde"
+    [ regex "(1/2\\s?|(eine )?halbe |(einer )?halben )stunde"
     ]
-  , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 30
   }
 
+ruleThreeQuartersOfAnHour :: Rule
+ruleThreeQuartersOfAnHour = Rule
+  { name = "three-quarters of an hour"
+  , pattern =
+    [ regex "3/4\\s?stunde|(einer? )?dreiviertel stunde|drei viertelstunden"
+    ]
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 45
+  }
+
 ruleFortnight :: Rule
 ruleFortnight = Rule
   { name = "fortnight"
   , pattern =
-    [ regex "(a|one)? fortnight"
+    [ regex "zwei Wochen"
     ]
-  , prod = \_ -> Just . Token Duration $ duration TG.Day 14
+  , prod = \_ -> Just $ Token Duration $ duration TG.Day 14
   }
 
-ruleIntegerMoreUnitofduration :: Rule
-ruleIntegerMoreUnitofduration = Rule
-  { name = "<integer> more <unit-of-duration>"
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about|exactly <duration>"
   , pattern =
-    [ Predicate isNatural
-    , regex "mehr|weniger"
-    , dimension TimeGrain
+    [ regex "ungef(ä|a)hr|zirka|genau|exakt"
+    , dimension Duration
     ]
-  , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v}:
-       _:
-       Token TimeGrain grain:
-       _) -> Just . Token Duration . duration grain $ floor v
+  , prod = \case
+      (_:token:_) -> Just token
       _ -> Nothing
   }
 
-ruleNumeralnumberHours :: Rule
-ruleNumeralnumberHours = Rule
-  { name = "number.number hours"
+ruleCommaNumeralHours :: Rule
+ruleCommaNumeralHours = Rule
+  { name = "number,number hours"
   , pattern =
-    [ regex "(\\d+)\\.(\\d+) stunden?"
+    [ regex "(\\d+),(\\d+)"
+    , Predicate $ isGrain TG.Hour
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (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
+        Just $ Token Duration $ minutesFromHourMixedFraction hh mnum mden
       _ -> Nothing
   }
 
-ruleIntegerAndAnHalfHours :: Rule
-ruleIntegerAndAnHalfHours = Rule
-  { name = "<integer> and an half hours"
+ruleCommaNumeralMinutes :: Rule
+ruleCommaNumeralMinutes = Rule
+  { name = "number,number minutes"
   , pattern =
+    [ regex "(\\d+),(\\d+)"
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m:s:_)):_) -> do
+        mm <- parseInteger m
+        ss <- parseInteger s
+        let sden = 10 ^ Text.length s
+        Just $ Token Duration $ secondsFromHourMixedFraction mm ss sden
+      _ -> Nothing
+  }
+
+ruleAndHalfHour :: Rule
+ruleAndHalfHour = Rule
+  { name = "<integer> and a half hour"
+  , pattern =
     [ Predicate isNatural
-    , regex "ein ?halb stunden?"
+    , regex "(und )?(ein(en?)? )?halb(en?)?"
+    , Predicate $ isGrain TG.Hour
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:_) ->
-        Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
+        Just $ Token Duration $ duration TG.Minute $ 30 + 60 * floor v
       _ -> Nothing
   }
 
-ruleAUnitofduration :: Rule
-ruleAUnitofduration = Rule
+ruleAndHalfMinute :: Rule
+ruleAndHalfMinute = Rule
+  { name = "<integer> and a half minutes"
+  , pattern =
+    [ Predicate isNatural
+    , regex "(und )?(ein(en?)? ?)?halb(en?)?"
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just $ Token Duration $ duration TG.Second $ 30 + 60 * floor v
+      _ -> Nothing
+  }
+
+ruleArticle :: Rule
+ruleArticle = Rule
   { name = "a <unit-of-duration>"
   , pattern =
-    [ regex "eine?(r|n)?"
+    [ regex "ein(en?)?"
     , dimension TimeGrain
     ]
-  , prod = \tokens -> case tokens of
-      (_:Token TimeGrain grain:_) -> Just . Token Duration $ duration grain 1
+  , prod = \case
+      (_:Token TimeGrain grain:_) -> Just $ Token Duration $ duration grain 1
       _ -> Nothing
   }
 
-ruleAboutDuration :: Rule
-ruleAboutDuration = Rule
-  { name = "about <duration>"
+ruleHalfTimeGrain :: Rule
+ruleHalfTimeGrain = Rule
+  { name = "half a <time-grain>"
   , pattern =
-    [ regex "ungefähr|zirka"
+    [ regex "(ein(en)?)?(1/2|halbe?)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 0
+      _ -> Nothing
+  }
+
+ruleCompositeDurationCommasAnd :: Rule
+ruleCompositeDurationCommasAnd = Rule
+  { name = "composite <duration> (with ,/and)"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|und"
     , dimension Duration
     ]
-  , prod = \tokens -> case tokens of
-      (_:token:_) -> Just token
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g (floor v) <> dd
       _ -> Nothing
   }
 
-ruleExactlyDuration :: Rule
-ruleExactlyDuration = Rule
-  { name = "exactly <duration>"
+ruleCompositeDuration :: Rule
+ruleCompositeDuration = Rule
+  { name = "composite <duration>"
   , pattern =
-    [ regex "genau|exakt"
+    [ Predicate isNatural
+    , dimension TimeGrain
     , dimension Duration
     ]
-  , prod = \tokens -> case tokens of
-      (_:token:_) -> Just token
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g (floor v) <> dd
       _ -> Nothing
   }
 
+ruleCompositeDurationAnd :: Rule
+ruleCompositeDurationAnd = Rule
+  { name = "composite <duration> and <duration>"
+  , pattern =
+    [ dimension Duration
+    , regex ",|und"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Duration DurationData{TDuration.value = v, TDuration.grain = g}:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g v <> dd
+      _ -> Nothing
+  }
+
+ruleHoursAndMinutes :: Rule
+ruleHoursAndMinutes = Rule
+  { name = "<integer> hour and <integer>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "(ein(en?) )?stunden?( und)?"
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \case
+      (Token Numeral h:
+       _:
+       Token Numeral m:
+       _) -> Just $ Token Duration $ duration TG.Minute $
+                floor (TNumeral.value m) + 60 * floor (TNumeral.value h)
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
-  [ ruleAUnitofduration
-  , ruleAboutDuration
-  , ruleExactlyDuration
-  , ruleFortnight
+  [ ruleQuarterOfAnHour
   , ruleHalfAnHour
-  , ruleIntegerAndAnHalfHours
-  , ruleIntegerMoreUnitofduration
-  , ruleNumeralnumberHours
+  , ruleThreeQuartersOfAnHour
+  , rulePrecision
+  , ruleCommaNumeralHours
+  , ruleCommaNumeralMinutes
+  , ruleFortnight
+  , ruleAndHalfHour
+  , ruleAndHalfMinute
+  , ruleArticle
+  , ruleHalfTimeGrain
+  , ruleCompositeDurationCommasAnd
+  , ruleCompositeDuration
+  , ruleCompositeDurationAnd
+  , ruleHoursAndMinutes
+  , ruleAndHalfMinute
   ]
diff --git a/Duckling/Duration/EL/Corpus.hs b/Duckling/Duration/EL/Corpus.hs
--- a/Duckling/Duration/EL/Corpus.hs
+++ b/Duckling/Duration/EL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/EL/Rules.hs b/Duckling/Duration/EL/Rules.hs
--- a/Duckling/Duration/EL/Rules.hs
+++ b/Duckling/Duration/EL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -159,7 +158,7 @@
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
-      (_:Token TimeGrain g:_) -> Token Duration <$> timesOneAndAHalf g 0
+      (_:Token TimeGrain g:_) -> Token Duration <$> nPlusOneHalf g 0
       _ -> Nothing
   }
 
@@ -173,7 +172,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd:_:Token TimeGrain grain:_) ->
-        timesOneAndAHalf grain (floor $ TNumeral.value nd) >>=
+        nPlusOneHalf grain (floor $ TNumeral.value nd) >>=
         Just . Token Duration
       _ -> Nothing
   }
@@ -189,7 +188,7 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (num:_)):Token TimeGrain grain:_) ->
         HashMap.lookup (Text.toLower num) numeralMapEL >>=
-        timesOneAndAHalf grain >>=
+        nPlusOneHalf grain >>=
         Just . Token Duration
       _ -> Nothing
   }
diff --git a/Duckling/Duration/EN/Corpus.hs b/Duckling/Duration/EN/Corpus.hs
--- a/Duckling/Duration/EN/Corpus.hs
+++ b/Duckling/Duration/EN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -45,6 +44,13 @@
              [ "2 mins"
              , "two minutes"
              , "2'"
+             , "2 more minutes"
+             , "two additional minutes"
+             , "2 extra minutes"
+             , "2 less minutes"
+             , "2 fewer minutes"
+             , "2m"
+             , "2 m"
              ]
   , examples (DurationData 30 Day)
              [ "30 days"
@@ -77,7 +83,33 @@
   , examples (DurationData 90 Minute)
              [ "an hour and a half"
              , "one hour and half"
+             , "1 hour thirty"
+             , "1 hour and thirty"
+             , "1.5 hours"
+             , "1.5 hrs"
+             , "one and two quarter hour"
+             , "one and two quarters hour"
+             , "one and two quarter of hour"
+             , "one and two quarters of hour"
              ]
+  , examples (DurationData 75 Minute)
+             [ "1 hour fifteen"
+             , "1 hour and fifteen"
+             , "one and quarter hour"
+             , "one and a quarter hour"
+             , "one and one quarter hour"
+             , "one and quarter of hour"
+             , "one and a quarter of hour"
+             , "one and one quarter of hour"
+             ]
+  , examples (DurationData 130 Minute)
+             [ "2 hours ten"
+             , "2 hour and 10"
+             ]
+  , examples (DurationData 3615 Second)
+             [ "1 hour fifteen seconds"
+             , "1 hour and fifteen seconds"
+             ]
   , examples (DurationData 45 Day)
              [ "a month and a half"
              , "one month and half"
@@ -85,8 +117,47 @@
   , examples (DurationData 27 Month)
              [ "2 years and 3 months"
              , "2 years, 3 months"
+             , "2 years 3 months"
              ]
   , examples (DurationData 31719604 Second)
              [ "1 year, 2 days, 3 hours and 4 seconds"
+             , "1 year 2 days 3 hours and 4 seconds"
+               -- Oxford comma not supported:
+--           , "1 year, 2 days, 3 hours, and 4 seconds"
              ]
+  , examples (DurationData 330 Second)
+             [ "5 and a half minutes"
+             , "five and half min"
+             , "5 and an half minute"
+             ]
+  , examples (DurationData 105 Minute)
+              [ "one and three quarter hour"
+              , "one and three quarters hour"
+              , "one and three quarter of hour"
+              , "one and three quarters of hour"
+              , "one and three quarter of hours"
+              , "one and three quarters of hours"
+              ]
+  , examples (DurationData 135 Minute)
+             [ "two and quarter hour"
+             , "two and a quarter of hour"
+             , "two and quarter of hours"
+             , "two and a quarter of hours"
+             ]
+  , examples (DurationData 105 Minute)
+              [ "an hour and 45 minutes"
+              , "one hour and 45 minutes"
+              ]
+  , examples (DurationData 90 Second)
+              [ "a minute and 30 seconds"
+              , "one minute and 30 seconds"
+              ]
+  , examples (DurationData 3630 Second)
+              [ "an hour and 30 seconds"]
+  , examples (DurationData 930 Second)
+              [ "15.5 minutes"
+              , "15.5 minute"
+              , "15.5 mins"
+              , "15.5 min"
+              ]
   ]
diff --git a/Duckling/Duration/EN/Rules.hs b/Duckling/Duration/EN/Rules.hs
--- a/Duckling/Duration/EN/Rules.hs
+++ b/Duckling/Duration/EN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -16,14 +15,13 @@
   ) where
 
 import Data.Semigroup ((<>))
-import Data.String
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Duration.Helpers
 import Duckling.Duration.Types (DurationData(..))
-import Duckling.Numeral.Helpers (parseInt, parseInteger)
+import Duckling.Numeral.Helpers (parseInteger)
 import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Regex.Types
 import Duckling.Types
@@ -89,7 +87,7 @@
   { name = "<integer> more <unit-of-duration>"
   , pattern =
     [ Predicate isNatural
-    , regex "more|less"
+    , regex "more|additional|extra|less|fewer"
     , dimension TimeGrain
     ]
   , prod = \case
@@ -102,7 +100,8 @@
 ruleDurationDotNumeralHours = Rule
   { name = "number.number hours"
   , pattern =
-    [ regex "(\\d+)\\.(\\d+) *hours?"
+    [ regex "(\\d+)\\.(\\d+)"
+    , Predicate $ isGrain TG.Hour
     ]
   , prod = \case
       (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
@@ -126,6 +125,19 @@
       _ -> Nothing
   }
 
+ruleDurationAndHalfMinute :: Rule
+ruleDurationAndHalfMinute = Rule
+  { name = "<integer> and a half minutes"
+  , pattern =
+    [ Predicate isNatural
+    , regex "and (an? )?half min(ute)?s?"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Duration . duration TG.Second $ 30 + 60 * floor v
+      _ -> Nothing
+  }
+
 ruleDurationA :: Rule
 ruleDurationA = Rule
   { name = "a <unit-of-duration>"
@@ -146,7 +158,7 @@
     , dimension TimeGrain
     ]
   , prod = \case
-      (_:Token TimeGrain grain:_) -> Token Duration <$> timesOneAndAHalf grain 0
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 0
       _ -> Nothing
   }
 
@@ -159,10 +171,27 @@
     , regex "and (a )?half"
     ]
   , prod = \case
-      (_:Token TimeGrain grain:_) -> Token Duration <$> timesOneAndAHalf grain 1
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 1
       _ -> Nothing
   }
 
+ruleDurationHoursAndMinutes :: Rule
+ruleDurationHoursAndMinutes = Rule
+  { name = "<integer> hour and <integer>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "hours?( and)?"
+    , Predicate isNatural
+    ]
+  , prod = \case
+      (Token Numeral h:
+       _:
+       Token Numeral m:
+       _) -> Just . Token Duration . duration TG.Minute $
+         (floor $ TNumeral.value m) + 60 * floor (TNumeral.value h)
+      _ -> Nothing
+  }
+
 ruleDurationPrecision :: Rule
 ruleDurationPrecision = Rule
   { name = "about|exactly <duration>"
@@ -175,37 +204,115 @@
         _ -> Nothing
   }
 
+-- | NOTE: Oxford comma is not supported.
+ruleCompositeDurationCommasAnd :: Rule
+ruleCompositeDurationCommasAnd = Rule
+  { name = "composite <duration> (with ,/and)"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|and"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
 ruleCompositeDuration :: Rule
 ruleCompositeDuration = Rule
   { name = "composite <duration>"
   , pattern =
     [ Predicate isNatural
     , dimension TimeGrain
-    , regex ",|and"
     , dimension Duration
     ]
   , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:
        Token TimeGrain g:
-       _:
        Token Duration dd@DurationData{TDuration.grain = dg}:
        _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
       _ -> Nothing
   }
 
+ruleCompositeDurationAnd :: Rule
+ruleCompositeDurationAnd = Rule
+  { name = "composite <duration> and <duration>"
+  , pattern =
+    [ dimension Duration
+    , regex ",|and"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Duration DurationData{TDuration.value = v, TDuration.grain = g}:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (v) <> dd
+      _ -> Nothing
+  }
+
+ruleDurationDotNumeralMinutes :: Rule
+ruleDurationDotNumeralMinutes = Rule
+  { name = "number.number minutes"
+  , pattern =
+    [ regex "(\\d+)\\.(\\d+)"
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m:s:_)):_) -> do
+        mm <- parseInteger m
+        ss <- parseInteger s
+        let sden = 10 ^ Text.length s
+        Just $ Token Duration $ secondsFromHourMixedFraction mm ss sden
+      _ -> Nothing
+  }
+
+ruleDurationNumeralAndQuarterHour :: Rule
+ruleDurationNumeralAndQuarterHour = Rule
+  { name = "<Integer> and <Integer> quarter of hour"
+  , pattern =
+    [ Predicate isNatural
+    , regex "and (a |an |one |two |three )?quarters?( of)?( an)?"
+    , Predicate $ isGrain TG.Hour
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = h}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+         q <- case Text.strip $ Text.toLower match of "a"     -> Just 1
+                                                      "an"    -> Just 1
+                                                      "one"   -> Just 1
+                                                      "two"   -> Just 2
+                                                      "three" -> Just 3
+                                                      _       -> Just 1
+         Just . Token Duration . duration TG.Minute $ 15 * q + 60 * floor h
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
-  [ ruleDurationQuarterOfAnHour
+  [ ruleCompositeDurationCommasAnd
+  , ruleDurationQuarterOfAnHour
   , ruleDurationHalfAnHourAbbrev
   , ruleDurationThreeQuartersOfAnHour
   , ruleDurationFortnight
   , ruleDurationNumeralMore
   , ruleDurationDotNumeralHours
   , ruleDurationAndHalfHour
+  , ruleDurationAndHalfMinute
   , ruleDurationA
   , ruleDurationHalfATimeGrain
   , ruleDurationOneGrainAndHalf
+  , ruleDurationHoursAndMinutes
   , ruleDurationPrecision
   , ruleNumeralQuotes
   , ruleCompositeDuration
+  , ruleCompositeDurationAnd
+  , ruleCompositeDurationCommasAnd
+  , ruleDurationDotNumeralMinutes
+  , ruleDurationNumeralAndQuarterHour
   ]
diff --git a/Duckling/Duration/ES/Corpus.hs b/Duckling/Duration/ES/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/ES/Corpus.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.ES.Corpus
+  ( corpus
+  ) 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 ES Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 30 Minute)
+             [ "media hora"
+             , "media horas"
+             , "30 minutos"
+             , "treinta minutos"
+             ]
+  , examples (DurationData 15 Minute)
+             [  "cuarto de hora"
+             ,  "cuartos de hora"
+             ,  "quince minutos"
+             ,  "15 minutos"
+             ]
+  , examples (DurationData 45 Minute)
+             [  "tres cuartos de hora"
+             ,  "tres cuartos de horas"
+             ,  "tres cuarto de hora"
+             ,  "tres cuarto de horas"
+             ,  "cuarenta y cinco minutos"
+             ,  "45 minutos"
+             ]
+  , examples (DurationData 92 Minute)
+             [
+               "una hora y treinta y dos minutos"
+             , "una hora treinta y dos minutos"
+             ]
+  , examples (DurationData 155 Minute)
+             [
+               "dos hora y treinta y cinco minutos"
+             , "dos hora  treinta y cinco minutos"
+             ]
+  ]
diff --git a/Duckling/Duration/ES/Rules.hs b/Duckling/Duration/ES/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/ES/Rules.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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.ES.Rules
+  ( rules
+  ) where
+
+import Prelude
+import Data.Semigroup ((<>))
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Duration.Types (DurationData(..))
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
+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 "cuartos? de hora"
+    ]
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 15
+  }
+
+ruleDurationHalfOfAnHour :: Rule
+ruleDurationHalfOfAnHour = Rule
+  { name = "half of an hour"
+  , pattern =
+    [ regex "media horas?"
+    ]
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 30
+  }
+
+ruleDurationThreeQuartersOfAnHour :: Rule
+ruleDurationThreeQuartersOfAnHour = Rule
+  { name = "three-quarters of an hour"
+  , pattern =
+    [ regex "tres cuartos? de horas?"
+    ]
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 45
+  }
+
+ruleCompositeDurationCommasAnd :: Rule
+ruleCompositeDurationCommasAnd = Rule
+  { name = "composite <duration> (with and)"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex "y"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+ruleCompositeDuration :: Rule
+ruleCompositeDuration = Rule
+  {
+    name = "composite <duration>"
+  , pattern =
+    [
+      Predicate isNatural
+    , dimension TimeGrain
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDurationHalfOfAnHour
+  , ruleDurationQuarterOfAnHour
+  , ruleDurationThreeQuartersOfAnHour
+  , ruleCompositeDuration
+  , ruleCompositeDurationCommasAnd
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/FR/Rules.hs b/Duckling/Duration/FR/Rules.hs
--- a/Duckling/Duration/FR/Rules.hs
+++ b/Duckling/Duration/FR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/HI/Corpus.hs b/Duckling/Duration/HI/Corpus.hs
--- a/Duckling/Duration/HI/Corpus.hs
+++ b/Duckling/Duration/HI/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -36,6 +35,7 @@
   , examples (DurationData 1 Day)
              [ "दिवस"
              , "एक दिन"
+             , "बिल्कुल एक दिन"
              ]
   , examples (DurationData 14 Day)
              [ "पखवाड़ा"
@@ -45,5 +45,38 @@
              [ "एक साल"
              , "केवल एक वर्ष"
              , "लगभग एक साल"
+             , "एक बरस"
+             , "केवल एक साल"
+             ]
+  , examples (DurationData 21 Month)
+             [ "पौने 2 साल"
+             ]
+  , examples (DurationData 105 Minute)
+             [ "पौने 2 घंटा"
+             ]
+  , examples (DurationData 27 Month)
+             [ "सवा 2 साल"
+             , "2 साल और 3 महीना"
+             , "2 साल, 3 महीना"
+             , "2 साल 3 महीना"
+             ]
+  , examples (DurationData 135 Minute)
+             [ "सवा 2 घंटा"
+             ]
+  , examples (DurationData 42 Month)
+             [ "साड़े 3 साल"
+             ]
+  , examples (DurationData 210 Minute)
+             [ "साड़े 3 घंटा"
+             ]
+  , examples (DurationData 31719604 Second)
+             [ "1 साल, 2 दिन, 3 घंटा और 4 सेकंड"
+             , "1 साल 2 दिन 3 घंटा और 4 सेकंड"
+             ]
+  , examples (DurationData 30 Month)
+             [ "ढाई साल"
+             ]
+  , examples (DurationData 90 Minute)
+             [ "डेढ़ घंटा"
              ]
   ]
diff --git a/Duckling/Duration/HI/Rules.hs b/Duckling/Duration/HI/Rules.hs
--- a/Duckling/Duration/HI/Rules.hs
+++ b/Duckling/Duration/HI/Rules.hs
@@ -2,18 +2,17 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Duration.HI.Rules
   ( rules
   ) where
 
-import Control.Monad (join)
 import Data.String
 import Data.HashMap.Strict (HashMap)
 import Data.Text (Text)
@@ -23,34 +22,39 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Duration.Helpers
-import Duckling.Numeral.Helpers (parseInteger)
+import Duckling.Duration.Types (DurationData(..))
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.TimeGrain.Types as TG
 
 avadhiMap :: HashMap Text TG.Grain
 avadhiMap = HashMap.fromList
   [ ("मिनट" , TG.Minute)
+  , ("क्षण", TG.Minute)
   , ("घंटा" , TG.Hour)
   , ("दिवस" , TG.Day)
   , ("दिन"  , TG.Day)
   , ("महीना", TG.Month)
+  , ("माह", TG.Month)
+  , ("मास", TG.Month)
   , ("वर्ष" , TG.Year)
   , ("साल"  , TG.Year)
+  , ("बरस", TG.Year)
   ]
 
 ruleAadha :: Rule
 ruleAadha = Rule
   { name = "half of a duration"
   , pattern =
-    [ regex "आधा ((साल|वर्ष)|(महीना)|(दिन|दिवस)|(घंटा)|(मिनट))"
+    [ regex "आधा ((साल|वर्ष|बरस)|(महीना|मास|माह)|(दिन|दिवस)|(घंटा)|(मिनट|क्षण))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (x:_)):_) -> do
         grain <- HashMap.lookup (Text.toLower x) avadhiMap
-        Token Duration <$> timesOneAndAHalf grain 0
+        Token Duration <$> nPlusOneHalf grain 0
       _ -> Nothing
   }
 
@@ -60,7 +64,7 @@
   , pattern =
     [ regex "पंद्रह मिनट"
     ]
-  , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
+  , prod = \_ -> Just $ Token Duration $ duration TG.Minute 15
   }
 
 ruleDurationPakhwaada :: Rule
@@ -69,7 +73,7 @@
   , pattern =
     [ regex "((एक पखवाड़ा)|(पखवाड़ा))"
     ]
-  , prod = \_ -> Just . Token Duration $ duration TG.Day 14
+  , prod = \_ -> Just $ Token Duration $ duration TG.Day 14
   }
 
 ruleDurationDin :: Rule
@@ -78,16 +82,16 @@
   , pattern =
     [ regex "((एक दिन)|(एक दिवस)|(दिन|दिवस))"
     ]
-  , prod = \_ -> Just . Token Duration $ duration TG.Day 1
+  , prod = \_ -> Just $ Token Duration $ duration TG.Day 1
   }
 
 ruleDurationEkSaal :: Rule
 ruleDurationEkSaal = Rule
   { name = "one year"
   , pattern =
-    [ regex "एक (साल|वर्ष)"
+    [ regex "एक (साल|वर्ष|बरस)"
     ]
-  , prod = \_ -> Just . Token Duration $ duration TG.Year 1
+  , prod = \_ -> Just $ Token Duration $ duration TG.Year 1
   }
 
 ruleDurationPreciseImprecise :: Rule
@@ -102,7 +106,107 @@
         _ -> Nothing
   }
 
+rulePauneDuration :: Rule
+rulePauneDuration = Rule
+  { name = "Paune duration"
+  , pattern =
+    [ regex "पौने"
+    , Predicate isNatural
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain grain:
+       _) -> Token Duration <$> timesThreeQuarter grain (floor (v - 1))
+      _ -> Nothing
+  }
 
+ruleSavaDuration :: Rule
+ruleSavaDuration = Rule
+  { name = "Sava duration"
+  , pattern =
+    [ regex "सवा"
+    , Predicate isNatural
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain grain:
+       _) -> Token Duration <$> timesOneQuarter grain (floor v)
+      _ -> Nothing
+  }
+
+ruleSaadeDuration :: Rule
+ruleSaadeDuration = Rule
+  { name = "Saade duration"
+  , pattern =
+    [ regex "साढ़े|साड़े"
+    , Predicate isNatural
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:
+        Token Numeral NumeralData{TNumeral.value = v}:
+        Token TimeGrain grain:
+        _) -> Token Duration <$> nPlusOneHalf grain (floor v)
+      _ -> Nothing
+  }
+
+ruleCompositeDuration :: Rule
+ruleCompositeDuration = Rule
+  { name = "composite <duration>"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+ruleCompositeDurationCommasAnd :: Rule
+ruleCompositeDurationCommasAnd = Rule
+  { name = "composite <duration> (with ,/और)"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|और"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+        Token TimeGrain g:
+        _:
+        Token Duration dd@DurationData{TDuration.grain = dg}:
+        _) | g > dg -> Just $ Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+ruleNAndHalfDuration :: Rule
+ruleNAndHalfDuration = Rule
+  { name = "डेढ़|ढाई <duration>"
+  , pattern =
+    [ regex "(डेढ़|ढाई)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       Token TimeGrain grain:
+       _) -> do
+        h <- case Text.toLower match of
+          "डेढ़" -> Just 1
+          "ढाई" -> Just 2
+          _ -> Nothing
+        Token Duration <$> nPlusOneHalf grain h
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [  ruleDurationPandrahMinat
@@ -111,4 +215,10 @@
   ,  ruleAadha
   ,  ruleDurationEkSaal
   ,  ruleDurationPreciseImprecise
+  ,  rulePauneDuration
+  ,  ruleSavaDuration
+  ,  ruleSaadeDuration
+  ,  ruleCompositeDuration
+  ,  ruleCompositeDurationCommasAnd
+  ,  ruleNAndHalfDuration
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/HU/Corpus.hs b/Duckling/Duration/HU/Corpus.hs
--- a/Duckling/Duration/HU/Corpus.hs
+++ b/Duckling/Duration/HU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Duration/HU/Rules.hs b/Duckling/Duration/HU/Rules.hs
--- a/Duckling/Duration/HU/Rules.hs
+++ b/Duckling/Duration/HU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Duration/Helpers.hs b/Duckling/Duration/Helpers.hs
--- a/Duckling/Duration/Helpers.hs
+++ b/Duckling/Duration/Helpers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -13,7 +12,10 @@
   , isGrain
   , isNatural
   , minutesFromHourMixedFraction
-  , timesOneAndAHalf
+  , nPlusOneHalf
+  , secondsFromHourMixedFraction
+  , timesOneQuarter
+  , timesThreeQuarter
   ) where
 
 import Prelude
@@ -42,11 +44,33 @@
 minutesFromHourMixedFraction h n d =
   duration TG.Minute $ fromIntegral $ 60 * h + quot (n * 60) d
 
-timesOneAndAHalf :: TG.Grain -> Int -> Maybe DurationData
-timesOneAndAHalf grain = case grain of
+nPlusOneHalf :: TG.Grain -> Int -> Maybe DurationData
+nPlusOneHalf grain = case grain of
   TG.Minute -> Just . duration TG.Second . (30+) . (60*)
   TG.Hour   -> Just . duration TG.Minute . (30+) . (60*)
   TG.Day    -> Just . duration TG.Hour   . (12+) . (24*)
   TG.Month  -> Just . duration TG.Day    . (15+) . (30*)
   TG.Year   -> Just . duration TG.Month  . (6+)  . (12*)
+  _         -> const Nothing
+
+secondsFromHourMixedFraction :: Integer -> Integer -> Integer -> DurationData
+secondsFromHourMixedFraction m s d =
+  duration TG.Second $ fromIntegral $ 60 * m + quot (s * 60) d
+
+timesOneQuarter :: TG.Grain -> Int -> Maybe DurationData
+timesOneQuarter grain = case grain of
+  TG.Minute -> Just . duration TG.Second . (15+) . (60*)
+  TG.Hour   -> Just . duration TG.Minute . (15+) . (60*)
+  TG.Day    -> Just . duration TG.Hour   . (6+) . (24*)
+  TG.Month  -> Just . duration TG.Day    . (7+) . (30*)
+  TG.Year   -> Just . duration TG.Month  . (3+)  . (12*)
+  _         -> const Nothing
+
+timesThreeQuarter :: TG.Grain -> Int -> Maybe DurationData
+timesThreeQuarter grain = case grain of
+  TG.Minute -> Just . duration TG.Second . (45+) . (60*)
+  TG.Hour   -> Just . duration TG.Minute . (45+) . (60*)
+  TG.Day    -> Just . duration TG.Hour   . (18+) . (24*)
+  TG.Month  -> Just . duration TG.Day    . (21+) . (30*)
+  TG.Year   -> Just . duration TG.Month  . (9+)  . (12*)
   _         -> const Nothing
diff --git a/Duckling/Duration/IT/Rules.hs b/Duckling/Duration/IT/Rules.hs
--- a/Duckling/Duration/IT/Rules.hs
+++ b/Duckling/Duration/IT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/KA/Corpus.hs b/Duckling/Duration/KA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/KA/Corpus.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.KA.Corpus
+  ( corpus
+  ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Duration.Types
+import Duckling.Testing.Types
+import Duckling.TimeGrain.Types (Grain(..))
+
+import Duckling.Locale
+import Duckling.Resolve
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale KA Nothing},
+  testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 1 Second)
+             [ "ერთი წამი"
+             , "1 წამი"
+             ]
+  , examples (DurationData 2 Minute)
+             [ "2 წუთი"
+             , "ორი წუთი"
+             ]
+  , examples (DurationData 30 Day)
+             [ "30 დღე"
+             ]
+  , examples (DurationData 7 Week)
+             [ "შვიდი კვირა"
+             ]
+  , examples (DurationData 1 Month)
+             [ "1 თვე"
+             , "ერთი თვე"
+             ]
+  , examples (DurationData 3 Quarter)
+             [ "3 კვარტალი"
+             ]
+  , examples (DurationData 27 Month)
+             [ "2 წელი და 3 თვე"
+             , "2 წელი, 3 თვე"
+             ]
+  , examples (DurationData 31719604 Second)
+             [ "1 წელი, 2 დღე, 3 საათი და 4 წამი"
+             ]
+  ]
diff --git a/Duckling/Duration/KA/Rules.hs b/Duckling/Duration/KA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/KA/Rules.hs
@@ -0,0 +1,155 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.KA.Rules
+  ( rules
+  ) where
+
+import Data.Semigroup ((<>))
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Duration.Types (DurationData(..))
+import Duckling.Numeral.Helpers (parseInt, parseInteger)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.TimeGrain.Types as TG
+
+ruleCompositeDuration :: Rule
+ruleCompositeDuration = Rule
+  { name = "composite <duration>"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|და"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:_:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+ruleCompositeDuration1 :: Rule
+ruleCompositeDuration1 = Rule
+  { name = "composite <duration>"
+  , pattern =
+    [ dimension TimeGrain
+    , regex ",|და"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token TimeGrain g:_:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g 1 <> dd
+      _ -> Nothing
+  }
+
+ruleDurationYear :: Rule
+ruleDurationYear = Rule
+  { name = "<integer> year"
+  , pattern =
+    [ Predicate isNatural
+    , regex "წელიწად(ის)?(ი)?(ში)?|წლი(ის)?(ში)?|წელშ?ი"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Duration . duration TG.Month $ 12 * floor v
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfYear :: Rule
+ruleDurationAndHalfYear = Rule
+  { name = "<integer> and an half year"
+  , pattern =
+    [ Predicate isNatural
+    , regex "წელიწადნახევა?(რის)?(რი)?(რში)?|წლინახევრ(ის)?(არში)?"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Duration . duration TG.Month $ 6 + 12 * floor v
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfYear1 :: Rule
+ruleDurationAndHalfYear1 = Rule
+  { name = "<integer> and an half year"
+  , pattern =
+    [ regex "წელიწადნახევა?(რის)?(რი)?(რში)?|წლინახევრ(ის)?(არში)?"
+    ]
+  , prod = const $ Just . Token Duration . duration TG.Month $ 18
+  }
+
+ruleDurationAndHalfMonth :: Rule
+ruleDurationAndHalfMonth = Rule
+  { name = "<integer> and an half month"
+  , pattern =
+    [ Predicate isNatural
+    , regex "თვენახევა?(რის)?(რი)?(რში)?"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Duration . duration TG.Day $ 15 + 30 * floor v
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfMonth1 :: Rule
+ruleDurationAndHalfMonth1 = Rule
+  { name = "month and an half month"
+  , pattern =
+    [ regex "თვენახევა?(რის)?(რი)?(რში)?"
+    ]
+  , prod = const $ Just . Token Duration . duration TG.Day $ 45
+  }
+
+ruleDurationAndHalfWeek :: Rule
+ruleDurationAndHalfWeek = Rule
+  { name = "<integer> and an half week"
+  , pattern =
+    [ Predicate isNatural
+    , regex "თვენახევა?(რის)?(რი)?(რში)?"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Duration . duration TG.Day $ 3 + 7 * floor v
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfWeek1 :: Rule
+ruleDurationAndHalfWeek1 = Rule
+  { name = "week and an half week"
+  , pattern =
+    [ regex "კვირანახევა?(რის)?(რი)?(რში)?"
+    ]
+  , prod = const $ Just . Token Duration . duration TG.Day $ 10
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleCompositeDuration
+  , ruleCompositeDuration1
+  , ruleDurationAndHalfYear
+  , ruleDurationAndHalfYear1
+  , ruleDurationAndHalfMonth
+  , ruleDurationAndHalfMonth1
+  , ruleDurationAndHalfWeek
+  , ruleDurationAndHalfWeek1
+  , ruleDurationYear
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Duration/MN/Corpus.hs b/Duckling/Duration/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/MN/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.MN.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 MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 1 Second)
+             [ "1 сек"
+             , "1 секунд"
+             , "секунд"
+             , "1\""
+             ]
+  , examples (DurationData 15 Minute)
+             [ "15 мин"
+             , "15'"
+             ]
+  , examples (DurationData 30 Minute)
+             [ "30 минут"
+             ]
+  , examples (DurationData 5400 Second)
+             [ "5400 секунд"
+             ]
+  , examples (DurationData 8 Hour)
+             [ "8 цаг"
+             , "8 ц"
+             ]
+  , examples (DurationData 15 Day)
+             [ "15 өдөр"
+             ]
+  , examples (DurationData 7 Week)
+             [ "7 долоо хоног"
+             ]
+  , examples (DurationData 1 Month)
+             [ "1 сар"
+             , "сар"
+             ]
+  , examples (DurationData 6 Month)
+             [ "6 сар"
+             ]
+  , examples (DurationData 2 Year)
+             [ "2 жил"
+             ]
+  , examples (DurationData 12 Hour)
+             [ "12 цаг"
+             ]
+  ]
diff --git a/Duckling/Duration/MN/Rules.hs b/Duckling/Duration/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/MN/Rules.hs
@@ -0,0 +1,117 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.MN.Rules
+  ( rules
+  ) where
+
+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.Duration.Helpers
+import Duckling.Numeral.Helpers (numberWith)
+import Duckling.Numeral.Types (NumeralData(..), isInteger)
+import Duckling.Duration.Types (DurationData (DurationData))
+import Duckling.Regex.Types
+import Duckling.Types
+import Duckling.TimeGrain.Types
+import qualified Duckling.Numeral.Types as TNumeral
+
+grainsMap :: HashMap Text Grain
+grainsMap = HashMap.fromList
+  [ ("жил"  , Year)
+  , ("сар", Month)
+  , ("өдөр"   , Day)
+  , ("цаг"  , Hour)
+  , ("минут", Minute)
+  ]
+
+-- TODO: Single-word composition (#110)
+ruleHalves :: Rule
+ruleHalves = Rule
+  { name = "half of a grain"
+  , pattern =
+    [ regex "хагас\\s?(жил|сар|өдөр|цаг|минут)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (x:_)):_) -> do
+        grain <- HashMap.lookup (Text.toLower x) grainsMap
+        Token Duration <$> nPlusOneHalf grain 0
+      _ -> Nothing
+  }
+
+ruleNumeralQuotes :: Rule
+ruleNumeralQuotes = Rule
+  { name = "<integer> + '\""
+  , pattern =
+    [ Predicate isNatural
+    , regex "(['\"])"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token RegexMatch (GroupMatch (x:_)):
+       _) -> case x of
+         "'"  -> Just . Token Duration . duration Minute $ floor v
+         "\"" -> Just . Token Duration . duration Second $ floor v
+         _    -> Nothing
+      _ -> Nothing
+  }
+
+ruleDurationPrecision :: Rule
+ruleDurationPrecision = Rule
+  { name = "about|exactly <duration>"
+  , pattern =
+    [ regex "(ойролцоогоор|яг)"
+    , dimension Duration
+    ]
+    , prod = \tokens -> case tokens of
+        (_:token:_) -> Just token
+        _ -> Nothing
+  }
+
+ruleGrainAsDuration :: Rule
+ruleGrainAsDuration = Rule
+  { name = "a <unit-of-duration>"
+  , pattern =
+    [ dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token TimeGrain grain:_) -> Just . Token Duration $ duration grain 1
+      _ -> Nothing
+  }
+
+rulePositiveDuration :: Rule
+rulePositiveDuration = Rule
+  { name = "<positive-numeral> <time-grain>"
+  , pattern =
+    [ numberWith TNumeral.value $ and . sequence [not . isInteger, (>0)]
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain grain:
+       _) -> Just . Token Duration . duration Second . floor $ inSeconds grain v
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ rulePositiveDuration
+  , ruleDurationPrecision
+  , ruleNumeralQuotes
+  , ruleGrainAsDuration
+  , ruleHalves
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/NB/Rules.hs b/Duckling/Duration/NB/Rules.hs
--- a/Duckling/Duration/NB/Rules.hs
+++ b/Duckling/Duration/NB/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Duration/NL/Corpus.hs b/Duckling/Duration/NL/Corpus.hs
--- a/Duckling/Duration/NL/Corpus.hs
+++ b/Duckling/Duration/NL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -58,6 +57,21 @@
   , examples (DurationData 45 Minute)
              [ "3 kwartier"
              ]
+  , examples (DurationData 90 Minute)
+             [ "anderhalf uur"
+             ]
+  , examples (DurationData 75 Minute)
+             [ "een uur en een kwartier"
+             , "een uur en 15 minuten"
+             , "een uur, 15 minuten"
+             , "een uur 15 minuten"
+             ]
+  , examples (DurationData 165 Minute)
+             [ "twee uur en drie kwartier"
+             , "twee uur, 3 kwartier"
+             , "twee uur, 45 minuten"
+             , "twee uur 45 minuten"
+             ]
   , examples (DurationData 1 Hour)
              [ "een uur"
              , "één uur"
@@ -66,6 +80,7 @@
              ]
   , examples (DurationData 30 Day)
              [ "30 dagen"
+             , "4 weken en 2 dagen"
              ]
   , examples (DurationData 7 Day)
              [ "7 dagen"
diff --git a/Duckling/Duration/NL/Rules.hs b/Duckling/Duration/NL/Rules.hs
--- a/Duckling/Duration/NL/Rules.hs
+++ b/Duckling/Duration/NL/Rules.hs
@@ -2,12 +2,12 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
 
 module Duckling.Duration.NL.Rules
   ( rules ) where
@@ -19,10 +19,12 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Duration.Helpers
+import Duckling.Duration.Types (DurationData(..))
 import Duckling.Numeral.Helpers (parseInt, parseInteger)
 import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.TimeGrain.Types as TG
 
@@ -103,6 +105,48 @@
       _ -> Nothing
   }
 
+ruleDurationOneAndHalfHour :: Rule
+ruleDurationOneAndHalfHour = Rule
+  { name = "1 and an half hour"
+  , pattern = [ regex "anderhalf uur"]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 90
+  }
+
+-- | NOTE: Oxford comma is not supported.
+ruleCompositeDurationCommasAnd :: Rule
+ruleCompositeDurationCommasAnd = Rule
+  { name = "composite <duration> (with ,/and)"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|en|plus"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+ruleCompositeDuration :: Rule
+ruleCompositeDuration = Rule
+  { name = "composite <duration>"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
 ruleDurationPrecision :: Rule
 ruleDurationPrecision = Rule
   { name = "about|exactly <duration>"
@@ -119,10 +163,13 @@
 rules =
   [ ruleDurationQuarterOfAnHour
   , ruleDurationKwartier
+  , ruleCompositeDurationCommasAnd
+  , ruleCompositeDuration
   , ruleDurationHalfAnHour
   , ruleDurationThreeQuartersOfAnHour
   , ruleDurationDotNumeralHours
   , ruleDurationAndHalfHour
+  , ruleDurationOneAndHalfHour
   , 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -31,6 +30,7 @@
              , "1 sekund"
              , "jeden sekundzie"
              , "pojedynczy sekundach"
+             , "mniej więcej jedną sekundę"
              ]
   , examples (DurationData 30 Minute)
              [ "pol godziny"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -96,7 +95,7 @@
 ruleAboutDuration = Rule
   { name = "about <duration>"
   , pattern =
-    [ regex "(oko(l|ł)o|miej wi(ę|e)cej|jakie(s|ś))"
+    [ regex "(oko(l|ł)o|mniej wi(ę|e)cej|jakie(s|ś))"
     , 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Duration/RU/Corpus.hs b/Duckling/Duration/RU/Corpus.hs
--- a/Duckling/Duration/RU/Corpus.hs
+++ b/Duckling/Duration/RU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/RU/Rules.hs b/Duckling/Duration/RU/Rules.hs
--- a/Duckling/Duration/RU/Rules.hs
+++ b/Duckling/Duration/RU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -50,7 +49,7 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (x:_)):_) -> do
         grain <- HashMap.lookup (Text.toLower x) grainsMap
-        Token Duration <$> timesOneAndAHalf grain 0
+        Token Duration <$> nPlusOneHalf grain 0
       _ -> Nothing
   }
 
diff --git a/Duckling/Duration/Rules.hs b/Duckling/Duration/Rules.hs
--- a/Duckling/Duration/Rules.hs
+++ b/Duckling/Duration/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Duration/SV/Rules.hs b/Duckling/Duration/SV/Rules.hs
--- a/Duckling/Duration/SV/Rules.hs
+++ b/Duckling/Duration/SV/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,11 +2,10 @@
 -- 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.
-
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Duration.TR.Rules
@@ -44,7 +43,7 @@
 ruleDurationThreeQuartersOfAnHour :: Rule
 ruleDurationThreeQuartersOfAnHour = Rule
   { name = "three-quarters of an hour"
-  , pattern = [regex "(3/4\\s?sa(at)?|üçe \231eyrek sa(at)?)"]
+  , pattern = [regex "(3/4\\s?sa(at)?|üç \231eyrek sa(at)?)"]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
   }
 
@@ -90,7 +89,7 @@
   { name = "<integer> and an half hour"
   , pattern =
     [ Predicate isNatural
-    , regex "buçeuk sa(at)?"
+    , regex "buçuk sa(at)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v}:_) ->
@@ -103,7 +102,7 @@
 ruleDurationPrecision = Rule
   { name = "<duration> about|exactly"
   , pattern =
-    [ regex "(gibi|civar\305nda|yaklaş\305k|tam( olarak)?)"
+    [ regex "(yaklaşık|tam(\\solarak)?)"
     , dimension Duration
     ]
     , prod = \tokens -> case tokens of
@@ -111,6 +110,18 @@
         _           -> Nothing
   }
 
+ruleDurationPrecision2 :: Rule
+ruleDurationPrecision2 = Rule
+  { name = "<duration> about|exactly"
+  , pattern =
+    [ dimension Duration
+    , regex "gibi|civarında"
+    ]
+  , prod = \case
+      (token:_:_) -> Just token
+      _           -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleDurationQuarterOfAnHour
@@ -120,5 +131,6 @@
   , ruleDurationDotNumeralHours
   , ruleDurationAndHalfHour
   , ruleDurationPrecision
+  , ruleDurationPrecision2
   , ruleNumeralQuotes
   ]
diff --git a/Duckling/Duration/Types.hs b/Duckling/Duration/Types.hs
--- a/Duckling/Duration/Types.hs
+++ b/Duckling/Duration/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
diff --git a/Duckling/Duration/UK/Corpus.hs b/Duckling/Duration/UK/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/UK/Corpus.hs
@@ -0,0 +1,78 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.UK.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(..))
+
+context :: Context
+context = testContext {locale = makeLocale UK Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (context, testOptions, examples)
+  where
+    examples =
+      [ "в дні"
+      , "секретар"
+      , "хвилини"
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 1 Second)
+             [ "1 секунда"
+             , "одна сек"
+             ]
+  , examples (DurationData 2 Minute)
+             [ "2 хв"
+             , "дві хвилини"
+             ]
+  , examples (DurationData 30 Day)
+             [ "30 днів"
+             ]
+  , examples (DurationData 7 Week)
+             [ "сім тижнів"
+             ]
+  , examples (DurationData 1 Month)
+             [ "1 місяць"
+             ]
+  , examples (DurationData 2 Year)
+             [ "2 роки"
+             ]
+  , examples (DurationData 30 Minute)
+             [ "півгодини"
+             , "1/2 години"
+             ]
+  , examples (DurationData 12 Hour)
+             [ "пів дня"
+             ]
+  , examples (DurationData 90 Minute)
+             [ "півтори години"
+             ]
+  , examples (DurationData 27 Month)
+             [ "2 роки і 3 місяці"
+             , "2 роки, 3 місяці"
+             ]
+  , examples (DurationData 31719604 Second)
+             [ "1 рік, 2 дня, 3 години і 4 секунди"
+             ]
+  ]
diff --git a/Duckling/Duration/UK/Rules.hs b/Duckling/Duration/UK/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/UK/Rules.hs
@@ -0,0 +1,144 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.UK.Rules
+  ( rules ) where
+
+import Control.Monad (join)
+import Data.Semigroup ((<>))
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Duration.Types (DurationData(..))
+import Duckling.Numeral.Helpers (parseInt, parseInteger)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.TimeGrain.Types as TG
+
+ruleHalfAnHour :: Rule
+ruleHalfAnHour = Rule
+  { name = "half an hour"
+  , pattern =
+    [ regex "(1/2\\s?|пів\\s?)години?"
+    ]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
+  }
+
+ruleNumeralnumberHours :: Rule
+ruleNumeralnumberHours = Rule
+  { name = "number.number hours"
+  , pattern =
+    [ regex "(\\d+)\\.(\\d+) години?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
+        hh <- parseInteger h
+        mnum <- parseInteger m
+        let mden = 10 ^ Text.length m
+        Just . Token Duration $ minutesFromHourMixedFraction hh mnum mden
+      _ -> Nothing
+  }
+
+ruleIntegerAndAnHalfHours :: Rule
+ruleIntegerAndAnHalfHours = Rule
+  { name = "<integer> and an half hours"
+  , pattern =
+    [ Predicate isNatural
+    , regex "з половиною години"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
+      _ -> Nothing
+  }
+
+ruleAboutDuration :: Rule
+ruleAboutDuration = Rule
+  { name = "about <duration>"
+  , pattern =
+    [ regex "близько"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleExactlyDuration :: Rule
+ruleExactlyDuration = Rule
+  { name = "exactly <duration>"
+  , pattern =
+    [ regex "рівно"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleDurationHalfATimeGrain :: Rule
+ruleDurationHalfATimeGrain = Rule
+  { name = "half a <time-grain>"
+  , pattern =
+    [ regex "(1/2|пів)"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 0
+      _ -> Nothing
+  }
+
+ruleDurationOneGrainAndHalf :: Rule
+ruleDurationOneGrainAndHalf = Rule
+  { name = "one and a hald <unit-of-duration>"
+  , pattern =
+    [ regex "півтори"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 1
+      _ -> Nothing
+  }
+
+ruleCompositeDurationCommasAnd :: Rule
+ruleCompositeDurationCommasAnd = Rule
+  { name = "composite <duration> (with ,/and)"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|і"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleAboutDuration
+  , ruleExactlyDuration
+  , ruleHalfAnHour
+  , ruleIntegerAndAnHalfHours
+  , ruleNumeralnumberHours
+  , ruleDurationHalfATimeGrain
+  , ruleDurationOneGrainAndHalf
+  , ruleCompositeDurationCommasAnd
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -48,4 +47,60 @@
              [ "10 月"
              , "十 月"
              ]
+  , examples (DurationData 30 Minute)
+             [ "30分鐘"
+             , "半個鐘"
+             , "半小時"
+             , "三十分鐘"
+             , "卅分鐘"
+             ]
+  , examples (DurationData 12 Hour)
+             [ "半日"
+             , "半天"
+             , "十二小時"
+             , "十二個鐘"
+             ]
+  , examples (DurationData 90 Minute)
+             [ "一個半小時"
+             , "個半小時"
+             , "個半鐘"
+             , "一個半鐘"
+             , "1.5小時"
+             , "一個小時三十分鐘"
+             , "一小時零三十分鐘"
+             ]
+  , examples (DurationData 130 Minute)
+             [ "兩小時十分"
+             , "一百三十分鐘"
+             ]
+  , examples (DurationData 3615 Second)
+             [ "一小時零十五秒"
+             , "一個鐘零十五秒"
+             ]
+  , examples (DurationData 45 Day)
+             [ "一個半月"
+             , "個半月"
+             ]
+  , examples (DurationData 27 Month)
+             [ "兩年零三個月"
+             , "廿七個月"
+             ]
+  , examples (DurationData 330 Second)
+             [ "五個半分鐘"
+             , "五點五分鐘"
+             , "5.5分鐘"
+             , "五分三十秒"
+             , "五分半鐘"
+             , "五分半"
+             ]
+  , examples (DurationData 90 Second)
+              [ "一分半鐘"
+              , "一分半"
+              , "分半鐘"
+              , "分半"
+              ]
+  , examples (DurationData 15 Minute)
+              [ "3個字"
+              , "三個字"
+              ]
   ]
diff --git a/Duckling/Duration/ZH/Rules.hs b/Duckling/Duration/ZH/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/ZH/Rules.hs
@@ -0,0 +1,301 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.ZH.Rules
+  ( rules
+  ) where
+
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Duration.Types (DurationData(..))
+import Duckling.Numeral.Helpers (parseInteger, decimalsToDouble)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.TimeGrain.Types as TG
+
+ruleDurationNFiveMinutes :: Rule
+ruleDurationNFiveMinutes = Rule
+  { name = "number of five minutes"
+  , pattern =
+    [ Predicate isNatural
+    , regex "個字"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just $ Token Duration $ duration TG.Minute $ floor v * 5
+      _ -> Nothing
+  }
+
+ruleDurationHalfATimeGrain :: Rule
+ruleDurationHalfATimeGrain = Rule
+  { name = "half a <time-grain>"
+  , pattern =
+    [ regex "半"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 0
+      _ -> Nothing
+  }
+
+ruleDurationOneGrainAndHalf :: Rule
+ruleDurationOneGrainAndHalf = Rule
+  { name = "a <unit-of-duration> and a half"
+  , pattern =
+    [ regex "一個半|個半"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 1
+      _ -> Nothing
+  }
+
+ruleDurationOneGrainAndHalf2 :: Rule
+ruleDurationOneGrainAndHalf2 = Rule
+  { name = "a <unit-of-duration> and a half"
+  , pattern =
+    [ dimension TimeGrain
+    , regex "半(鐘)?"
+    ]
+  , prod = \case
+      (Token TimeGrain grain:_) -> Token Duration <$> nPlusOneHalf grain 1
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfGrain :: Rule
+ruleDurationAndHalfGrain = Rule
+  { name = "<integer> and a half <unit-of-duration>"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex "半(鐘)?"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:Token TimeGrain grain:_) -> do
+        let vv = floor v
+        Token Duration <$> nPlusOneHalf grain vv
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfGrain2 :: Rule
+ruleDurationAndHalfGrain2 = Rule
+  { name = "<integer> and a half <unit-of-duration>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "個半"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_:Token TimeGrain grain:_) -> do
+        let vv = floor v
+        Token Duration <$> nPlusOneHalf grain vv
+      _ -> Nothing
+  }
+
+ruleDurationDotNumeralHours :: Rule
+ruleDurationDotNumeralHours = Rule
+  { name = "number.number hours"
+  , pattern =
+    [ regex "(\\d+)\\.(\\d+)"
+    , Predicate $ isGrain TG.Hour
+    ]
+  , prod = \case
+      (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
+  }
+
+ruleDurationDotNumeralHours2 :: Rule
+ruleDurationDotNumeralHours2 = Rule
+  { name = "number.number hours"
+  , pattern =
+    [ Predicate isNatural
+    , regex "點"
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Hour
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = m}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = s}:
+       _) -> Just
+        $ Token Duration
+        $ duration TG.Minute
+        $ floor ((m + decimalsToDouble s) * 60)
+      _ -> Nothing
+  }
+
+ruleDurationDotNumeralMinutes :: Rule
+ruleDurationDotNumeralMinutes = Rule
+  { name = "number.number minutes"
+  , pattern =
+    [ regex "(\\d+)\\.(\\d+)"
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m:s:_)):_) -> do
+        mm <- parseInteger m
+        ss <- parseInteger s
+        let sden = 10 ^ Text.length s
+        Just $ Token Duration $ secondsFromHourMixedFraction mm ss sden
+      _ -> Nothing
+  }
+
+ruleDurationDotNumeralMinutes2 :: Rule
+ruleDurationDotNumeralMinutes2 = Rule
+  { name = "number.number minutes"
+  , pattern =
+    [ Predicate isNatural
+    , regex "點"
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = m}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = s}:
+       _) -> Just
+        $ Token Duration
+        $ duration TG.Second
+        $ floor ((m + decimalsToDouble s) * 60)
+      _ -> Nothing
+  }
+
+ruleDurationHoursAndMinutes :: Rule
+ruleDurationHoursAndMinutes = Rule
+  { name = "<integer> hours and <integer> minutes"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate $ isGrain TG.Hour
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Minute
+    ]
+  , prod = \case
+      (Token Numeral h:
+       _:
+       Token Numeral m:
+       _) -> Just
+        $ Token Duration
+        $ duration TG.Minute
+        $ floor (TNumeral.value m) + 60 * floor (TNumeral.value h)
+      _ -> Nothing
+  }
+
+ruleDurationMinutesAndSeconds :: Rule
+ruleDurationMinutesAndSeconds = Rule
+  { name = "<integer> minutes and <integer> seconds"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate $ isGrain TG.Minute
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Second
+    ]
+  , prod = \case
+      (Token Numeral m:
+       _:
+       Token Numeral s:
+       _) -> Just
+        $ Token Duration
+        $ duration TG.Second
+        $ floor (TNumeral.value s) + 60 * floor (TNumeral.value m)
+      _ -> Nothing
+  }
+
+ruleDurationHoursAndSeconds :: Rule
+ruleDurationHoursAndSeconds = Rule
+  { name = "<integer> hours and <integer> seconds"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate $ isGrain TG.Hour
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Second
+    ]
+  , prod = \case
+      (Token Numeral h:
+       _:
+       Token Numeral s:
+       _) -> Just
+         $ Token Duration
+         $ duration TG.Second
+         $ floor (TNumeral.value s) + 3600 * floor (TNumeral.value h)
+      _ -> Nothing
+  }
+
+ruleDurationHoursAndMinutesAndSeconds :: Rule
+ruleDurationHoursAndMinutesAndSeconds = Rule
+  { name = "<integer> hours and <integer> minutes and <integer> seconds"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate $ isGrain TG.Hour
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Minute
+    , Predicate isNatural
+    , Predicate $ isGrain TG.Second
+    ]
+  , prod = \case
+      (Token Numeral h:
+       _:
+       Token Numeral m:
+       _:
+       Token Numeral s:
+       _) -> Just
+         $ Token Duration
+         $ duration TG.Second
+         $          floor (TNumeral.value s)
+           + 60   * floor (TNumeral.value m)
+           + 3600 * floor (TNumeral.value h)
+      _ -> Nothing
+  }
+
+ruleCompositeDurationAnd :: Rule
+ruleCompositeDurationAnd = Rule
+  { name = "composite <duration> and <duration>"
+  , pattern =
+    [ dimension Duration
+    , regex "零"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Duration DurationData{TDuration.value = v, TDuration.grain = g}:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just $ Token Duration $ duration g v <> dd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDurationNFiveMinutes
+  , ruleDurationHalfATimeGrain
+  , ruleDurationOneGrainAndHalf
+  , ruleDurationOneGrainAndHalf2
+  , ruleDurationAndHalfGrain
+  , ruleDurationAndHalfGrain2
+  , ruleDurationDotNumeralHours
+  , ruleDurationDotNumeralHours2
+  , ruleDurationDotNumeralMinutes
+  , ruleDurationDotNumeralMinutes2
+  , ruleDurationHoursAndMinutes
+  , ruleDurationMinutesAndSeconds
+  , ruleDurationHoursAndSeconds
+  , ruleDurationHoursAndMinutesAndSeconds
+  , ruleCompositeDurationAnd
+  ]
diff --git a/Duckling/Email/Corpus.hs b/Duckling/Email/Corpus.hs
--- a/Duckling/Email/Corpus.hs
+++ b/Duckling/Email/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Email/DE/Corpus.hs b/Duckling/Email/DE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Email/DE/Corpus.hs
@@ -0,0 +1,64 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Email.DE.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Email.Types
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale DE Nothing}
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (context, testOptions, examples)
+  where
+    examples =
+      [ "fitness at 6.40"
+      , "class at 12.00"
+      , "tonight at 9.15"
+      , " dot 2@abci"
+      , "x@ dot x"
+      , "x@ x dot "
+      , "abc@x dot "
+      , Text.replicate 10000 "a at a"
+      ]
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (EmailData "alice@exAmple.io")
+             [ "alice at exAmple.io"
+             ]
+  , examples (EmailData "yo+yo@blah.org")
+             [ "yo+yo at blah.org"
+             ]
+  , examples (EmailData "1234+abc@x.net")
+             [ "1234+abc at x.net"
+             ]
+  , examples (EmailData "jean-jacques@stuff.co.uk")
+             [ "jean-jacques at stuff.co.uk"
+             ]
+  , examples (EmailData "asdf+ab.c@gmail.com")
+             [ "asdf+ab punkt c at gmail punkt com"
+             ]
+  , examples (EmailData "asdf.k@fb.com")
+             [ "asdf punkt k@fb punkt com"
+             ]
+  ]
diff --git a/Duckling/Email/DE/Rules.hs b/Duckling/Email/DE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Email/DE/Rules.hs
@@ -0,0 +1,41 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Email.DE.Rules
+  ( rules ) where
+
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Email.Types (EmailData (..))
+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_+-]+(?:(?: punkt |\\.)[\\w_+-]+){0,10})(?: at |@)([a-zA-Z]+(?:(?:\\.| punkt )[\\w_-]+){1,10})"
+    ]
+  , prod = \xs -> case xs of
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) ->
+        Just $ Token Email EmailData
+          { TEmail.value = Text.concat [replaceDots m1, "@", replaceDots m2] }
+        where replaceDots = Text.replace " punkt " "."
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleEmailSpelledOut
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Email/FR/Rules.hs b/Duckling/Email/FR/Rules.hs
--- a/Duckling/Email/FR/Rules.hs
+++ b/Duckling/Email/FR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Email/IS/Corpus.hs b/Duckling/Email/IS/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Email/IS/Corpus.hs
@@ -0,0 +1,39 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Email.IS.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Email.Types
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale IS Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (EmailData "alice@exAmple.io")
+             [ "alice ingi exAmple.io"
+             ]
+  , examples (EmailData "yo+yo@blah.org")
+             [ "yo+yo ingi blah.org"
+             ]
+  , examples (EmailData "1234+abc@x.net")
+             [ "1234+abc ingi x.net"
+             ]
+  , examples (EmailData "jean-jacques@stuff.co.uk")
+             [ "jean-jacques ingi stuff.co.uk"
+             ]
+  ]
diff --git a/Duckling/Email/IS/Rules.hs b/Duckling/Email/IS/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Email/IS/Rules.hs
@@ -0,0 +1,39 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Email.IS.Rules
+  ( rules ) where
+
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Email.Types (EmailData (..))
+import qualified Duckling.Email.Types as TEmail
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleEmailSpelledOut :: Rule
+ruleEmailSpelledOut = Rule
+  { name = "email spelled out"
+  , pattern =
+    [ regex "([\\w\\._+-]+) ingi ([\\w_-]+(\\.[\\w_-]+)+)"
+    ]
+  , prod = \xs -> case xs of
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) ->
+        Just $ Token Email EmailData {TEmail.value = Text.concat [m1, "@", m2]}
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleEmailSpelledOut
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Email/IT/Rules.hs b/Duckling/Email/IT/Rules.hs
--- a/Duckling/Email/IT/Rules.hs
+++ b/Duckling/Email/IT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Email/Rules.hs b/Duckling/Email/Rules.hs
--- a/Duckling/Email/Rules.hs
+++ b/Duckling/Email/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Email/Types.hs b/Duckling/Email/Types.hs
--- a/Duckling/Email/Types.hs
+++ b/Duckling/Email/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -32,4 +31,7 @@
   resolve _ _ x = Just (x, False)
 
 instance ToJSON EmailData where
-  toJSON EmailData {value} = object [ "value" .= value ]
+  toJSON EmailData {value} = object
+    [ "value" .= value
+    , "type"  .= ("value" :: Text)
+    ]
diff --git a/Duckling/Engine.hs b/Duckling/Engine.hs
--- a/Duckling/Engine.hs
+++ b/Duckling/Engine.hs
@@ -2,15 +2,12 @@
 -- 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.
-
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 
-
 module Duckling.Engine
   ( parseAndResolve
   , lookupRegexAnywhere
@@ -92,8 +89,9 @@
   -- on here
   (substring, rangeToText, translateRange) =
     Document.byteStringFromPos doc position
-  nodes = mapMaybe (f . Array.elems) $ Foldable.toList $
-    matchFun regex substring
+  nodes = mapMaybe (f . Array.elems)
+    $ Foldable.toList
+    $ matchFun regex substring
   f :: [(Int, Int)] -> Maybe Node
   f [] = Nothing
   f ((0,0):_) = Nothing
diff --git a/Duckling/Engine/Regex.hs b/Duckling/Engine/Regex.hs
--- a/Duckling/Engine/Regex.hs
+++ b/Duckling/Engine/Regex.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Engine.Regex
diff --git a/Duckling/Locale.hs b/Duckling/Locale.hs
--- a/Duckling/Locale.hs
+++ b/Duckling/Locale.hs
@@ -2,40 +2,76 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE NoRebindableSyntax #-}
-
 module Duckling.Locale
   ( Lang(..)
   , Locale(..)
-  , Region(AU,BE,BZ,CA,CN,GB,HK,IE,IN,JM,MO,NZ,PH,TT,TW,US,ZA)
+  , Region
+      ( AU
+      , BE
+      , BZ
+      , CL
+      , CN
+      , CO
+      , EG
+      , GB
+      , HK
+      , IE
+      , IN
+      , JM
+      , MO
+      , MX
+      , NZ
+      , PE
+      , PH
+      , TT
+      , TW
+      , US
+      , VE
+      , ZA
+      )
   , allLocales
   , makeLocale
   ) where
 
-import Data.Hashable
 import Data.HashMap.Strict (HashMap)
+import qualified Data.HashMap.Strict as HashMap
 import Data.HashSet (HashSet)
+import qualified Data.HashSet as HashSet
+import Data.Hashable
 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
 
-import Duckling.Region hiding (NL)
-import qualified Duckling.Region as R (Region(NL))
+import Duckling.Region hiding
+  ( AR
+  , CA
+  , ES
+  , NL
+  )
+import qualified Duckling.Region as R
+  ( Region
+      ( AR
+      , CA
+      , ES
+      , NL
+      )
+  )
 
 -- | ISO 639-1 Language.
 -- See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
 data Lang
-  = AR
+  = AF
+  | AR
   | BG
+  | BN
+  | CA
   | CS
   | DA
   | DE
@@ -43,6 +79,8 @@
   | EN
   | ES
   | ET
+  | FA
+  | FI
   | FR
   | GA
   | HE
@@ -50,10 +88,16 @@
   | HR
   | HU
   | ID
+  | IS
   | IT
   | JA
   | KA
+  | KN
+  | KM
   | KO
+  | LO
+  | ML
+  | MN
   | MY
   | NB
   | NE
@@ -62,8 +106,12 @@
   | PT
   | RO
   | RU
+  | SK
   | SV
+  | SW
   | TA
+  | TE
+  | TH
   | TR
   | UK
   | VI
@@ -92,8 +140,11 @@
     locales = HashMap.lookupDefault HashSet.empty lang allLocales
 
 allLocales :: HashMap Lang (HashSet Region)
-allLocales = HashMap.fromList
-  [ (EN, HashSet.fromList [AU, BZ, CA, GB, IN, IE, JM, NZ, PH, ZA, TT, US])
-  , (NL, HashSet.fromList [BE, R.NL])
-  , (ZH, HashSet.fromList [CN, HK, MO, TW])
-  ]
+allLocales =
+  HashMap.fromList
+    [ (AR, HashSet.fromList [EG])
+    , (EN, HashSet.fromList [AU, BZ, R.CA, GB, IN, IE, JM, NZ, PH, ZA, TT, US])
+    , (ES, HashSet.fromList [R.AR, CL, CO, R.ES, MX, PE, VE])
+    , (NL, HashSet.fromList [BE, R.NL])
+    , (ZH, HashSet.fromList [CN, HK, MO, TW])
+    ]
diff --git a/Duckling/Numeral/AF/Corpus.hs b/Duckling/Numeral/AF/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/AF/Corpus.hs
@@ -0,0 +1,152 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.AF.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 AF Nothing}
+  , testOptions
+  , allExamples
+  )
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "nul"
+             , "geen"
+             , "niks"
+             ]
+  , examples (NumeralValue 1)
+             [ "een"
+             ]
+  , examples (NumeralValue 2)
+             [ "twee"
+             ]
+  , examples (NumeralValue 3)
+             [ "drie"
+             ]
+  , examples (NumeralValue 4)
+             [ "vier"
+             ]
+  , examples (NumeralValue 5)
+             [ "vyf"
+             ]
+  , examples (NumeralValue 6)
+             [ "ses"
+             ]
+  , examples (NumeralValue 7)
+             [ "sewe"
+             ]
+  , examples (NumeralValue 8)
+             [ "agt"
+             , "ag"
+             ]
+  , examples (NumeralValue 9)
+             [ "nege"
+             ]
+  , examples (NumeralValue 10)
+             [ "tien"
+             ]
+  , examples (NumeralValue 11)
+             [ "elf"
+             ]
+  , examples (NumeralValue 12)
+             [ "twaalf"
+             , "dosyn"
+             ]
+  , examples (NumeralValue 14)
+             [ "veertien"
+             ]
+  , examples (NumeralValue 15)
+             [ "vyftien"
+             ]
+  , examples (NumeralValue 16)
+             [ "sestien"
+             ]
+  , examples (NumeralValue 17)
+             [ "sewentien"
+             ]
+  , examples (NumeralValue 19)
+             [ "negentien"
+             , "neentien"
+             ]
+  , examples (NumeralValue 20)
+             [ "twintig"
+             ]
+  , examples (NumeralValue 22)
+             [ "twee en twintig"
+             ]
+  , examples (NumeralValue 24)
+             [ "vier en twintig"
+             ]
+  , examples (NumeralValue 26)
+             [ "ses en twintig"
+             ]
+  , examples (NumeralValue 28)
+             [ "agt en twintig"
+             ]
+  , examples (NumeralValue 33)
+             [ "drie en dertig"
+             ]
+  , examples (NumeralValue 34)
+             [ "vier en dertig"
+             ]
+  , examples (NumeralValue 50)
+             [ "vyftig"
+             ]
+  , examples (NumeralValue 55)
+             [ "vyf en vyftig"
+             ]
+  , examples (NumeralValue 1.1)
+             [ "1,1"
+             , "1,10"
+             , "01,10"
+             ]
+  , examples (NumeralValue 0.77)
+             [ "0,77"
+             , ",77"
+             ]
+  , examples (NumeralValue 300)
+             [ "3 honderd"
+             , "drie honderd"
+             ]
+  , examples (NumeralValue 5000)
+             [ "5 duisend"
+             , "vyf duisend"
+             ]
+  , examples (NumeralValue 144)
+             [ "een honderd vier en veertig"
+             , "honderd vier en veertig"
+             ]
+  , examples (NumeralValue 122)
+             [ "een honderd twee en twintig"
+             , "honderd twee en twintig"
+             ]
+  , examples (NumeralValue 20000)
+             [ "twintig duisend"
+             ]
+  , examples (NumeralValue 0.2)
+             [ "0,2"
+             , "1/5"
+             , "2/10"
+             , "3/15"
+             , "20/100"
+             ]
+  ]
diff --git a/Duckling/Numeral/AF/Rules.hs b/Duckling/Numeral/AF/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/AF/Rules.hs
@@ -0,0 +1,210 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.AF.Rules
+  ( rules
+  ) where
+
+import Control.Applicative ((<|>))
+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
+
+zeroAndTenMap :: HashMap Text Integer
+zeroAndTenMap = HashMap.fromList
+  [ ( "nul" , 0  )
+  , ( "geen", 0  )
+  , ( "niks", 0  )
+  , ( "zero", 0  )
+  , ( "tien", 10 )
+  ]
+
+oneToNineMap :: HashMap Text Integer
+oneToNineMap = HashMap.fromList
+  [ ( "een" , 1 )
+  , ( "twee", 2 )
+  , ( "drie", 3 )
+  , ( "vier", 4 )
+  , ( "vyf" , 5 )
+  , ( "ses" , 6 )
+  , ( "sewe", 7 )
+  , ( "agt" , 8 )
+  , ( "ag"  , 8 )
+  , ( "nege", 9 )
+  ]
+
+ruleNumeral :: Rule
+ruleNumeral = Rule
+  { name = "number (0..10)"
+  , pattern =
+    [ regex . Text.unpack $
+        Text.concat [ "(", Text.intercalate "|"
+          ((HashMap.keys zeroAndTenMap) ++ (HashMap.keys oneToNineMap)), ")" ]
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        let x = Text.toLower match in
+        (HashMap.lookup x oneToNineMap >>= integer) <|>
+        (HashMap.lookup x zeroAndTenMap >>= integer)
+      _ -> Nothing
+  }
+
+elevenToNineteenMap :: HashMap Text Integer
+elevenToNineteenMap = HashMap.fromList
+  [ ( "elf"      , 11 )
+  , ( "twaalf"   , 12 )
+  , ( "dertien"  , 13 )
+  , ( "veertien" , 14 )
+  , ( "vyftien"  , 15 )
+  , ( "sestien"  , 16 )
+  , ( "sewentien", 17 )
+  , ( "agtien"   , 18 )
+  , ( "negentien", 19 )
+  , ( "neentien" , 19 )
+  ]
+
+ruleElevenToNineteen :: Rule
+ruleElevenToNineteen = Rule
+  { name = "number (11..19)"
+  , pattern =
+    [ regex "(elf|twaalf|dertien|veertien|vyftien|sestien|sewentien|agtien|neg?entien)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) elevenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "twin" , 20 )
+  , ( "der"  , 30 )
+  , ( "veer" , 40 )
+  , ( "vyf"  , 50 )
+  , ( "ses"  , 60 )
+  , ( "sewen", 70 )
+  , ( "tag"  , 80 )
+  , ( "negen", 90 )
+  , ( "neen" , 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20,30..90)"
+  , pattern =
+    [ regex "(twin|der|veer|vyf|ses|sewen|tag|neg?en)tig"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([3-9][1-9])"
+  , pattern =
+    [ numberBetween 1 10
+    , regex "en"
+    , oneOf [20, 30..90]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = units}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = tens}:
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
+ruleDecimals :: Rule
+ruleDecimals = Rule
+  { name = "decimal number"
+  , pattern =
+    [ regex "(\\d*\\,\\d+)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal False match
+      _ -> Nothing
+  }
+
+rulePowersOfTen :: Rule
+rulePowersOfTen = Rule
+  { name = "powers of tens"
+  , pattern =
+    [ regex "(honderd|duisend)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "honderd" -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "duisend" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleDozen :: Rule
+ruleDozen = Rule
+  { name = "a dozen of"
+  , pattern =
+    [ regex "dosyn"
+    ]
+  , prod = \_ -> integer 12 >>= withMultipliable >>= notOkForAnyTime
+  }
+
+ruleSum :: Rule
+ruleSum = Rule
+  { name = "intersect 2 numbers"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \case
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNumeral
+  , ruleDozen
+  , ruleDecimals
+  , rulePowersOfTen
+  , ruleElevenToNineteen
+  , ruleTens
+  , ruleCompositeTens
+  , ruleSum
+  , ruleMultiply
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -28,106 +27,155 @@
   [ examples (NumeralValue 0)
              [ "0"
              , "صفر"
+             , "٠"
+             , "٠٫٠"
              ]
   , examples (NumeralValue 1)
              [ "1"
              , "واحد"
+             , "١"
+             , "١٫٠"
              ]
   , examples (NumeralValue 4)
              [ "4"
              , "أربعة"
              , "أربع"
              , "اربعه"
+             , "٤"
+             , "٤٫٠"
              ]
   , examples (NumeralValue 6)
              [ "6"
              , "ستة"
              , "ست"
              , "سته"
+             , "٦"
+             , "٦٫٠"
              ]
   , examples (NumeralValue 10)
              [ "10"
              , "عشرة"
              , "عشره"
+             , "١٠"
+             , "١٠٫٠"
              ]
   , examples (NumeralValue 11)
              [ "11"
              , "إحدى عشرة"
              , "إحدى عشر"
              , "احد عشر"
+             , "١١"
+             , "١١٫٠"
              ]
   , examples (NumeralValue 12)
              [ "12"
              , "إثنتى عشر"
              , "إثنى عشر"
+             , "١٢"
+             , "١٢٫٠"
              ]
   , examples (NumeralValue 14)
              [ "14"
              , "أربع عشر"
+             , "١٤"
+             , "١٤٫٠"
              ]
   , examples (NumeralValue 16)
              [ "16"
              , "ستة عشر"
+             , "١٦"
+             , "١٦٫٠"
              ]
   , examples (NumeralValue 17)
              [ "17"
              , "سبع عشر"
+             , "١٧"
+             , "١٧٫٠"
              ]
   , examples (NumeralValue 18)
              [ "18"
              , "ثمان عشرة"
+             , "١٨"
+             , "١٨٫٠"
              ]
   , examples (NumeralValue 20)
              [ "عشرون"
              , "عشرين"
+             , "٢٠"
+             , "٢٠٫٠"
              ]
   , examples (NumeralValue 21)
              [ "واحدة و عشرون"
              , "21"
+             , "٢١"
+             , "٢١٫٠"
              ]
   , examples (NumeralValue 24)
              [ "أربعة و عشرون"
              , "24"
+             , "٢٤"
+             , "٢٤٫٠"
              ]
   , examples (NumeralValue 26)
              [ "ستة و عشرون"
              , "26"
+             , "٢٦"
+             , "٢٦٫٠"
              ]
   , examples (NumeralValue 20)
              [ "عشرون"
              , "عشرين"
+             , "٢٠"
              ]
   , examples (NumeralValue 30)
              [ "ثلاثون"
              , "ثلاثين"
+             , "٣٠"
+             , "٣٠٫٠"
              ]
   , examples (NumeralValue 33)
              [ "33"
              , "ثلاث و ثلاثون"
+             , "٣٣"
+             , "٣٣٫٠"
              ]
   , examples (NumeralValue 40)
              [ "اربعون"
              , "أربعين"
+             , "٤٠"
+             , "٤٠٫٠"
              ]
   , examples (NumeralValue 200)
              [ "مائتين"
              , "مائتان"
+             , "٢٠٠"
+             , "٢٠٠٫٠"
              ]
   , examples (NumeralValue 300)
              [ "ثلاثمائة"
+             , "٣٠٠"
+             , "٣٠٠٫٠"
              ]
   , examples (NumeralValue 350)
              [ "ثلاثمائة وخمسين"
+             , "٣٥٠"
+             , "٣٥٠٫٠"
              ]
   , examples (NumeralValue 500)
              [ "خمسمائة"
+             , "٥٠٠"
+             , "٥٠٠٫٠"
              ]
   , examples (NumeralValue 525)
              [ "خمسمائة و خمسة و عشرون"
              , "525"
+             , "٥٢٥"
+             , "٥٢٥٫٠"
              ]
   , examples (NumeralValue 700)
              [ "سبعمائة"
+             , "٧٠٠"
+             , "٧٠٠٫٠"
              ]
   , examples (NumeralValue 1.1)
              [ "1.1"
@@ -135,40 +183,78 @@
              , "01.10"
              , "1 فاصلة 1"
              , "واحد فاصلة واحد"
+             , "١١/١٠"
+             , "١٫١"
+             , "١٫١٠"
              ]
   , examples (NumeralValue 0.77)
              [ "0.77"
              , ".77"
+             , "٧٧/١٠٠"
+             , "٫٧٧"
+             , "٠٫٧٧"
+             , "٠٫٧٧٠"
              ]
   , examples (NumeralValue 2000)
              [ "2000"
              , "الفان"
+             , "٢٠٠٠"
              , "الفين"
              ]
   , examples (NumeralValue 100000)
              [ "100000"
              , "100 الف"
+             , "١٠٠٠٠٠"
+             , "١٠٠٠٠٠٫٠٠"
+             , "١٠٠٬٠٠٠"
+             , "١٠٠٬٠٠٠٫٠"
              ]
   , examples (NumeralValue 10000)
              [ "10000"
              , "10 آلاف"
+             , "١٠٠٠٠"
+             , "١٠٠٠٠٫٠٠"
+             , "١٠٬٠٠٠"
+             , "١٠٬٠٠٠٫٠٠"
              ]
   , examples (NumeralValue 1000000)
              [ "1000000"
              , "مليون"
+             , "١٠٠٠٠٠٠"
+             , "١٠٠٠٠٠٠٫٠٠"
+             , "١٬٠٠٠٬٠٠٠"
+             , "١٬٠٠٠٬٠٠٠٫٠٠"
              ]
   , examples (NumeralValue 2000000)
              [ "2000000"
              , "2 مليون"
              , "مليونان"
              , "مليونين"
+             , "٢٠٠٠٠٠٠"
+             , "٢٠٠٠٠٠٠٫٠٠"
+             , "٢٬٠٠٠٬٠٠٠"
+             , "٢٬٠٠٠٬٠٠٠٫٠٠"
              ]
   , examples (NumeralValue 3000000)
              [ "3 ملايين"
              , "3000000"
              , "3 مليون"
+             , "٣٠٠٠٠٠٠"
+             , "٣٠٠٠٠٠٠٫٠٠"
+             , "٣٬٠٠٠٬٠٠٠"
+             , "٣٬٠٠٠٬٠٠٠٫٠٠"
              ]
   , examples (NumeralValue (-1200000))
              [ "-1200000"
+             , "-١٢٠٠٠٠٠"
+             , "-١٢٠٠٠٠٠٫٠٠"
+             , "-١٬٢٠٠٬٠٠٠"
+             , "-١٬٢٠٠٬٠٠٠٫٠٠"
+             ]
+  , examples (NumeralValue (-1.2))
+             [ "-١٢/١٠"
+             , "-1.2"
+             , "-١٫٢"
+             , "-١٫٢٠"
              ]
   ]
diff --git a/Duckling/Numeral/AR/EG/Corpus.hs b/Duckling/Numeral/AR/EG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/AR/EG/Corpus.hs
@@ -0,0 +1,257 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.AR.EG.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "صفر"
+             , "٠"
+             , "٠٫٠"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "واحد"
+             , "١"
+             , "١٫٠"
+             ]
+  , examples (NumeralValue 4)
+             [ "4"
+             , "أربع"
+             , "اربعه"
+             , "٤"
+             , "٤٫٠"
+             ]
+  , examples (NumeralValue 6)
+             [ "6"
+             , "ستة"
+             , "ست"
+             , "سته"
+             , "٦"
+             , "٦٫٠"
+             ]
+  , examples (NumeralValue 10)
+             [ "10"
+             , "عشرة"
+             , "عشره"
+             , "١٠"
+             , "١٠٫٠"
+             ]
+  , examples (NumeralValue 11)
+             [ "11"
+             , "حداشر"
+             , "١١"
+             , "١١٫٠"
+             ]
+  , examples (NumeralValue 12)
+             [ "12"
+             , "إتناشر"
+             , "١٢"
+             , "١٢٫٠"
+             ]
+  , examples (NumeralValue 14)
+             [ "14"
+             , "اربعتاشر"
+             , "١٤"
+             , "١٤٫٠"
+             ]
+  , examples (NumeralValue 16)
+             [ "16"
+             , "ستاشر"
+             , "١٦"
+             , "١٦٫٠"
+             ]
+  , examples (NumeralValue 17)
+             [ "17"
+             , "سبعتاشر"
+             , "١٧"
+             , "١٧٫٠"
+             ]
+  , examples (NumeralValue 18)
+             [ "18"
+             , "تمنتاشر"
+             , "١٨"
+             , "١٨٫٠"
+             ]
+  , examples (NumeralValue 20)
+             [ "عشرين"
+             , "٢٠"
+             , "٢٠٫٠"
+             ]
+  , examples (NumeralValue 21)
+             [ "واحد و عشرين"
+             , "21"
+             , "٢١"
+             , "٢١٫٠"
+             ]
+  , examples (NumeralValue 24)
+             [ "أربعة و عشرين"
+             , "24"
+             , "٢٤"
+             , "٢٤٫٠"
+             ]
+  , examples (NumeralValue 26)
+             [ "ستة و عشرين"
+             , "26"
+             , "٢٦"
+             , "٢٦٫٠"
+             ]
+  , examples (NumeralValue 20)
+             [ "عشرين"
+             , "٢٠"
+             ]
+  , examples (NumeralValue 30)
+             [ "ثلاثين"
+             , "٣٠"
+             , "٣٠٫٠"
+             ]
+  , examples (NumeralValue 33)
+             [ "33"
+             , "تلاتة و تلاتين"
+             , "٣٣"
+             , "٣٣٫٠"
+             ]
+  , examples (NumeralValue 40)
+             [ "أربعين"
+             , "٤٠"
+             , "٤٠٫٠"
+             ]
+  , examples (NumeralValue 200)
+             [ "متين"
+             , "٢٠٠"
+             , "٢٠٠٫٠"
+             ]
+  , examples (NumeralValue 210)
+             [ "متين وعشرة"
+             , "٢١٠"
+             , "٢١٠٫٠"
+             ]
+  , examples (NumeralValue 221)
+             [ "متين واحد وعشرين"
+             , "٢٢١"
+             , "٢٢١٫٠"
+             ]
+  , examples (NumeralValue 263)
+             [ "متين تلاتة وستين"
+             , "٢٦٣"
+             , "٢٦٣٫٠"
+             ]
+  , examples (NumeralValue 300)
+             [ "تلتمية"
+             , "٣٠٠"
+             , "٣٠٠٫٠"
+             ]
+  , examples (NumeralValue 350)
+             [ "تلتمية وخمسين"
+             , "٣٥٠"
+             , "٣٥٠٫٠"
+             ]
+  , examples (NumeralValue 500)
+             [ "خمسمية"
+             , "٥٠٠"
+             , "٥٠٠٫٠"
+             ]
+  , examples (NumeralValue 525)
+             [ "خمسمية خمسة و عشرين"
+             , "525"
+             , "٥٢٥"
+             , "٥٢٥٫٠"
+             ]
+  , examples (NumeralValue 700)
+             [ "سبعمية"
+             , "٧٠٠"
+             , "٧٠٠٫٠"
+             ]
+  , examples (NumeralValue 1.1)
+             [ "1.1"
+             , "1.10"
+             , "01.10"
+             , "1 فاصلة 1"
+             , "واحد فاصلة واحد"
+             , "١١/١٠"
+             , "١٫١"
+             , "١٫١٠"
+             ]
+  , examples (NumeralValue 0.77)
+             [ "0.77"
+             , ".77"
+             , "٧٧/١٠٠"
+             , "٫٧٧"
+             , "٠٫٧٧"
+             , "٠٫٧٧٠"
+             ]
+  , examples (NumeralValue 2000)
+             [ "2000"
+             , "٢٠٠٠"
+             , "الفين"
+             ]
+  , examples (NumeralValue 100000)
+             [ "100000"
+             , "100 الف"
+             , "١٠٠٠٠٠"
+             , "١٠٠٠٠٠٫٠٠"
+             , "١٠٠٬٠٠٠"
+             , "١٠٠٬٠٠٠٫٠"
+             ]
+  , examples (NumeralValue 10000)
+             [ "10000"
+             , "10 آلاف"
+             , "١٠٠٠٠"
+             , "١٠٠٠٠٫٠٠"
+             , "١٠٬٠٠٠"
+             , "١٠٬٠٠٠٫٠٠"
+             ]
+  , examples (NumeralValue 1000000)
+             [ "1000000"
+             , "مليون"
+             , "١٠٠٠٠٠٠"
+             , "١٠٠٠٠٠٠٫٠٠"
+             , "١٬٠٠٠٬٠٠٠"
+             , "١٬٠٠٠٬٠٠٠٫٠٠"
+             ]
+  , examples (NumeralValue 2000000)
+             [ "2000000"
+             , "2 مليون"
+             , "اتنين مليون"
+             , "٢٠٠٠٠٠٠"
+             , "٢٠٠٠٠٠٠٫٠٠"
+             , "٢٬٠٠٠٬٠٠٠"
+             , "٢٬٠٠٠٬٠٠٠٫٠٠"
+             ]
+  , examples (NumeralValue 3000000)
+             [ "3 ملايين"
+             , "3000000"
+             , "3 مليون"
+             , "٣٠٠٠٠٠٠"
+             , "٣٠٠٠٠٠٠٫٠٠"
+             , "٣٬٠٠٠٬٠٠٠"
+             , "٣٬٠٠٠٬٠٠٠٫٠٠"
+             ]
+  , examples (NumeralValue (-1200000))
+             [ "-1200000"
+             , "-١٢٠٠٠٠٠"
+             , "-١٢٠٠٠٠٠٫٠٠"
+             , "-١٬٢٠٠٬٠٠٠"
+             , "-١٬٢٠٠٬٠٠٠٫٠٠"
+             ]
+  , examples (NumeralValue (-1.2))
+             [ "-١٢/١٠"
+             , "-1.2"
+             , "-١٫٢"
+             , "-١٫٢٠"
+             ]
+  ]
diff --git a/Duckling/Numeral/AR/EG/Helpers.hs b/Duckling/Numeral/AR/EG/Helpers.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/AR/EG/Helpers.hs
@@ -0,0 +1,80 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.AR.EG.Helpers
+  ( digitsMap
+  , numeralToStringMap
+  , parseArabicDoubleAsText
+  , parseArabicDoubleFromText
+  , parseArabicIntAsText
+  , parseArabicIntegerFromText
+  ) where
+
+import Control.Monad (join)
+import Data.HashMap.Strict (HashMap)
+import Data.Maybe (mapMaybe)
+import Data.String
+import Data.Text (Text)
+import Duckling.Numeral.Helpers
+  ( parseDouble
+  , parseInteger
+  )
+import Prelude
+
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+
+numeralToStringMap :: HashMap Char String
+numeralToStringMap =
+  HashMap.fromList
+    [ ('٠', "0")
+    , ('١', "1")
+    , ('٢', "2")
+    , ('٣', "3")
+    , ('٤', "4")
+    , ('٥', "5")
+    , ('٦', "6")
+    , ('٧', "7")
+    , ('٨', "8")
+    , ('٩', "9")
+    ]
+
+digitsMap :: HashMap Text Integer
+digitsMap =
+  HashMap.fromList
+    [ ("اتنين", 2)
+    , ("تلات", 3)
+    , ("اربع", 4)
+    , ("أربع", 4)
+    , ("خمس", 5)
+    , ("ست", 6)
+    , ("سبع", 7)
+    , ("تمان", 8)
+    , ("تسع", 9)
+    ]
+
+parseArabicIntAsText :: Text -> Text
+parseArabicIntAsText =
+  Text.pack
+    . join
+    . mapMaybe (`HashMap.lookup` numeralToStringMap)
+    . Text.unpack
+
+parseArabicIntegerFromText :: Text -> Maybe Integer
+parseArabicIntegerFromText = parseInteger . parseArabicIntAsText
+
+parseArabicDoubleAsText :: Text -> Text
+parseArabicDoubleAsText =
+  Text.pack
+    . join
+    . mapMaybe (`HashMap.lookup` HashMap.insert '٫' "." numeralToStringMap)
+    . Text.unpack
+
+parseArabicDoubleFromText :: Text -> Maybe Double
+parseArabicDoubleFromText = parseDouble . parseArabicDoubleAsText
diff --git a/Duckling/Numeral/AR/EG/Rules.hs b/Duckling/Numeral/AR/EG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/AR/EG/Rules.hs
@@ -0,0 +1,343 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.AR.EG.Rules (rules) where
+
+import Data.Maybe
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.AR.EG.Helpers
+  ( digitsMap
+  , parseArabicDoubleFromText
+  , parseArabicIntegerFromText
+  )
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleInteger2 :: Rule
+ruleInteger2 = Rule
+  { name = "integer 2"
+  , pattern =
+    [ regex "[إأا]?تني[ي]?ن"
+    ]
+  , prod = \_ -> integer 2
+  }
+
+ruleInteger3 :: Rule
+ruleInteger3 = Rule
+  { name = "integer 3"
+  , pattern =
+    [ regex "تلات[هة]?"
+    ]
+  , prod = \_ -> integer 3
+  }
+
+ruleInteger8 :: Rule
+ruleInteger8 = Rule
+  { name = "integer 8"
+  , pattern =
+    [ regex "تمان(ي[هة])?"
+    ]
+  , prod = \_ -> integer 8
+  }
+
+ruleInteger11 :: Rule
+ruleInteger11 = Rule
+  { name = "integer 11"
+  , pattern =
+    [ regex "(إأا)?حداشر"
+    ]
+  , prod = \_ -> integer 11
+  }
+
+ruleInteger12 :: Rule
+ruleInteger12 = Rule
+  { name = "integer 12"
+  , pattern =
+    [ regex "[إأا]?[تط]ناشر"
+    ]
+  , prod = \_ -> integer 12
+  }
+
+ruleInteger13 :: Rule
+ruleInteger13 = Rule
+  { name = "integer 13"
+  , pattern =
+    [ regex "[تط]ل(ا)?[تط]اشر"
+    ]
+  , prod = \_ -> integer 13
+  }
+
+ruleInteger14 :: Rule
+ruleInteger14 = Rule
+  { name = "integer 14"
+  , pattern =
+    [ regex "[إأا]ربع[تط]اشر"
+    ]
+  , prod = \_ -> integer 14
+  }
+
+ruleInteger15 :: Rule
+ruleInteger15 = Rule
+  { name = "integer 15"
+  , pattern =
+    [ regex "خمس[تط]اشر"
+    ]
+  , prod = \_ -> integer 15
+  }
+
+ruleInteger16 :: Rule
+ruleInteger16 = Rule
+  { name = "integer 16"
+  , pattern =
+    [ regex "س[تط]اشر"
+    ]
+  , prod = \_ -> integer 16
+  }
+
+ruleInteger17 :: Rule
+ruleInteger17 = Rule
+  { name = "integer 17"
+  , pattern =
+    [ regex "سبع[تط]اشر"
+    ]
+  , prod = \_ -> integer 17
+  }
+
+ruleInteger18 :: Rule
+ruleInteger18 = Rule
+  { name = "integer 18"
+  , pattern =
+    [ regex "[تط]من[تط]اشر"
+    ]
+  , prod = \_ -> integer 18
+  }
+
+ruleInteger19 :: Rule
+ruleInteger19 = Rule
+  { name = "integer 19"
+  , pattern =
+    [ regex "تسع[تط]اشر"
+    ]
+  , prod = \_ -> integer 19
+  }
+
+ruleInteger30_80 :: Rule
+ruleInteger30_80 = Rule
+  { name = "integer (30, 80)"
+  , pattern =
+    [ regex "([تط]لا[تط]|[تط]مان)(ين)"
+    ]
+  , prod = \tokens -> case tokens of
+      Token RegexMatch (GroupMatch (match:_)):_ ->
+        (* 10) <$> HashMap.lookup match digitsMap >>= integer
+      _ -> Nothing
+  }
+
+ruleInteger100 :: Rule
+ruleInteger100 = Rule
+  { name = "integer (100)"
+  , pattern =
+    [ regex "مي[هةت]"
+    ]
+  , prod = const $ integer 100
+  }
+
+ruleInteger200 :: Rule
+ruleInteger200 = Rule
+  { name = "integer (200)"
+  , pattern =
+    [ regex "م(ي)?تين"
+    ]
+  , prod = const $ integer 200
+  }
+
+ruleInteger300 :: Rule
+ruleInteger300 = Rule
+  { name = "integer (300)"
+  , pattern =
+    [ regex "([تط]و?لا?[تط]و?)مي[هةت]"
+    ]
+  , prod = const $ integer 300
+  }
+
+ruleInteger400 :: Rule
+ruleInteger400 = Rule
+  { name = "integer (400)"
+  , pattern =
+    [ regex "(رو?بعو?)مي[هةت]"
+    ]
+  , prod = const $ integer 400
+  }
+
+ruleInteger500 :: Rule
+ruleInteger500 = Rule
+  { name = "integer (500)"
+  , pattern =
+    [ regex "(خو?مسو?)مي[هةت]"
+    ]
+  , prod = const $ integer 500
+  }
+
+ruleInteger600 :: Rule
+ruleInteger600 = Rule
+  { name = "integer (600)"
+  , pattern =
+    [ regex "(سو?تو?)مي[هةت]"
+    ]
+  , prod = const $ integer 600
+  }
+
+ruleInteger700 :: Rule
+ruleInteger700 = Rule
+  { name = "integer (700)"
+  , pattern =
+    [ regex "(سو?بعو?)مي[هةت]"
+    ]
+  , prod = const $ integer 700
+  }
+
+ruleInteger800 :: Rule
+ruleInteger800 = Rule
+  { name = "integer (800)"
+  , pattern =
+    [ regex "([تط]و?منو?)مي[هةت]"
+    ]
+  , prod = const $ integer 800
+  }
+
+ruleInteger900 :: Rule
+ruleInteger900 = Rule
+  { name = "integer (900)"
+  , pattern =
+    [ regex "([تط]و?سعو?)مي[هةت]"
+    ]
+  , prod = const $ integer 900
+  }
+
+ruleInteger101_999 :: Rule
+ruleInteger101_999 = Rule
+  { name = "integer 101..999"
+  , pattern =
+    [ oneOf [100, 200 .. 900]
+    , regex "\\s"
+    , oneOf $ map (+) [10, 20 .. 90] <*> [1..9]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + v2
+      _ -> Nothing
+  }
+
+
+ruleInteger3000 :: Rule
+ruleInteger3000 = Rule
+  { name = "integer (3000)"
+  , pattern =
+    [ regex "([تط]لا?[تط])( ?[اآ])?لاف"
+    ]
+  , prod = const $ integer 3000
+  }
+
+ruleInteger4000 :: Rule
+ruleInteger4000 = Rule
+  { name = "integer (4000)"
+  , pattern =
+    [ regex "[أا]ربع(ت| ?[اآ])لاف"
+    ]
+  , prod = const $ integer 4000
+  }
+
+ruleInteger5000 :: Rule
+ruleInteger5000 = Rule
+  { name = "integer (5000)"
+  , pattern =
+    [ regex "خمس(ت| ?[اآ])لاف"
+    ]
+  , prod = const $ integer 5000
+  }
+
+ruleInteger6000 :: Rule
+ruleInteger6000 = Rule
+  { name = "integer (6000)"
+  , pattern =
+    [ regex "س(ت| ?[اآ])لاف"
+    ]
+  , prod = const $ integer 6000
+  }
+
+ruleInteger7000 :: Rule
+ruleInteger7000 = Rule
+  { name = "integer (7000)"
+  , pattern =
+    [ regex "سبع(ت| ?[اآ])لاف"
+    ]
+  , prod = const $ integer 7000
+  }
+
+ruleInteger8000 :: Rule
+ruleInteger8000 = Rule
+  { name = "integer (8000)"
+  , pattern =
+    [ regex "[تط]م[ا]?ن(ت| ?[اآ])لاف"
+    ]
+  , prod = const $ integer 8000
+  }
+
+ruleInteger9000 :: Rule
+ruleInteger9000 = Rule
+  { name = "integer (9000)"
+  , pattern =
+    [ regex "([تط]سع)(ت| ?[اآ])لاف"
+    ]
+  , prod = const $ integer 9000
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleInteger2
+  , ruleInteger3
+  , ruleInteger8
+  , ruleInteger11
+  , ruleInteger12
+  , ruleInteger13
+  , ruleInteger14
+  , ruleInteger15
+  , ruleInteger16
+  , ruleInteger17
+  , ruleInteger18
+  , ruleInteger19
+  , ruleInteger30_80
+  , ruleInteger100
+  , ruleInteger200
+  , ruleInteger300
+  , ruleInteger400
+  , ruleInteger500
+  , ruleInteger600
+  , ruleInteger700
+  , ruleInteger800
+  , ruleInteger900
+  , ruleInteger101_999
+  , ruleInteger3000
+  , ruleInteger4000
+  , ruleInteger5000
+  , ruleInteger6000
+  , ruleInteger7000
+  , ruleInteger8000
+  , ruleInteger9000
+  ]
diff --git a/Duckling/Numeral/AR/Helpers.hs b/Duckling/Numeral/AR/Helpers.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/AR/Helpers.hs
@@ -0,0 +1,80 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.AR.Helpers
+  ( digitsMap
+  , numeralToStringMap
+  , parseArabicDoubleAsText
+  , parseArabicDoubleFromText
+  , parseArabicIntAsText
+  , parseArabicIntegerFromText
+  ) where
+
+import Control.Monad (join)
+import Data.HashMap.Strict (HashMap)
+import Data.Maybe (mapMaybe)
+import Data.String
+import Data.Text (Text)
+import Duckling.Numeral.Helpers
+  ( parseDouble
+  , parseInteger
+  )
+import Prelude
+
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+
+numeralToStringMap :: HashMap Char String
+numeralToStringMap =
+  HashMap.fromList
+    [ ('٠', "0")
+    , ('١', "1")
+    , ('٢', "2")
+    , ('٣', "3")
+    , ('٤', "4")
+    , ('٥', "5")
+    , ('٦', "6")
+    , ('٧', "7")
+    , ('٨', "8")
+    , ('٩', "9")
+    ]
+
+digitsMap :: HashMap Text Integer
+digitsMap =
+  HashMap.fromList
+    [ ("عشر", 2)
+    , ("ثلاث", 3)
+    , ("اربع", 4)
+    , ("أربع", 4)
+    , ("خمس", 5)
+    , ("ست", 6)
+    , ("سبع", 7)
+    , ("ثمان", 8)
+    , ("تسع", 9)
+    ]
+
+parseArabicIntAsText :: Text -> Text
+parseArabicIntAsText =
+  Text.pack
+    . join
+    . mapMaybe (`HashMap.lookup` numeralToStringMap)
+    . Text.unpack
+
+parseArabicIntegerFromText :: Text -> Maybe Integer
+parseArabicIntegerFromText = parseInteger . parseArabicIntAsText
+
+parseArabicDoubleAsText :: Text -> Text
+parseArabicDoubleAsText =
+  Text.pack
+    . join
+    . mapMaybe (`HashMap.lookup` HashMap.insert '٫' "." numeralToStringMap)
+    . Text.unpack
+
+parseArabicDoubleFromText :: Text -> Maybe Double
+parseArabicDoubleFromText = parseDouble . parseArabicDoubleAsText
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
@@ -2,26 +2,25 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
-
-module Duckling.Numeral.AR.Rules
-  ( rules
-  ) where
+{-# LANGUAGE NoRebindableSyntax #-}
 
-import Data.HashMap.Strict (HashMap)
+module Duckling.Numeral.AR.Rules (rules) where
 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.AR.Helpers
+  ( digitsMap
+  , parseArabicDoubleFromText
+  , parseArabicIntegerFromText
+  )
 import Duckling.Numeral.Helpers
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Regex.Types
@@ -62,19 +61,6 @@
   , prod = \_ -> integer 12
   }
 
-digitsMap :: HashMap Text Integer
-digitsMap = HashMap.fromList
-  [ ("عشر", 2)
-  , ("ثلاث", 3)
-  , ("اربع", 4)
-  , ("أربع", 4)
-  , ("خمس", 5)
-  , ("ست", 6)
-  , ("سبع", 7)
-  , ("ثمان", 8)
-  , ("تسع", 9)
-  ]
-
 ruleInteger19 :: Rule
 ruleInteger19 = Rule
   { name = "integer (20..90)"
@@ -342,9 +328,62 @@
       _ -> Nothing
   }
 
+ruleIntegerNumeric :: Rule
+ruleIntegerNumeric = Rule
+  { name = "Arabic integer numeric"
+  , pattern =
+    [ regex "([٠-٩]{1,18})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseArabicIntegerFromText match >>= integer
+      _ -> Nothing
+  }
+
+ruleFractionsNumeric :: Rule
+ruleFractionsNumeric = Rule
+  { name = "Arabic fractional number numeric"
+  , pattern =
+    [ regex "([٠-٩]+)/([٠-٩]+)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (numerator:denominator:_)):_) -> do
+        n <- parseArabicIntegerFromText numerator >>= integer
+        d <- parseArabicIntegerFromText denominator >>= integer
+        divide n d >>= notOkForAnyTime
+      _ -> Nothing
+  }
+
+ruleArabicDecimal :: Rule
+ruleArabicDecimal = Rule
+  { name = "Arabic decimal number with Arabic decimal separator"
+  , pattern =
+    [ regex "([٠-٩]*٫[٠-٩]+)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseArabicDoubleFromText match >>= double
+      _ -> Nothing
+  }
+
+ruleArabicCommas :: Rule
+ruleArabicCommas = Rule
+  { name = "Arabic number with commas and optional Arabic decimal separator"
+  , pattern =
+    [ regex "([٠-٩]{1,3}(٬[٠-٩]{3}){1,5}(٫[٠-٩]+)?)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseArabicDoubleFromText (Text.replace "٬" Text.empty match) >>=
+          double
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
-  [ ruleDecimalNumeral
+  [ ruleIntegerNumeric
+  , ruleFractionsNumeric
+  , ruleDecimalNumeral
   , ruleDecimalWithThousandsSeparator
   , ruleInteger
   , ruleInteger11
@@ -369,4 +408,6 @@
   , ruleNumeralsPrefixWithMinus
   , rulePowersOfTen
   , ruleInteger200
+  , ruleArabicDecimal
+  , ruleArabicCommas
   ]
diff --git a/Duckling/Numeral/BG/Corpus.hs b/Duckling/Numeral/BG/Corpus.hs
--- a/Duckling/Numeral/BG/Corpus.hs
+++ b/Duckling/Numeral/BG/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Numeral/BG/Rules.hs b/Duckling/Numeral/BG/Rules.hs
--- a/Duckling/Numeral/BG/Rules.hs
+++ b/Duckling/Numeral/BG/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/BN/Corpus.hs b/Duckling/Numeral/BN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/BN/Corpus.hs
@@ -0,0 +1,101 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.BN.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 BN Nothing}, testOptions,
+          allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+            [ "শূন্য"
+            , "০"
+            ]
+  , examples (NumeralValue 1)
+            [ "এক"
+            ]
+  , examples (NumeralValue 2)
+            [ "দুই"
+            ]
+  , examples (NumeralValue 3)
+            [ "তিন"
+            ]
+  , examples (NumeralValue 4)
+            [ "চার"
+            ]
+  , examples (NumeralValue 5)
+            [ "পাঁচ"
+            ]
+  , examples (NumeralValue 6)
+            [ "ছয়"
+            ]
+  , examples (NumeralValue 7)
+            [ "সাত"
+            ]
+  , examples (NumeralValue 8)
+            [ "আট"
+            ]
+  , examples (NumeralValue 9)
+            [ "নয়"
+            ]
+  , examples (NumeralValue 10)
+            [ "দশ"
+            ]
+  , examples (NumeralValue 11)
+            [ "এগারো"
+            ]
+  , examples (NumeralValue 15)
+            [ "পনেরো"
+            ]
+  , examples (NumeralValue 17)
+            [ "সতেরো"
+            ]
+  , examples (NumeralValue 20)
+            [ "কুড়ি"
+            ]
+  , examples (NumeralValue 22)
+            [ "বাইশ"
+            ]
+  , examples (NumeralValue 24)
+            [ "চব্বিশ"
+            ]
+  , examples (NumeralValue 25)
+            [ "পঁচিশ"
+            ]
+  , examples (NumeralValue 26)
+            [ "ছাব্বিশ"
+            ]
+  , examples (NumeralValue 28)
+            [ "আঠাশ"
+            ]
+  , examples (NumeralValue 30)
+            [ "তিরিশ"
+            ]
+  , examples (NumeralValue 40)
+            [ "চল্লিশ"
+            ]
+  , examples (NumeralValue 50)
+            [ "পঞ্চাশ"
+            ]
+  , examples (NumeralValue 70)
+            [ "সত্তর"
+            ]
+  ]
diff --git a/Duckling/Numeral/BN/Rules.hs b/Duckling/Numeral/BN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/BN/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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Numeral.BN.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
+
+bengaliMap :: HashMap Char Char
+bengaliMap = HashMap.fromList
+  [ ( '০', '0' )
+  , ( '১', '1' )
+  , ( '২', '2' )
+  , ( '৩', '3' )
+  , ( '৪', '4' )
+  , ( '৫', '5' )
+  , ( '৬', '6' )
+  , ( '৭', '7' )
+  , ( '৮', '8' )
+  , ( '৯', '9' )
+  ]
+
+bengaliToArab :: Char -> Char
+bengaliToArab c = HashMap.lookupDefault c c bengaliMap
+
+ruleBengali :: Rule
+ruleBengali = Rule
+  { name = "bengali forms"
+  , pattern =
+    [ regex "([০১২৩৪৫৬৭৮৯]{1,18})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        toInteger <$> parseInt (Text.map bengaliToArab match) >>= integer
+      _ -> 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 = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match ruleNumeralMap >>= integer
+      _ -> Nothing
+}
+
+elevenToNineteenMap :: HashMap Text Integer
+elevenToNineteenMap = HashMap.fromList
+  [ ( "এগারো", 11 )
+  , ( "বারো", 12 )
+  , ( "তেরো", 13 )
+  , ( "চৌদ্দ", 14 )
+  , ( "পনেরো", 15 )
+  , ( "ষোল", 16 )
+  , ( "সতেরো", 17 )
+  , ( "আঠারো", 18 )
+  , ( "উনিশ", 19 )
+  ]
+
+ruleElevenToNineteen :: Rule
+ruleElevenToNineteen = Rule
+  { name = "number (11..19)"
+  , pattern =
+    [ regex "(এগারো|বারো|তেরো|চৌদ্দ|পনেরো|ষোল|সতেরো|আঠারো|উনিশ)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match elevenToNineteenMap >>= integer
+      _ -> Nothing
+}
+
+twentyoneToTwentynineMap :: HashMap Text Integer
+twentyoneToTwentynineMap = HashMap.fromList
+  [ ( "একুশ", 21 )
+  , ( "বাইশ", 22 )
+  , ( "তেইশ", 23 )
+  , ( "চব্বিশ", 24 )
+  , ( "পঁচিশ", 25 )
+  , ( "ছাব্বিশ", 26 )
+  , ( "সাতাশ", 27 )
+  , ( "আঠাশ", 28 )
+  , ( "ঊনত্রিশ", 29 )
+  ]
+
+ruleTwentyoneToTwentynine :: Rule
+ruleTwentyoneToTwentynine = Rule
+  { name = "number (21..29)"
+  , pattern =
+    [ regex "(একুশ|বাইশ|তেইশ|চব্বিশ|পঁচিশ|ছাব্বিশ|সাতাশ|আঠাশ|ঊনত্রিশ)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match twentyoneToTwentynineMap >>= integer
+      _ -> Nothing
+}
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "কুড়ি", 20 )
+  , ( "তিরিশ", 30 )
+  , ( "চল্লিশ", 40 )
+  , ( "পঞ্চাশ", 50 )
+  , ( "ষাট", 60 )
+  , ( "সত্তর", 70 )
+  , ( "আশি", 80 )
+  , ( "নব্বই", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(কুড়ি|তিরিশ|চল্লিশ|পঞ্চাশ|ষাট|সত্তর|আশি|নব্বই)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match tensMap >>= integer
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleBengali
+  , ruleNumeral
+  , ruleElevenToNineteen
+  , ruleTwentyoneToTwentynine
+  , ruleTens
+  ]
diff --git a/Duckling/Numeral/CA/Corpus.hs b/Duckling/Numeral/CA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/CA/Corpus.hs
@@ -0,0 +1,162 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.CA.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 CA Nothing }, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1)
+        [ "1"
+        , "u"
+        , "un"
+        , "una"
+        ]
+    , examples (NumeralValue 11)
+        [ "onze"
+        ]
+    , examples (NumeralValue 12)
+        [ "dotze"
+        ]
+    , examples (NumeralValue 13)
+        [ "tretze"
+        ]
+    , examples (NumeralValue 14)
+        [ "catorze"
+        ]
+    , examples (NumeralValue 15)
+        [ "quinze"
+        ]
+    , examples (NumeralValue 16)
+        [ "setze"
+        ]
+    , examples (NumeralValue 17)
+        [ "disset"
+        , "dèsset"
+        ]
+    , examples (NumeralValue 18)
+        [ "divuit"
+        , "dihuit"
+        , "devuit"
+        ]
+    , examples (NumeralValue 19)
+        [ "dinou"
+        , "dènou"
+        , "denou"
+        ]
+    , examples (NumeralValue 20)
+        [ "vint"
+        ]
+    , examples (NumeralValue 21)
+        [ "vint-i-un"
+        , "vint i un"
+        ]
+    , examples (NumeralValue 22)
+        [ "vint-i-dos"
+        , "vint i dos"
+        ]
+    , examples (NumeralValue 23)
+        [ "vint-i-tres"
+        , "vint i tres"
+        ]
+    , examples (NumeralValue 37)
+        [ "trenta-set"
+        ]
+    , examples (NumeralValue 40)
+        [ "quaranta"
+        ]
+    , examples (NumeralValue 70)
+        [ "setanta"
+        ]
+    , examples (NumeralValue 78)
+        [ "Setanta-vuit"
+        ]
+    , examples (NumeralValue 80)
+        [ "vuitanta"
+        ]
+    , examples (NumeralValue 33)
+        [ "33"
+        , "trenta-tres"
+        , "trenta-3"
+        ]
+    , examples (NumeralValue 100000)
+        [ "100000"
+        , "100K"
+        , "100k"
+        ]
+    , examples (NumeralValue 300)
+        [ "tres-cents"
+        ]
+    , examples (NumeralValue 243)
+        [ "243"
+        ]
+    , examples (NumeralValue 85)
+        [ "vuitanta-cinc"
+        ]
+    , examples (NumeralValue 3000000)
+        [ "3M"
+        , "3000K"
+        , "3000000"
+        ]
+    , examples (NumeralValue 1200000)
+        [ "1200000"
+        , "1200K"
+        ]
+    , examples (NumeralValue (-1200000))
+        [ "-1200000"
+        , "-1200K"
+        ]
+    , examples (NumeralValue 1.5)
+        [ "1 coma cinc"
+        , "una coma cinc"
+        , "u coma cinc"
+        ]
+    , examples (NumeralValue 1)
+        [ "zero u"
+        , "zero un"
+        ]
+    , examples (NumeralValue 2)
+        [ "zero dos"
+        ]
+    , examples (NumeralValue 3)
+        [ "zero tres"
+        ]
+    , examples (NumeralValue 4)
+        [ "zero quatre"
+        ]
+    , examples (NumeralValue 5)
+        [ "zero cinc"
+        ]
+    , examples (NumeralValue 6)
+        [ "zero sis"
+        ]
+    , examples (NumeralValue 7)
+        [ "zero set"
+        ]
+    , examples (NumeralValue 8)
+        [ "zero vuit"
+        ]
+    , examples (NumeralValue 9)
+        [ "zero nou"
+        ]
+    ]
+
+-- Ull, revisar la xifra amb decimals
diff --git a/Duckling/Numeral/CA/Rules.hs b/Duckling/Numeral/CA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/CA/Rules.hs
@@ -0,0 +1,300 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.CA.Rules (rules) where
+
+import Data.HashMap.Strict (HashMap)
+import qualified Data.HashMap.Strict as HashMap
+import Data.Maybe
+import Data.String
+import Data.Text (Text)
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types (NumeralData(..))
+import qualified Duckling.Numeral.Types as TNumeral
+import Duckling.Regex.Types
+import Duckling.Types
+
+zeroToFifteenMap :: HashMap Text Integer
+zeroToFifteenMap =
+  HashMap.fromList
+    [ ("zero", 0)
+    , ("u", 1)
+    , ("un", 1)
+    , ("una", 1)
+    , ("dos", 2)
+    , ("dues", 2)
+    , ("tres", 3)
+    , ("quatre", 4)
+    , ("cinc", 5)
+    , ("sis", 6)
+    , ("set", 7)
+    , ("vuit", 8)
+    , ("nou", 9)
+    , ("deu", 10)
+    , ("onze", 11)
+    , ("dotze", 12)
+    , ("tretze", 13)
+    , ("catorze", 14)
+    , ("quinze", 15)
+    ]
+
+ruleZeroToFifteen :: Rule
+ruleZeroToFifteen = Rule
+  { name = "number (0..15)"
+  , pattern =
+      [ regex
+          "(zero|u(na|n)?|d(o|ue)s|tres|quatre|cinc|sis|set|vuit|nou|deu|onze|dotze|tretze|catorze|quinze)"
+      ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroToFifteenMap >>= integer
+      _ -> Nothing
+  }
+
+ruleNumeralsPrefixWithNegativeOrMinus :: Rule
+ruleNumeralsPrefixWithNegativeOrMinus = Rule
+  { name = "numbers prefix with -, negative or minus"
+  , pattern = [regex "-|menys", Predicate isPositive]
+  , prod = \case
+      (_ : Token Numeral NumeralData { TNumeral.value = v } : _) ->
+        double $ negate v
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap =
+  HashMap.fromList
+    [ ("vint", 20)
+    , ("trenta", 30)
+    , ("quaranta", 40)
+    , ("cinquanta", 50)
+    , ("seixanta", 60)
+    , ("setanta", 70)
+    , ("vuitanta", 80)
+    , ("noranta", 90)
+    ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "number (20..90)"
+  , pattern =
+      [ regex
+          "(vint|(tre|quara|cinqua|seixa|seta|vuita|nora)nta)"
+      ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)) : _) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+sixteenToTwentyNineMap :: HashMap Text Integer
+sixteenToTwentyNineMap =
+  HashMap.fromList
+    [ ("setze", 16)
+    , ("disset", 17)
+    , ("dèsset", 17)
+    , ("devuit", 18)
+    , ("divuit", 18)
+    , ("dihuit", 18)
+    , ("dinou", 19)
+    , ("dènou", 19)
+    , ("denou", 19)
+    , ("vint-i-u", 21)
+    , ("vint-i-una", 21)
+    , ("vint-i-dos", 22)
+    , ("vint-i-tres", 23)
+    , ("vint-i-quatre", 24)
+    , ("vint-i-cinc", 25)
+    , ("vint-i-sis", 26)
+    , ("vint-i-set", 27)
+    , ("vint-i-vuit", 28)
+    , ("vint-i-nou", 29)
+    ]
+
+ruleLowerTensWithOnes :: Rule
+ruleLowerTensWithOnes = Rule
+  { name = "number (16..19 21..29)"
+  , pattern =
+      [ regex
+          "(setze|d(i|e|è)sset|d(e|i)(v|h)uit|d(i|e|è)nou|vint-i-u(na)?|vint-i-dos|vint-i-tres|vint-i-quatre|vint-i-cinc|vint-i-sis|vint-i-set|vint-i-vuit|vint-i-nou)"
+      ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) sixteenToTwentyNineMap >>= integer
+      _ -> Nothing
+  }
+
+ruleHigherTensWithOnes :: Rule
+ruleHigherTensWithOnes = Rule
+  { name = "number (31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
+  , pattern =
+      [oneOf [30, 40, 50, 60, 70, 80, 90], regex "-", numberBetween 1 9]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + v2
+      _ -> Nothing
+  }
+
+ruleNumeralsSuffixesKMG :: Rule
+ruleNumeralsSuffixesKMG = Rule
+  { name = "numbers suffixes (K, M, G)"
+  , pattern = [dimension Numeral, regex "([kmg])(?=[\\W\\$€]|$)"]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) ->
+        case Text.toLower match of
+          "k" -> double $ v * 1e3
+          "m" -> double $ v * 1e6
+          "g" -> double $ v * 1e9
+          _ -> Nothing
+      _ -> Nothing
+  }
+
+oneHundredToThousandMap :: HashMap Text Integer
+oneHundredToThousandMap =
+  HashMap.fromList
+    [ ("cent", 100)
+    , ("cents", 100)
+    , ("dos-cents", 200)
+    , ("tres-cents", 300)
+    , ("quatre-cents", 400)
+    , ("cinc-cents", 500)
+    , ("sis-cents", 600)
+    , ("set-cents", 700)
+    , ("vuit-cents", 800)
+    , ("nou-cents", 900)
+    , ("mil", 1000)
+    ]
+
+ruleTwenties :: Rule
+ruleTwenties = Rule
+  { name = "number (21..29)"
+  , pattern =
+      [oneOf [20], regex "(-i-| i )", numberBetween 1 10]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + v2
+      _ -> Nothing
+  }
+
+ruleHundreds :: Rule
+ruleHundreds = Rule
+  { name = "number 100..1000 "
+  , pattern =
+      [ regex
+          "(cent(s)?|dos-cents|tres-cents|quatre-cents|cinc-cents|sis-cents|set-cents|vuit-cents|nou-cents|mil)"
+      ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) oneHundredToThousandMap >>= integer
+      _ -> Nothing
+  }
+
+-- Afegeixo regex "-" perque les centenes s'escriuen dos-cent, tres-cent
+ruleNumerals :: Rule
+ruleNumerals = Rule
+  { name = "numbers 200..999"
+  , pattern =
+      [ numberBetween 2 10
+      , regex "-"
+      , numberWith TNumeral.value (== 100)
+      , numberBetween 0 100
+      ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ 100 * v1 + v2
+      _ -> Nothing
+  }
+
+ruleNumeralDotNumeral :: Rule
+ruleNumeralDotNumeral = Rule
+  { name = "number dot number"
+  , pattern = [dimension Numeral, regex "coma", Predicate $ not . hasGrain]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + decimalsToDouble v2
+      _ -> Nothing
+  }
+
+ruleBelowTenWithTwoDigits :: Rule
+ruleBelowTenWithTwoDigits = Rule
+  { name = "integer (0-9) with two digits"
+  , pattern =
+      [ regex "zero|0"
+      , numberBetween 1 10
+      ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double v
+      _ -> Nothing
+  }
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        let fmt = Text.replace "," "." . Text.replace "." Text.empty $ match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleBelowTenWithTwoDigits
+  , ruleZeroToFifteen
+  , ruleTens
+  , ruleTwenties
+  , ruleLowerTensWithOnes
+  , ruleHigherTensWithOnes
+  , ruleHundreds
+
+  , ruleNumeralDotNumeral
+  , ruleNumerals
+  , ruleNumeralsPrefixWithNegativeOrMinus
+  , ruleNumeralsSuffixesKMG
+  , ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -142,14 +141,16 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(hundrede?|tusinde?|million(er)?)"
+    [ regex "(hundrede?|tohundrede|tusinde?|totusinde|million(er)?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "hundred"   -> double 1e2 >>= withGrain 2 >>= withMultipliable
         "hundrede"  -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "tohundrede"  -> double (2 * 1e2) >>= withGrain 2 >>= withMultipliable
         "tusind"    -> double 1e3 >>= withGrain 3 >>= withMultipliable
         "tusinde"   -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "totusinde"   -> double (2 * 1e3) >>= withGrain 3 >>= withMultipliable
         "million"   -> double 1e6 >>= withGrain 6 >>= withMultipliable
         "millioner" -> double 1e6 >>= withGrain 6 >>= withMultipliable
         _           -> Nothing
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -58,6 +57,10 @@
   , examples (NumeralValue 14)
              [ "14"
              , "vierzehn"
+             ]
+  , examples (NumeralValue 15)
+             [ "15"
+             , "fünfzehn"
              ]
   , examples (NumeralValue 16)
              [ "16"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -90,7 +89,7 @@
 ruleInteger3 = Rule
   { name = "integer ([2-9][1-9])"
   , pattern =
-    [ regex "(ein|zwei|drei|vier|fünf|sechs|sieben|acht|neun)und(zwanzig|dreissig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig)"
+    [ regex "(ein|zwei|drei|vier|fünf|sechs|sieben|acht|neun)und(zwanzig|dreissig|dreißig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
@@ -108,6 +107,7 @@
         v2 <- case Text.toLower m2 of
           "zwanzig" -> Just 20
           "dreissig" -> Just 30
+          "dreißig" -> Just 30
           "vierzig" -> Just 40
           "fünfzig" -> Just 50
           "sechzig" -> Just 60
@@ -255,7 +255,7 @@
 ruleZeroToNineteen = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(keine[rn]|keine?s?|null|nichts|eins?(er)?|zwei|dreizehn|drei|vierzehn|vier|fünf|sechzehn|sechs|siebzehn|sieben|achtzehn|acht|neunzehn|neun|elf|zwölf|füfzehn)"
+    [ regex "(keine[rn]|keine?s?|null|nichts|eins?(er)?|zwei|dreizehn|drei|vierzehn|vier|fünfzehn|fünf|sechzehn|sechs|siebzehn|sieben|achtzehn|acht|neunzehn|neun|elf|zwölf)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -267,6 +267,7 @@
 tensMap = HashMap.fromList
   [ ( "zwanzig" , 20 )
   , ( "dreissig", 30 )
+  , ( "dreißig" , 30 )
   , ( "vierzig" , 40 )
   , ( "fünfzig" , 50 )
   , ( "sechzig" , 60 )
@@ -280,7 +281,7 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(zwanzig|dreissig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig)"
+    [ regex "(zwanzig|dreissig|dreißig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
diff --git a/Duckling/Numeral/EL/Corpus.hs b/Duckling/Numeral/EL/Corpus.hs
--- a/Duckling/Numeral/EL/Corpus.hs
+++ b/Duckling/Numeral/EL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Numeral/EL/Rules.hs b/Duckling/Numeral/EL/Rules.hs
--- a/Duckling/Numeral/EL/Rules.hs
+++ b/Duckling/Numeral/EL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/EN/Corpus.hs b/Duckling/Numeral/EN/Corpus.hs
--- a/Duckling/Numeral/EN/Corpus.hs
+++ b/Duckling/Numeral/EN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -115,6 +114,9 @@
              , "3000000"
              , "3,000,000"
              , "3 million"
+             , "30 lakh"
+             , "30 lkh"
+             , "30 l"
              ]
   , examples (NumeralValue 1.2e6)
              [ "1,200,000"
@@ -122,6 +124,8 @@
              , "1.2M"
              , "1200k"
              , ".0012G"
+             , "12 lakhs"
+             , "12 lkhs"
              ]
   , examples (NumeralValue 5000)
              [ "5 thousand"
@@ -140,6 +144,11 @@
              , "-1200K"
              , "-.0012G"
              ]
+  , examples (NumeralValue (-3200000))
+             [ "-3,200,000"
+             , "-3200000"
+             , "minus three million two hundred thousand"
+             ]
   , examples (NumeralValue 122)
              [ "one twenty two"
              , "ONE TwentY tWO"
@@ -156,6 +165,8 @@
              ]
   , examples (NumeralValue 31256721)
              [ "thirty-one million two hundred fifty-six thousand seven hundred twenty-one"
+             , "three crore twelve lakh fifty-six thousand seven hundred twenty-one"
+             , "three cr twelve lac fifty-six thousand seven hundred twenty-one"
              ]
   , examples (NumeralValue 2400)
              [ "two hundred dozens"
@@ -167,5 +178,10 @@
   , examples (NumeralValue 3000000000)
              [ "three billions"
              , "three thousand millions"
+             , "three hundred crores"
+             , "three hundred Cr"
+             , "three hundred koti"
+             , "three hundred krores"
+             , "three hundred Kr"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -17,7 +16,6 @@
 import Control.Applicative ((<|>))
 import Data.HashMap.Strict (HashMap)
 import Data.Maybe
-import Data.String
 import Data.Text (Text)
 import Prelude
 import qualified Data.HashMap.Strict as HashMap
@@ -127,19 +125,32 @@
       _ -> Nothing
   }
 
+powersOfTensMap :: HashMap Text Int
+powersOfTensMap = HashMap.fromList
+  [ ("hundred", 2)
+  , ("thousand", 3)
+  , ("lakh", 5)
+  , ("lkh", 5)
+  , ("l", 5)
+  , ("lac", 5)
+  , ("million", 6)
+  , ("cr", 7)
+  , ("crore", 7)
+  , ("krore", 7)
+  , ("kr", 7)
+  , ("koti", 7)
+  , ("billion", 9)
+  , ("trillion", 12)
+  ]
+
 rulePowersOfTen :: Rule
 rulePowersOfTen = Rule
   { name = "powers of tens"
-  , pattern =
-    [ regex "(hundred|thousand|million|billion)s?"
-    ]
+  , pattern = [regex "(hundred|thousand|l(ac|(a?kh)?)|million|((k|c)r(ore)?|koti)|billion)s?"]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "hundred"  -> double 1e2 >>= withGrain 2 >>= withMultipliable
-        "thousand" -> double 1e3 >>= withGrain 3 >>= withMultipliable
-        "million"  -> double 1e6 >>= withGrain 6 >>= withMultipliable
-        "billion"  -> double 1e9 >>= withGrain 9 >>= withMultipliable
-        _          -> Nothing
+      (Token RegexMatch (GroupMatch (match : _)) : _) -> do
+        grain <- HashMap.lookup (Text.toLower match) powersOfTensMap
+        double (10 ^ grain) >>= withGrain grain >>= withMultipliable
       _ -> Nothing
   }
 
@@ -148,10 +159,12 @@
   { name = "integer 21..99"
   , pattern =
     [ oneOf [20,30..90]
+    , regex "[\\s\\-]+"
     , numberBetween 1 10
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = tens}:
+       _:
        Token Numeral NumeralData{TNumeral.value = units}:
        _) -> double $ tens + units
       _ -> Nothing
@@ -312,7 +325,7 @@
 ruleMultiply = Rule
   { name = "compose by multiplication"
   , pattern =
-    [ dimension Numeral
+    [ Predicate isPositive
     , Predicate isMultipliable
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/ES/AR/Corpus.hs b/Duckling/Numeral/ES/AR/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/AR/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.AR.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1,1", "1,10", "01,10"]
+    , examples (NumeralValue 0.77) ["0,77", ",77"]
+    , examples (NumeralValue 100000) ["100.000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3.000.000"]
+    , examples (NumeralValue 1200000) ["1.200.000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1.200.000", "menos 1.200.000", "-1,2M", "-,0012G"]
+    , examples (NumeralValue 1.5) ["1,5"]
+    ]
diff --git a/Duckling/Numeral/ES/AR/Rules.hs b/Duckling/Numeral/ES/AR/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/AR/Rules.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.AR.Rules (rules) where
+
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
diff --git a/Duckling/Numeral/ES/CL/Corpus.hs b/Duckling/Numeral/ES/CL/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/CL/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.CL.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1,1", "1,10", "01,10"]
+    , examples (NumeralValue 0.77) ["0,77", ",77"]
+    , examples (NumeralValue 100000) ["100.000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3.000.000"]
+    , examples (NumeralValue 1200000) ["1.200.000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1.200.000", "menos 1.200.000", "-1,2M", "-,0012G"]
+    , examples (NumeralValue 1.5) ["1,5"]
+    ]
diff --git a/Duckling/Numeral/ES/CL/Rules.hs b/Duckling/Numeral/ES/CL/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/CL/Rules.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.CL.Rules (rules) where
+
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
diff --git a/Duckling/Numeral/ES/CO/Corpus.hs b/Duckling/Numeral/ES/CO/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/CO/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.CO.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1,1", "1,10", "01,10"]
+    , examples (NumeralValue 0.77) ["0,77", ",77"]
+    , examples (NumeralValue 100000) ["100.000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3.000.000"]
+    , examples (NumeralValue 1200000) ["1.200.000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1.200.000", "menos 1.200.000", "-1,2M", "-,0012G"]
+    , examples (NumeralValue 1.5) ["1,5"]
+    ]
diff --git a/Duckling/Numeral/ES/CO/Rules.hs b/Duckling/Numeral/ES/CO/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/CO/Rules.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.CO.Rules (rules) where
+
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
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
@@ -2,17 +2,14 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
-
-module Duckling.Numeral.ES.Corpus
-  ( corpus ) where
+module Duckling.Numeral.ES.Corpus (corpus) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Locale
 import Duckling.Numeral.Types
@@ -20,91 +17,50 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
+corpus =
+  (testContext { locale = makeLocale ES Nothing }, testOptions, allExamples)
 
 allExamples :: [Example]
-allExamples = concat
-  [ examples (NumeralValue 1)
-             [ "1"
-             , "uno"
-             , "una"
-             ]
-  , examples (NumeralValue 11)
-             [ "once"
-             ]
-  , examples (NumeralValue 16)
-             [ "dieciséis"
-             , "dieciseis"
-             , "Diesiseis"
-             , "diez y seis"
-             ]
-  , examples (NumeralValue 21)
-             [ "veintiuno"
-             , "veinte y uno"
-             ]
-  , examples (NumeralValue 23)
-             [ "veintitrés"
-             , "veinte y tres"
-             ]
-  , examples (NumeralValue 70)
-             [ "setenta"
-             ]
-  , examples (NumeralValue 78)
-             [ "Setenta y ocho"
-             ]
-  , examples (NumeralValue 80)
-             [ "ochenta"
-             ]
-  , examples (NumeralValue 33)
-             [ "33"
-             , "treinta y tres"
-             , "treinta y 3"
-             ]
-  , examples (NumeralValue 1.1)
-             [ "1,1"
-             , "1,10"
-             , "01,10"
-             ]
-  , examples (NumeralValue 0.77)
-             [ "0,77"
-             , ",77"
-             ]
-  , examples (NumeralValue 100000)
-             [ "100.000"
-             , "100000"
-             , "100K"
-             , "100k"
-             ]
-  , examples (NumeralValue 300)
-             [ "trescientos"
-             ]
-  , examples (NumeralValue 243)
-             [ "243"
-             ]
-  , examples (NumeralValue 3000000)
-             [ "3M"
-             , "3000K"
-             , "3000000"
-             , "3.000.000"
-             ]
-  , examples (NumeralValue 1200000)
-             [ "1.200.000"
-             , "1200000"
-             , "1,2M"
-             , "1200K"
-             , ",0012G"
-             ]
-  , examples (NumeralValue (-1200000))
-             [ "- 1.200.000"
-             , "-1200000"
-             , "menos 1.200.000"
-             , "-1,2M"
-             , "-1200K"
-             , "-,0012G"
-             ]
-  , examples (NumeralValue 1.5)
-             [ "1 punto cinco"
-             , "una punto cinco"
-             , "1,5"
-             ]
-  ]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1", "uno", "una"]
+    , examples (NumeralValue 11) ["once"]
+    , examples
+        (NumeralValue 16)
+        ["dieciséis", "dieciseis", "Diesiseis", "diez y seis"]
+    , examples (NumeralValue 21) ["veintiuno", "veinte y uno"]
+    , examples (NumeralValue 22) ["veintidós"]
+    , examples (NumeralValue 23) ["veintitrés", "veinte y tres"]
+    , examples (NumeralValue 70) ["setenta"]
+    , examples (NumeralValue 78) ["Setenta y ocho"]
+    , examples (NumeralValue 80) ["ochenta"]
+    , examples (NumeralValue 33) ["33", "treinta y tres", "treinta y 3"]
+    , examples (NumeralValue 100000) ["100000", "100K", "100k"]
+    , examples (NumeralValue 300) ["trescientos"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3M", "3000K", "3000000"]
+    , examples (NumeralValue 1200000) ["1200000", "1200K"]
+    , examples (NumeralValue (-1200000)) ["-1200000", "-1200K"]
+    , examples (NumeralValue 1.5) ["1 punto cinco", "una punto cinco"]
+    , examples (NumeralValue 1) ["cero uno", "zero uno"]
+    , examples (NumeralValue 2) ["cero dos", "zero dos"]
+    , examples (NumeralValue 3)
+               [
+                 "cero tres",
+                 "cero trés",
+                 "zero tres",
+                 "zero trés"
+               ]
+    , examples (NumeralValue 4) ["cero cuatro", "zero cuatro"]
+    , examples (NumeralValue 5) ["cero cinco", "zero cinco"]
+    , examples (NumeralValue 6)
+               [
+                 "cero seis",
+                 "cero séis",
+                 "zero seis",
+                 "zero séis"
+               ]
+    , examples (NumeralValue 7) ["cero siete", "zero siete"]
+    , examples (NumeralValue 8) ["cero ocho", "zero ocho"]
+    , examples (NumeralValue 9) ["cero nueve", "zero nueve"]
+    ]
diff --git a/Duckling/Numeral/ES/ES/Corpus.hs b/Duckling/Numeral/ES/ES/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/ES/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.ES.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1,1", "1,10", "01,10"]
+    , examples (NumeralValue 0.77) ["0,77", ",77"]
+    , examples (NumeralValue 100000) ["100.000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3.000.000"]
+    , examples (NumeralValue 1200000) ["1.200.000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1.200.000", "menos 1.200.000", "-1,2M", "-,0012G"]
+    , examples (NumeralValue 1.5) ["1,5"]
+    ]
diff --git a/Duckling/Numeral/ES/ES/Rules.hs b/Duckling/Numeral/ES/ES/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/ES/Rules.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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.ES.Rules
+  ( rules
+  , rulesBackwardCompatible
+  ) where
+
+import qualified Data.HashMap.Strict as HashMap
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types (NumeralData(..))
+import qualified Duckling.Numeral.Types as TNumeral
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rulesBackwardCompatible :: [Rule]
+rulesBackwardCompatible =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
+
+rules :: [Rule]
+rules = rulesBackwardCompatible
diff --git a/Duckling/Numeral/ES/MX/Corpus.hs b/Duckling/Numeral/ES/MX/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/MX/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.MX.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1.1", "1.10", "01.10"]
+    , examples (NumeralValue 0.77) ["0.77", ".77"]
+    , examples (NumeralValue 100000) ["100,000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3,000,000"]
+    , examples (NumeralValue 1200000) ["1,200,000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1,200,000", "menos 1,200,000", "-1.2M", "-.0012G"]
+    , examples (NumeralValue 1.5) ["1.5"]
+    ]
diff --git a/Duckling/Numeral/ES/MX/Rules.hs b/Duckling/Numeral/ES/MX/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/MX/Rules.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.MX.Rules (rules) where
+
+import qualified Data.HashMap.Strict as HashMap
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator"
+  , pattern = [regex "(\\d+(\\,\\d\\d\\d)+\\.\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "," Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ."
+  , pattern = [regex "(\\d*\\.\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ,"
+  , pattern = [regex "(\\d{1,3}(\\,\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "," Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
diff --git a/Duckling/Numeral/ES/PE/Corpus.hs b/Duckling/Numeral/ES/PE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/PE/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.PE.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1,1", "1,10", "01,10"]
+    , examples (NumeralValue 0.77) ["0,77", ",77"]
+    , examples (NumeralValue 100000) ["100.000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3.000.000"]
+    , examples (NumeralValue 1200000) ["1.200.000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1.200.000", "menos 1.200.000", "-1,2M", "-,0012G"]
+    , examples (NumeralValue 1.5) ["1,5"]
+    ]
diff --git a/Duckling/Numeral/ES/PE/Rules.hs b/Duckling/Numeral/ES/PE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/PE/Rules.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.PE.Rules (rules) where
+
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
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
@@ -2,161 +2,138 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
 
-module Duckling.Numeral.ES.Rules
-  ( rules
-  ) where
+module Duckling.Numeral.ES.Rules (rules) where
 
+import qualified Data.HashMap.Strict as HashMap
 import Data.Maybe
 import Data.String
-import Prelude
-import qualified Data.HashMap.Strict as HashMap
 import qualified Data.Text as Text
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers
-import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Numeral.Types (NumeralData(..))
+import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Regex.Types
 import Duckling.Types
-import qualified Duckling.Numeral.Types as TNumeral
 
 ruleNumeralsPrefixWithNegativeOrMinus :: Rule
 ruleNumeralsPrefixWithNegativeOrMinus = Rule
   { name = "numbers prefix with -, negative or minus"
-  , pattern =
-    [ regex "-|menos"
-    , Predicate isPositive
-    ]
-  , prod = \tokens -> case tokens of
-      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
-        double $ v * (- 1)
-      _ -> Nothing
-  }
-
-ruleDecimalWithThousandsSeparator :: Rule
-ruleDecimalWithThousandsSeparator = Rule
-  { name = "decimal with thousands separator"
-  , pattern =
-    [ regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):
-       _) -> let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
-        in parseDouble fmt >>= double
-      _ -> Nothing
-  }
-
-ruleDecimalNumeral :: Rule
-ruleDecimalNumeral = Rule
-  { name = "decimal number"
-  , pattern =
-    [ regex "(\\d*,\\d+)"
-    ]
+  , pattern = [regex "-|menos", Predicate isPositive]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
-        parseDecimal False match
+      (_ : Token Numeral NumeralData { TNumeral.value = v } : _) ->
+        double $ v * (-1)
       _ -> Nothing
   }
 
 byTensMap :: HashMap.HashMap Text.Text Integer
-byTensMap = HashMap.fromList
-  [ ( "veinte" , 20 )
-  , ( "treinta" , 30 )
-  , ( "cuarenta" , 40 )
-  , ( "cincuenta" , 50 )
-  , ( "sesenta" , 60 )
-  , ( "setenta" , 70 )
-  , ( "ochenta" , 80 )
-  , ( "noventa" , 90 )
-  ]
+byTensMap =
+  HashMap.fromList
+    [ ("veinte", 20)
+    , ("treinta", 30)
+    , ("cuarenta", 40)
+    , ("cincuenta", 50)
+    , ("sesenta", 60)
+    , ("setenta", 70)
+    , ("ochenta", 80)
+    , ("noventa", 90)
+    ]
 
 ruleNumeral2 :: Rule
 ruleNumeral2 = Rule
   { name = "number (20..90)"
   , pattern =
-    [ regex "(veinte|treinta|cuarenta|cincuenta|sesenta|setenta|ochenta|noventa)"
-    ]
+      [ regex
+          "(veinte|treinta|cuarenta|cincuenta|sesenta|setenta|ochenta|noventa)"
+      ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
         HashMap.lookup (Text.toLower match) byTensMap >>= integer
       _ -> Nothing
   }
 
 zeroToFifteenMap :: HashMap.HashMap Text.Text Integer
-zeroToFifteenMap = HashMap.fromList
-  [ ( "zero" , 0 )
-  , ( "cero" , 0 )
-  , ( "un" , 1 )
-  , ( "una" , 1 )
-  , ( "uno" , 1 )
-  , ( "dos" , 2 )
-  , ( "trés" , 3 )
-  , ( "tres" , 3 )
-  , ( "cuatro" , 4 )
-  , ( "cinco" , 5 )
-  , ( "seis" , 6 )
-  , ( "séis" , 6 )
-  , ( "siete" , 7 )
-  , ( "ocho" , 8 )
-  , ( "nueve" , 9 )
-  , ( "diez" , 10 )
-  , ( "dies" , 10 )
-  , ( "once" , 11 )
-  , ( "doce" , 12 )
-  , ( "trece" , 13 )
-  , ( "catorce" , 14 )
-  , ( "quince" , 15 )
-  ]
+zeroToFifteenMap =
+  HashMap.fromList
+    [ ("zero", 0)
+    , ("cero", 0)
+    , ("un", 1)
+    , ("una", 1)
+    , ("uno", 1)
+    , ("dos", 2)
+    , ("trés", 3)
+    , ("tres", 3)
+    , ("cuatro", 4)
+    , ("cinco", 5)
+    , ("seis", 6)
+    , ("séis", 6)
+    , ("siete", 7)
+    , ("ocho", 8)
+    , ("nueve", 9)
+    , ("diez", 10)
+    , ("dies", 10)
+    , ("once", 11)
+    , ("doce", 12)
+    , ("trece", 13)
+    , ("catorce", 14)
+    , ("quince", 15)
+    ]
 
 ruleNumeral :: Rule
 ruleNumeral = Rule
   { name = "number (0..15)"
   , pattern =
-    [ 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)"
-    ]
+      [ 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:_)):_) ->
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
         HashMap.lookup (Text.toLower match) zeroToFifteenMap >>= integer
       _ -> Nothing
   }
 
 sixteenToTwentyNineMap :: HashMap.HashMap Text.Text Integer
-sixteenToTwentyNineMap = HashMap.fromList
-  [ ( "dieciseis" , 16 )
-  , ( "diesiséis" , 16 )
-  , ( "diesiseis" , 16 )
-  , ( "dieciséis" , 16 )
-  , ( "diecisiete" , 17 )
-  , ( "dieciocho" , 18 )
-  , ( "diecinueve" , 19 )
-  , ( "veintiuno" , 21 )
-  , ( "veintiuna" , 21 )
-  , ( "veintidos" , 22 )
-  , ( "veintitrés" , 23 )
-  , ( "veintitres" , 23 )
-  , ( "veinticuatro" , 24 )
-  , ( "veinticinco" , 25 )
-  , ( "veintiséis" , 26 )
-  , ( "veintiseis" , 26 )
-  , ( "veintisiete" , 27 )
-  , ( "veintiocho" , 28 )
-  , ( "veintinueve" , 29 )
-  ]
+sixteenToTwentyNineMap =
+  HashMap.fromList
+    [ ("dieciseis", 16)
+    , ("diesiséis", 16)
+    , ("diesiseis", 16)
+    , ("dieciséis", 16)
+    , ("diecisiete", 17)
+    , ("dieciocho", 18)
+    , ("diecinueve", 19)
+    , ("veintiuno", 21)
+    , ("veintiuna", 21)
+    , ("veintidos", 22)
+    , ("veintidós", 22)
+    , ("veintitrés", 23)
+    , ("veintitres", 23)
+    , ("veinticuatro", 24)
+    , ("veinticinco", 25)
+    , ("veintiséis", 26)
+    , ("veintiseis", 26)
+    , ("veintisiete", 27)
+    , ("veintiocho", 28)
+    , ("veintinueve", 29)
+    ]
 
 ruleNumeral5 :: Rule
 ruleNumeral5 = Rule
   { name = "number (16..19 21..29)"
   , pattern =
-    [ 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)"
-    ]
+      [ regex
+          "(die(c|s)is(é|e)is|diecisiete|dieciocho|diecinueve|veintiun(o|a)|veintid(o|ó)s|veintitr(é|e)s|veinticuatro|veinticinco|veintis(é|e)is|veintisiete|veintiocho|veintinueve|treinta)"
+      ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
         HashMap.lookup (Text.toLower match) sixteenToTwentyNineMap >>= integer
       _ -> Nothing
   }
@@ -164,13 +141,9 @@
 ruleNumeral3 :: Rule
 ruleNumeral3 = Rule
   { name = "number (16..19)"
-  , pattern =
-    [ numberWith TNumeral.value (== 10)
-    , regex "y"
-    , numberBetween 6 10
-    ]
+  , pattern = [numberWith TNumeral.value (== 10), regex "y", numberBetween 6 10]
   , prod = \tokens -> case tokens of
-      (_:_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+      (_ : _ : Token Numeral NumeralData { TNumeral.value = v } : _) ->
         double $ 10 + v
       _ -> Nothing
   }
@@ -178,14 +151,10 @@
 ruleNumeralsSuffixesKMG :: Rule
 ruleNumeralsSuffixesKMG = Rule
   { name = "numbers suffixes (K, M, G)"
-  , pattern =
-    [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$€]|$)"
-    ]
+  , pattern = [dimension Numeral, regex "([kmg])(?=[\\W\\$€]|$)"]
   , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v}:
-       Token RegexMatch (GroupMatch (match:_)):
-       _) -> case Text.toLower match of
+      (Token Numeral NumeralData { TNumeral.value = v } : Token RegexMatch (GroupMatch (match : _)) : _) ->
+        case Text.toLower match of
           "k" -> double $ v * 1e3
           "m" -> double $ v * 1e6
           "g" -> double $ v * 1e9
@@ -194,30 +163,31 @@
   }
 
 oneHundredToThousandMap :: HashMap.HashMap Text.Text Integer
-oneHundredToThousandMap = HashMap.fromList
-  [ ( "cien" , 100 )
-  , ( "cientos" , 100 )
-  , ( "ciento" , 100 )
-  , ( "doscientos" , 200 )
-  , ( "trescientos" , 300 )
-  , ( "cuatrocientos" , 400 )
-  , ( "quinientos" , 500 )
-  , ( "seiscientos" , 600 )
-  , ( "setecientos" , 700 )
-  , ( "ochocientos" , 800 )
-  , ( "novecientos" , 900 )
-  , ( "mil" , 1000 )
-  ]
-
+oneHundredToThousandMap =
+  HashMap.fromList
+    [ ("cien", 100)
+    , ("cientos", 100)
+    , ("ciento", 100)
+    , ("doscientos", 200)
+    , ("trescientos", 300)
+    , ("cuatrocientos", 400)
+    , ("quinientos", 500)
+    , ("seiscientos", 600)
+    , ("setecientos", 700)
+    , ("ochocientos", 800)
+    , ("novecientos", 900)
+    , ("mil", 1000)
+    ]
 
 ruleNumeral6 :: Rule
 ruleNumeral6 = Rule
   { name = "number 100..1000 "
   , pattern =
-    [ regex "(cien(to)?s?|doscientos|trescientos|cuatrocientos|quinientos|seiscientos|setecientos|ochocientos|novecientos|mil)"
-    ]
+      [ regex
+          "(cien(to)?s?|doscientos|trescientos|cuatrocientos|quinientos|seiscientos|setecientos|ochocientos|novecientos|mil)"
+      ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
         HashMap.lookup (Text.toLower match) oneHundredToThousandMap >>= integer
       _ -> Nothing
   }
@@ -226,15 +196,10 @@
 ruleNumeral4 = Rule
   { name = "number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
   , pattern =
-    [ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
-    , regex "y"
-    , numberBetween 1 10
-    ]
+      [oneOf [70, 20, 60, 50, 40, 90, 30, 80], regex "y", numberBetween 1 10]
   , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v1}:
-       _:
-       Token Numeral NumeralData{TNumeral.value = v2}:
-       _) -> double $ v1 + v2
+      (Token Numeral NumeralData { TNumeral.value = v1 } : _ : Token Numeral NumeralData { TNumeral.value = v2 } : _) ->
+        double $ v1 + v2
       _ -> Nothing
   }
 
@@ -242,51 +207,47 @@
 ruleNumerals = Rule
   { name = "numbers 200..999"
   , pattern =
-    [ numberBetween 2 10
-    , numberWith TNumeral.value (== 100)
-    , numberBetween 0 100
-    ]
+      [ numberBetween 2 10
+      , numberWith TNumeral.value (== 100)
+      , numberBetween 0 100
+      ]
   , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v1}:
-       _:
-       Token Numeral NumeralData{TNumeral.value = v2}:
-       _) -> double $ 100 * v1 + v2
+      (Token Numeral NumeralData { TNumeral.value = v1 } : _ : Token Numeral NumeralData { TNumeral.value = v2 } : _) ->
+        double $ 100 * v1 + v2
       _ -> Nothing
   }
 
 ruleNumeralDotNumeral :: Rule
 ruleNumeralDotNumeral = Rule
   { name = "number dot number"
-  , pattern =
-    [ dimension Numeral
-    , regex "punto"
-    , Predicate $ not . hasGrain
-    ]
+  , pattern = [dimension Numeral, regex "punto", Predicate $ not . hasGrain]
   , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v1}:
-       _:
-       Token Numeral NumeralData{TNumeral.value = v2}:
-       _) -> double $ v1 + decimalsToDouble v2
+      (Token Numeral NumeralData { TNumeral.value = v1 } : _ : Token Numeral NumeralData { TNumeral.value = v2 } : _) ->
+        double $ v1 + decimalsToDouble v2
       _ -> Nothing
   }
 
-ruleIntegerWithThousandsSeparator :: Rule
-ruleIntegerWithThousandsSeparator = Rule
-  { name = "integer with thousands separator ."
+ruleBelowTenWithTwoDigits :: Rule
+ruleBelowTenWithTwoDigits = Rule
+  {
+    name = "integer (0-9) with two digits"
   , pattern =
-    [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
-        parseDouble (Text.replace "." Text.empty match) >>= double
+      [
+        regex "((c|z)ero)|0"
+      , numberBetween 1 10
+      ]
+  , prod = \case
+      (
+        _:
+        Token Numeral NumeralData { TNumeral.value = v }:
+        _
+        ) -> double v
       _ -> Nothing
   }
 
 rules :: [Rule]
 rules =
-  [ ruleDecimalNumeral
-  , ruleDecimalWithThousandsSeparator
-  , ruleIntegerWithThousandsSeparator
+  [ ruleBelowTenWithTwoDigits
   , ruleNumeral
   , ruleNumeral2
   , ruleNumeral3
diff --git a/Duckling/Numeral/ES/VE/Corpus.hs b/Duckling/Numeral/ES/VE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/VE/Corpus.hs
@@ -0,0 +1,32 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.VE.Corpus (allExamples) where
+
+import Data.String
+import Prelude
+
+import Duckling.Numeral.Types
+import Duckling.Testing.Types
+
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (NumeralValue 1) ["1"]
+    , examples (NumeralValue 33) ["33"]
+    , examples (NumeralValue 1.1) ["1,1", "1,10", "01,10"]
+    , examples (NumeralValue 0.77) ["0,77", ",77"]
+    , examples (NumeralValue 100000) ["100.000", "100000"]
+    , examples (NumeralValue 243) ["243"]
+    , examples (NumeralValue 3000000) ["3000000", "3.000.000"]
+    , examples (NumeralValue 1200000) ["1.200.000", "1200000"]
+    , examples
+        (NumeralValue (-1200000))
+        ["- 1.200.000", "menos 1.200.000", "-1,2M", "-,0012G"]
+    , examples (NumeralValue 1.5) ["1,5"]
+    ]
diff --git a/Duckling/Numeral/ES/VE/Rules.hs b/Duckling/Numeral/ES/VE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ES/VE/Rules.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.Numeral.ES.VE.Rules (rules) where
+
+import Data.Maybe
+import Data.String
+import qualified Data.Text as Text
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator ."
+  , pattern = [regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number ,"
+  , pattern = [regex "(\\d*,\\d+)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern = [regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleIntegerWithThousandsSeparator
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/FA/Corpus.hs b/Duckling/Numeral/FA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/FA/Corpus.hs
@@ -0,0 +1,102 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.FA.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 FA Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "۰"
+             , "صفر"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "۱"
+             , "یک"
+             ]
+  , examples (NumeralValue 11)
+             [ "یازده"
+             ]
+  , examples (NumeralValue 17)
+             [ "هفده"
+             ]
+  , examples (NumeralValue 21)
+             [ "بیست و یک"
+             ]
+  , examples (NumeralValue 23)
+             [ "بیست و سه"
+             ]
+  , examples (NumeralValue 70)
+             [ "هفتاد"
+             ]
+  , examples (NumeralValue 71)
+             [ "هفتاد و یک"
+             ]
+  , examples (NumeralValue 78)
+             [ "هفتاد و هشت"
+             ]
+  , examples (NumeralValue 73)
+             [ "هفتاد و سه"
+             ]
+  , examples (NumeralValue 80)
+             [ "هشتاد"
+             ]
+  , examples (NumeralValue 81)
+             [ "هشتاد و یک"
+             ]
+  , examples (NumeralValue 82)
+             [ "هشتاد و دو"
+             ]
+  , examples (NumeralValue 90)
+             [ "نود"
+             ]
+  , examples (NumeralValue 91)
+             [ "نود و یک"
+             ]
+  , examples (NumeralValue 92)
+             [ "نود و دو"
+             ]
+  , examples (NumeralValue 99)
+             [ "نود و نه"
+             ]
+  , examples (NumeralValue 33)
+             [ "33"
+             , "۳۳"
+             , "سی و سه"
+             ]
+  , examples (NumeralValue 118)
+             [ "صد و هجده"
+             ]
+  , examples (NumeralValue 4020)
+             [ "چهار هزار و بیست"
+             ]
+  , examples (NumeralValue 100000)
+             [ "صد هزار"
+             , "100000"
+             , "۱۰۰۰۰۰"
+             ]
+  , examples (NumeralValue 3000000)
+             [ "سه میلیون"
+             , "3000000"
+             ]
+  ]
diff --git a/Duckling/Numeral/FA/Rules.hs b/Duckling/Numeral/FA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/FA/Rules.hs
@@ -0,0 +1,254 @@
+-- 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.FA.Rules
+  ( rules ) where
+
+import Control.Monad (join)
+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
+
+zeroNineteenMap :: HashMap Text Integer
+zeroNineteenMap = HashMap.fromList
+  [ ("صفر", 0)
+  , ("یک", 1)
+  , ("دو", 2)
+  , ("سه", 3)
+  , ("چهار", 4)
+  , ("پنج", 5)
+  , ("شش", 6)
+  , ("شیش", 6)
+  , ("هفت", 7)
+  , ("هشت", 8)
+  , ("نه", 9)
+  , ("ده", 10)
+  , ("یازده", 11)
+  , ("دوازده", 12)
+  , ("سیزده", 13)
+  , ("چهارده", 14)
+  , ("پانزده", 15)
+  , ("پونزده", 15)
+  , ("شانزده", 16)
+  , ("شونزده", 16)
+  , ("هفده", 17)
+  , ("هیفده", 17)
+  , ("هجده", 18)
+  , ("هیجده", 18)
+  , ("نوزده", 19)
+  ]
+
+ruleToNineteen :: Rule
+ruleToNineteen = Rule
+  { name = "integer (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
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "بیست"  , 20 )
+  , ( "سی"  , 30 )
+  , ( "چهل"  , 40 )
+  , ( "پنجاه"   , 50 )
+  , ( "شصت"   , 60 )
+  , ( "هفتاد" , 70 )
+  , ( "هشتاد"  , 80 )
+  , ( "نود"  , 90 )
+  , ( "صد"  , 100 )
+  , ( "دویست"  , 200 )
+  , ( "سیصد"  , 300 )
+  , ( "سی صد"  , 300 )
+  , ( "چهارصد"  , 400 )
+  , ( "چهار صد"  , 400 )
+  , ( "پانصد"  , 500 )
+  , ( "پونصد"  , 500 )
+  , ( "شیشصد"  , 600 )
+  , ( "شیش صد"  , 600 )
+  , ( "ششصد"  , 600 )
+  , ( "شش صد"  , 600 )
+  , ( "هفتصد"  , 700 )
+  , ( "هفت صد"  , 700 )
+  , ( "هشتصد"  , 800 )
+  , ( "هشت صد"  , 800 )
+  , ( "نهصد"  , 900 )
+  , ( "نه صد"  , 900 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(دویست|(سی|چهار|پان|پون|شی?ش|هفت|هشت|نه)? ?صد|بیست|سی|چهل|پنجاه|شصت|هفتاد|هشتاد|نود)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> 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 2 >>= withMultipliable
+        "میلیون" -> double 1e6 >>= 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
+  }
+
+ruleCompositeHundred :: Rule
+ruleCompositeHundred = Rule
+  { name = "integer 21..99"
+  , pattern =
+    [ oneOf [100,200..900]
+    , regex "و"
+    , numberBetween 1 100
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = tens}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
+ruleSum :: Rule
+ruleSum = Rule
+  { name = "intersect 2 numbers"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleSumAnd :: Rule
+ruleSumAnd = Rule
+  { name = "intersect 2 numbers (with and)"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , regex "و"
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \tokens -> case tokens of
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+numeralToStringMap :: HashMap Char String
+numeralToStringMap =
+  HashMap.fromList
+    [ ('۰', "0")
+    , ('۱', "1")
+    , ('۲', "2")
+    , ('۳', "3")
+    , ('۴', "4")
+    , ('۵', "5")
+    , ('۶', "6")
+    , ('۷', "7")
+    , ('۸', "8")
+    , ('۹', "9")
+    ]
+
+parseIntAsText :: Text -> Text
+parseIntAsText =
+  Text.pack
+    . join
+    . mapMaybe (`HashMap.lookup` numeralToStringMap)
+    . Text.unpack
+
+parseIntegerFromText :: Text -> Maybe Integer
+parseIntegerFromText = parseInteger . parseIntAsText
+
+ruleIntegerNumeric :: Rule
+ruleIntegerNumeric = Rule
+  { name = "Persian integer numeric"
+  , pattern =
+    [ regex "([۰-۹]{1,18})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseIntegerFromText match >>= integer
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntegerNumeric
+  , ruleToNineteen
+  , ruleTens
+  , rulePowersOfTen
+  , ruleCompositeTens
+  , ruleCompositeHundred
+  , ruleSum
+  , ruleSumAnd
+  , ruleMultiply
+  ]
diff --git a/Duckling/Numeral/FI/Corpus.hs b/Duckling/Numeral/FI/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/FI/Corpus.hs
@@ -0,0 +1,122 @@
+-- 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.
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.FI.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Numeral.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale FI Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "nolla"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "yksi"
+             ]
+  , examples (NumeralValue 2)
+             [ "kaksi"
+             ]
+  , examples (NumeralValue 3)
+             [ "kolme"
+             ]
+  , examples (NumeralValue 4)
+             [ "neljä"
+             ]
+  , examples (NumeralValue 5)
+             [ "viisi"
+             ]
+  , examples (NumeralValue 6)
+             [ "kuusi"
+             ]
+  , examples (NumeralValue 7)
+             [ "seitsemän"
+             ]
+  , examples (NumeralValue 8)
+             [ "kahdeksan"
+             ]
+  , examples (NumeralValue 9)
+             [ "yhdeksän"
+             ]
+  , examples (NumeralValue 10)
+             [ "10"
+             , "kymmenen"
+             ]
+  , examples (NumeralValue 11)
+             [ "yksitoista"
+             ]
+  , examples (NumeralValue 12)
+             [ "kaksitoista"
+             ]
+  , examples (NumeralValue 13)
+             [ "kolmetoista"
+             ]
+  , examples (NumeralValue 14)
+             [ "neljätoista"
+             ]
+  , examples (NumeralValue 15)
+             [ "viisitoista"
+             ]
+  , examples (NumeralValue 16)
+             [ "kuusitoista"
+             ]
+  , examples (NumeralValue 17)
+             [ "seitsemäntoista"
+             ]
+  , examples (NumeralValue 18)
+             [ "kahdeksantoista"
+             ]
+  , examples (NumeralValue 19)
+             [ "yhdeksäntoista"
+             ]
+  , examples (NumeralValue 20)
+             [ "20"
+             , "kaksikymmentä"
+             ]
+  , examples (NumeralValue 24)
+             [ "24"
+             , "kaksikymmentäneljä"
+             ]
+  , examples (NumeralValue 35)
+             [ "kolmekymmentäviisi"
+             ]
+  , examples (NumeralValue 42)
+             [ "neljäkymmentäkaksi"
+             ]
+  , examples (NumeralValue 52)
+             [ "viisikymmentäkaksi"
+             ]
+  , examples (NumeralValue 62)
+             [ "kuusikymmentäkaksi"
+             ]
+  , examples (NumeralValue 72)
+             [ "seitsemänkymmentäkaksi"
+             ]
+  , examples (NumeralValue 82)
+             [ "kahdeksankymmentäkaksi"
+             ]
+  , examples (NumeralValue 99)
+             [ "99"
+             , "yhdeksänkymmentäyhdeksän"
+             ]
+  ]
diff --git a/Duckling/Numeral/FI/Rules.hs b/Duckling/Numeral/FI/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/FI/Rules.hs
@@ -0,0 +1,141 @@
+-- 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.
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.FI.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 = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        v <- parseInt match
+        integer $ toInteger v
+      _ -> Nothing
+  }
+
+numeralMap :: HashMap Text Integer
+numeralMap = HashMap.fromList
+  [ ( "nolla", 0 )
+  , ( "yksi", 1 )
+  , ( "kaksi", 2 )
+  , ( "kolme", 3 )
+  , ( "neljä", 4 )
+  , ( "viisi", 5 )
+  , ( "kuusi", 6 )
+  , ( "seitsemän", 7 )
+  , ( "kahdeksan", 8 )
+  , ( "yhdeksän", 9 )
+  , ( "kymmenen", 10 )
+  ]
+
+ruleNumeral :: Rule
+ruleNumeral = Rule
+  { name = "number (0..10)"
+  , pattern =
+    [ regex "(nolla|yksi|kaksi|kolme|neljä|viisi|kuusi|seitsemän|kahdeksan|yhdeksän|kymmenen)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) numeralMap >>= integer
+      _ -> Nothing
+  }
+
+elevenToNineteenMap :: HashMap Text Integer
+elevenToNineteenMap = HashMap.fromList
+  [ ( "yksitoista", 11 )
+  , ( "kaksitoista", 12 )
+  , ( "kolmetoista", 13 )
+  , ( "neljätoista", 14 )
+  , ( "viisitoista", 15 )
+  , ( "kuusitoista", 16 )
+  , ( "seitsemäntoista", 17 )
+  , ( "kahdeksantoista", 18 )
+  , ( "yhdeksäntoista", 19 )
+  ]
+
+ruleElevenToNineteen :: Rule
+ruleElevenToNineteen = Rule
+  { name = "number (11..19)"
+  , pattern =
+    [ regex "(yksitoista|kaksitoista|kolmetoista|neljätoista|viisitoista|kuusitoista|seitsemäntoista|kahdeksantoista|yhdeksäntoista)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) elevenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "kaksikymmentä", 20 )
+  , ( "kolmekymmentä", 30 )
+  , ( "neljäkymmentä", 40 )
+  , ( "viisikymmentä", 50 )
+  , ( "kuusikymmentä", 60 )
+  , ( "seitsemänkymmentä", 70 )
+  , ( "kahdeksankymmentä", 80 )
+  , ( "yhdeksänkymmentä", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20,30..90)"
+  , pattern =
+    [ regex "(kaksikymmentä|kolmekymmentä|neljäkymmentä|viisikymmentä|kuusikymmentä|seitsemänkymmentä|kahdeksankymmentä|yhdeksänkymmentä)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([2-9][1-9])"
+  , pattern =
+    [ regex "(kaksikymmentä|kolmekymmentä|neljäkymmentä|viisikymmentä|kuusikymmentä|seitsemänkymmentä|kahdeksankymmentä|yhdeksänkymmentä)(yksi|kaksi|kolme|neljä|viisi|kuusi|seitsemän|kahdeksan|yhdeksän)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) tensMap
+        v2 <- HashMap.lookup (Text.toLower m2) numeralMap
+        integer $ v1 + v2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntegerNumeric
+  , ruleNumeral
+  , ruleElevenToNineteen
+  , ruleTens
+  , ruleCompositeTens
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -125,5 +124,12 @@
              , "-1,2M"
              , "-1200K"
              , "-,0012G"
+             ]
+  , examples (NumeralValue 6.7)
+             [ "6,7"
+             ]
+  , examples (NumeralValue 6700.54)
+             [ "6.700,54"
+             , "6 700,54"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -57,10 +56,12 @@
   { name = "numbers 22..29 32..39 .. 52..59"
   , pattern =
     [ oneOf [20, 50, 40, 30]
+    , regex "[\\s\\-]+"
     , numberBetween 2 10
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
        Token Numeral NumeralData{TNumeral.value = v2}:
        _) -> double $ v1 + v2
       _ -> Nothing
@@ -117,10 +118,12 @@
   { name = "numbers 62..69 .. 92..99"
   , pattern =
     [ oneOf [60, 80]
+    , regex "[\\s\\-]+"
     , numberBetween 2 20
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
        Token Numeral NumeralData{TNumeral.value = v2}:
        _) -> double $ v1 + v2
       _ -> Nothing
@@ -166,10 +169,12 @@
   { name = "number (17..19)"
   , pattern =
     [ numberWith TNumeral.value (== 10)
+    , regex "[\\s\\-]+"
     , numberBetween 7 10
     ]
   , prod = \tokens -> case tokens of
       (_:
+       _:
        Token Numeral NumeralData{TNumeral.value = v}:
        _) -> double $ 10 + v
       _ -> Nothing
@@ -224,7 +229,7 @@
   { name = "numbers 21 31 41 51"
   , pattern =
     [ oneOf [20, 50, 40, 30]
-    , regex "et"
+    , regex "-?et-?"
     , numberWith TNumeral.value (== 1)
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/GA/Corpus.hs b/Duckling/Numeral/GA/Corpus.hs
--- a/Duckling/Numeral/GA/Corpus.hs
+++ b/Duckling/Numeral/GA/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -69,6 +68,10 @@
              [ "1.1"
              , "1.10"
              , "01.10"
+             ]
+  , examples (NumeralValue 0.5)
+             [ "חצי"
+             , "0.5"
              ]
   , examples (NumeralValue 0.77)
              [ "0.77"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -344,6 +343,15 @@
       _ -> Nothing
   }
 
+ruleHalf :: Rule
+ruleHalf = Rule
+  { name = "half"
+  , pattern =
+    [ regex "חצי"
+    ]
+  , prod = \_ -> double 0.5
+  }
+
 rules :: [Rule]
 rules =
   [ ruleCommas
@@ -373,4 +381,5 @@
   , ruleNumeralsPrefixWithNegativeOrMinus
   , rulePowersOfTen
   , ruleSingle
+  , ruleHalf
   ]
diff --git a/Duckling/Numeral/HI/Corpus.hs b/Duckling/Numeral/HI/Corpus.hs
--- a/Duckling/Numeral/HI/Corpus.hs
+++ b/Duckling/Numeral/HI/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -83,5 +82,22 @@
   , examples (NumeralValue 50)
              [ "५०"
              , "पचास"
+             ]
+  , examples (NumeralValue 300)
+             [ "तीन सौ"
+             ]
+  , examples (NumeralValue 81)
+             [ "इक्यासी"
+             ]
+  , examples (NumeralValue 150)
+             [ "एक सौ पचास"
+             ]
+  , examples (NumeralValue 1000)
+             [ "हज़ार"
+             , "एक हज़ार"
+             , "हज़ार" -- हज़ार using a different character scheme
+             ]
+  , examples (NumeralValue 1520)
+             [ "एक हज़ार पाँच सौ बीस"
              ]
   ]
diff --git a/Duckling/Numeral/HI/Rules.hs b/Duckling/Numeral/HI/Rules.hs
--- a/Duckling/Numeral/HI/Rules.hs
+++ b/Duckling/Numeral/HI/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -16,7 +15,6 @@
 
 import Data.HashMap.Strict (HashMap)
 import Data.Maybe
-import Data.String
 import Data.Text (Text)
 import Prelude
 import qualified Data.HashMap.Strict as HashMap
@@ -58,36 +56,20 @@
       _ -> Nothing
   }
 
-ruleNumeralMap :: HashMap Text Integer
-ruleNumeralMap = HashMap.fromList
+ruleZeroToNinetyNineMap :: HashMap Text Integer
+ruleZeroToNinetyNineMap = HashMap.fromList
   [ ( "शून्य", 0 )
   , ( "एक", 1 )
-  , ( "दो" , 2 )
+  , ( "दो", 2 )
   , ( "तीन", 3 )
   , ( "चार", 4 )
   , ( "पाँच", 5 )
+  , ( "छः", 6 )
   , ( "छह", 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 match ruleNumeralMap >>= integer
-      _ -> Nothing
-  }
-
-elevenToNineteenMap :: HashMap Text Integer
-elevenToNineteenMap = HashMap.fromList
-  [ ( "ग्यारह", 11 )
+  , ( "नौ", 9 )
+  , ( "ग्यारह", 11 )
   , ( "बारह", 12 )
   , ( "तेरह", 13 )
   , ( "चौदह", 14 )
@@ -96,23 +78,7 @@
   , ( "सत्रह", 17 )
   , ( "अठारह", 18 )
   , ( "उन्नीस", 19 )
-  ]
-
-ruleElevenToNineteen :: Rule
-ruleElevenToNineteen = Rule
-  { name = "number (11..19)"
-  , pattern =
-    [ regex "(ग्यारह|बारह|तेरह|चौदह|पन्द्रह|सोलह|सत्रह|अठारह|उन्नीस)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
-        HashMap.lookup match elevenToNineteenMap >>= integer
-      _ -> Nothing
-  }
-
-twentyoneToTwentynineMap :: HashMap Text Integer
-twentyoneToTwentynineMap = HashMap.fromList
-  [ ( "इक्कीस", 21 )
+  , ( "इक्कीस", 21 )
   , ( "बाईस", 22 )
   , ( "तेईस", 23 )
   , ( "चौबीस", 24 )
@@ -121,23 +87,88 @@
   , ( "सत्ताईस", 27 )
   , ( "अट्ठाईस", 28 )
   , ( "उनतीस", 29 )
+  , ( "इकतीस", 31 )
+  , ( "इकत्तीस", 31 )
+  , ( "बत्तीस", 32 )
+  , ( "तैंतीस", 33 )
+  , ( "चौंतीस", 34 )
+  , ( "पैंतीस", 35 )
+  , ( "छत्तीस", 36 )
+  , ( "सैंतीस", 37 )
+  , ( "अड़तीस", 38 )
+  , ( "उनतालीस", 39 )
+  , ( "इकतालीस", 41 )
+  , ( "बयालीस", 42 )
+  , ( "तैंतालीस", 43 )
+  , ( "चौवालीस", 44 )
+  , ( "पैंतालीस", 45 )
+  , ( "छियालीस", 46 )
+  , ( "सैंतालीस", 47 )
+  , ( "अड़तालीस", 48 )
+  , ( "उनचास", 49 )
+  , ( "इक्यावन", 51 )
+  , ( "बावन", 52 )
+  , ( "तिरेपन", 53 )
+  , ( "चौवन", 54 )
+  , ( "पचपन", 55 )
+  , ( "छप्पन", 56 )
+  , ( "सत्तावन", 57 )
+  , ( "अट्ठावन", 58 )
+  , ( "उनसठ", 59 )
+  , ( "इकसठ", 61 )
+  , ( "बासठ", 62 )
+  , ( "तिरेसठ", 63 )
+  , ( "चौंसठ", 64 )
+  , ( "पैंसठ", 65 )
+  , ( "छियासठ", 66 )
+  , ( "सड़सठ", 67 )
+  , ( "अड़सठ", 68 )
+  , ( "उनहत्तर", 69 )
+  , ( "इकहत्तर", 71 )
+  , ( "बहत्तर", 72 )
+  , ( "तिहत्तर", 73 )
+  , ( "चौहत्तर", 74 )
+  , ( "पचहत्तर", 75 )
+  , ( "छिहत्तर", 76 )
+  , ( "सतहत्तर", 77 )
+  , ( "अठहत्तर", 78 )
+  , ( "उनासी", 79 )
+  , ( "इक्यासी", 81 )
+  , ( "बयासी", 82 )
+  , ( "तिरासी", 83 )
+  , ( "चौरासी", 84 )
+  , ( "पचासी", 85 )
+  , ( "छियासी", 86 )
+  , ( "सतासी", 87 )
+  , ( "अट्ठासी", 88 )
+  , ( "नवासी", 89 )
+  , ( "इक्यानवे", 91 )
+  , ( "बानवे", 92 )
+  , ( "तिरानवे", 93 )
+  , ( "चौरानवे", 94 )
+  , ( "पचानवे", 95 )
+  , ( "छियानवे", 96 )
+  , ( "सत्तानवे", 97 )
+  , ( "अट्ठानवे", 98 )
+  , ( "निन्यानवे", 99 )
   ]
 
-ruleTwentyoneToTwentynine :: Rule
-ruleTwentyoneToTwentynine = Rule
-  { name = "number (21..29)"
+ruleZeroToNinetyNine :: Rule
+ruleZeroToNinetyNine = Rule
+  { name = "number (0..99)"
   , pattern =
-    [ regex "(इक्कीस|बाईस|तेईस|चौबीस|पच्चीस|छब्बीस|सत्ताईस|अट्ठाईस|उनतीस)"
+    [ regex "(शून्य|एक|दो|तीन|चार|पाँच|छे|छह|सात|आठ|नौ|ग्यारह|बारह|तेरह|चौदह|पन्द्रह|सोलह|सत्रह|अठारह|उन्नीस|इक्कीस|बाईस|तेईस|चौबीस|पच्चीस|छब्बीस|सत्ताईस|अट्ठाईस|उनतीस|इकतीस|बत्तीस|तैंतीस|चौंतीस|पैंतीस|छत्तीस|सैंतीस|अड़तीस|उनतालीस|इकतालीस|बयालीस|तैंतालीस|चौवालीस|पैंतालीस|छियालीस|सैंतालीस|अड़तालीस|उनचास|इक्यावन|बावन|तिरेपन|चौवन|पचपन|छप्पन|सत्तावन|अट्ठावन|उनसठ|इकसठ|बासठ|तिरेसठ|चौंसठ|पैंसठ|छियासठ|सड़सठ|अड़सठ|उनहत्तर|इकहत्तर|बहत्तर|तिहत्तर|चौहत्तर|पचहत्तर|छिहत्तर|सतहत्तर|अठहत्तर|उनासी|इक्यासी|बयासी|तिरासी|चौरासी|पचासी|छियासी|सतासी|अट्ठासी|नवासी|इक्यानवे|बानवे|तिरानवे|चौरानवे|पचानवे|छियानवे|सत्तानवे|अट्ठानवे|निन्यानवे)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
-        HashMap.lookup match twentyoneToTwentynineMap >>= integer
+        HashMap.lookup match ruleZeroToNinetyNineMap >>= integer
       _ -> Nothing
   }
 
 tensMap :: HashMap Text Integer
 tensMap = HashMap.fromList
-  [ ( "बीस", 20 )
+  [ ("दस", 10)
+  , ( "बीस", 20 )
   , ( "तीस", 30 )
   , ( "चालीस", 40 )
   , ( "पचास", 50 )
@@ -151,7 +182,7 @@
 ruleTens = Rule
   { name = "integer (20,30..90)"
   , pattern =
-    [ regex "(बीस|तीस|चालीस|पचास|साठ|सत्तर|अस्सी|नब्बे)"
+    [ regex "(दस|बीस|तीस|चालीस|पचास|साठ|सत्तर|अस्सी|नब्बे)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -159,12 +190,72 @@
       _ -> 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 1e2 >>= withGrain 2 >>= withMultipliable
+          "हज़ार" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+          "हज़ार" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+          _ -> Nothing
+      _ -> Nothing
+  }
 
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ Predicate isPositive
+    , Predicate isMultipliable
+    ]
+  , prod = \tokens -> case tokens of
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+ruleCompositeHundreds :: Rule
+ruleCompositeHundreds = Rule
+  { name = "integer 100s.."
+  , pattern =
+    [ oneOf [100,200..5000]
+    , regex "[\\s\\-]+"
+    , numberBetween 1 99
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = hundreds}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = remaining}:
+       _) -> double $ hundreds + remaining
+      _ -> Nothing
+  }
+
+
+ruleCompositeThousands :: Rule
+ruleCompositeThousands = Rule
+  { name = "integer 100s.."
+  , pattern =
+    [ oneOf [1000,2000..50000]
+    , regex "[\\s\\-]+"
+    , numberBetween 1 999
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = thousands}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = remaining}:
+       _) -> double $ thousands + remaining
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleDevanagari
-  , ruleNumeral
-  , ruleElevenToNineteen
-  , ruleTwentyoneToTwentynine
+  , ruleZeroToNinetyNine
   , ruleTens
+  , rulePowersOfTen
+  , ruleMultiply
+  , ruleCompositeHundreds
+  , ruleCompositeThousands
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Numeral/HU/Corpus.hs b/Duckling/Numeral/HU/Corpus.hs
--- a/Duckling/Numeral/HU/Corpus.hs
+++ b/Duckling/Numeral/HU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Numeral/HU/Rules.hs b/Duckling/Numeral/HU/Rules.hs
--- a/Duckling/Numeral/HU/Rules.hs
+++ b/Duckling/Numeral/HU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/Helpers.hs b/Duckling/Numeral/Helpers.hs
--- a/Duckling/Numeral/Helpers.hs
+++ b/Duckling/Numeral/Helpers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/IS/Corpus.hs b/Duckling/Numeral/IS/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/IS/Corpus.hs
@@ -0,0 +1,79 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.IS.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Numeral.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext{locale = makeLocale IS Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "núll"
+             , "null"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "einn"
+             ]
+  , examples (NumeralValue 2)
+             [ "tveir"
+             ]
+  , examples (NumeralValue 3)
+             [ "þrír"
+             ]
+  , examples (NumeralValue 4)
+             [ "fjórir"
+             ]
+  , examples (NumeralValue 5)
+             [ "fimm"
+             ]
+  , examples (NumeralValue 6)
+             [ "sex"
+             ]
+  , examples (NumeralValue 7)
+             [ "sjö"
+             ]
+  , examples (NumeralValue 8)
+             [ "átta"
+             ]
+  , examples (NumeralValue 9)
+             [ "níu"
+             ]
+  , examples (NumeralValue 10)
+             [ "tíu"
+             ]
+  , examples (NumeralValue 11)
+             [ "ellefu"
+             ]
+  , examples (NumeralValue 15)
+             [ "fimmtán"
+             ]
+  , examples (NumeralValue 17)
+             [ "sautján"
+             ]
+  , examples (NumeralValue 20)
+             [ "20"
+             , "tuttugu"
+             ]
+  ]
diff --git a/Duckling/Numeral/IS/Rules.hs b/Duckling/Numeral/IS/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/IS/Rules.hs
@@ -0,0 +1,73 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.IS.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
+
+zeroToTwentyMap:: HashMap Text Integer
+zeroToTwentyMap = HashMap.fromList
+  [ ( "núll", 0 )
+  , ( "null", 0 )
+  , ( "einn", 1 )
+  , ( "tveir", 2 )
+  , ( "þrír", 3 )
+  , ( "fjórir", 4 )
+  , ( "fimm", 5 )
+  , ( "sex", 6 )
+  , ( "sjö", 7 )
+  , ( "átta", 8 )
+  , ( "níu", 9 )
+  , ( "tíu", 10 )
+  , ( "ellefu", 11 )
+  , ( "tólf", 12 )
+  , ( "þrettán", 13 )
+  , ( "fjórtán", 14 )
+  , ( "fimmtán", 15 )
+  , ( "sextán", 16 )
+  , ( "sautján", 17 )
+  , ( "átján", 18 )
+  , ( "nítján", 19 )
+  , ( "tuttugu", 20 )
+  ]
+
+ruleZeroToTwenty :: Rule
+ruleZeroToTwenty = Rule
+  { name = "number (0..20)"
+  , pattern =
+    [ regex "(n[úu]ll|einn|tveir|þrír|fjórir|fimm(tán)?|sex(tán)?|sjö|átta|níu|tíu|ellefu|tólf|þrettán|fjórtán|sautján|átján|nítján|tuttugu)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroToTwentyMap >>= integer
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleZeroToTwenty
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -129,12 +128,14 @@
              , "100000"
              , "100K"
              , "100k"
+             , "100 000"
              ]
   , examples (NumeralValue 3000000)
              [ "3M"
              , "3000K"
              , "3000000"
              , "3.000.000"
+             , "3 000 000"
              ]
   , examples (NumeralValue 1200000)
              [ "1.200.000"
@@ -151,5 +152,12 @@
              , "-1,2M"
              , "-1200K"
              , "-,0012G"
+             ]
+  , examples (NumeralValue 6.7)
+             [ "6,7"
+             ]
+  , examples (NumeralValue 6700.54)
+             [ "6.700,54"
+             , "6 700,54"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -43,11 +42,11 @@
 ruleDecimalWithThousandsSeparator = Rule
   { name = "decimal with thousands separator"
   , pattern =
-    [ regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"
+    [ regex "(\\d+(([\\. ])\\d\\d\\d)+,\\d+)"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):
-       _) -> let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+      (Token RegexMatch (GroupMatch (match:_:sep:_)):
+       _) -> let fmt = Text.replace "," "." $ Text.replace sep Text.empty match
         in parseDouble fmt >>= double
       _ -> Nothing
   }
@@ -304,11 +303,12 @@
 ruleIntegerWithThousandsSeparator = Rule
   { name = "integer with thousands separator ."
   , pattern =
-    [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
+    [ regex "(\\d{1,3}(([\\. ])\\d\\d\\d){1,5})"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
-        parseDouble (Text.replace "." Text.empty match) >>= double
+      (Token RegexMatch (GroupMatch (match:_:sep:_)):
+       _) -> let fmt = Text.replace sep Text.empty match
+        in parseDouble fmt >>= double
       _ -> Nothing
   }
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/KA/Corpus.hs b/Duckling/Numeral/KA/Corpus.hs
--- a/Duckling/Numeral/KA/Corpus.hs
+++ b/Duckling/Numeral/KA/Corpus.hs
@@ -2,14 +2,15 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
 
+-- /Note/: All commented-out tests are failing due to https://github.com/facebook/duckling/issues/541
 module Duckling.Numeral.KA.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
 import Data.String
 import Prelude
@@ -19,14 +20,19 @@
 import Duckling.Resolve
 import Duckling.Testing.Types
 
+context :: Context
+context = testContext {locale = makeLocale KA Nothing}
+
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KA Nothing}, testOptions, allExamples)
+corpus = (context, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
   [ examples (NumeralValue 0)
              [ "0"
+             , "ნოლი"
              , "ნული"
+             , "ნოლ"
              ]
   , examples (NumeralValue 1)
              [ "1"
@@ -35,9 +41,380 @@
   , examples (NumeralValue 2)
              [ "2"
              , "ორი"
+             , "წყვილი"
+             , "წყვილები"
              ]
   , examples (NumeralValue 3)
              [ "3"
              , "სამი"
+             , "ცოტა"
+             , "რამდენიმე"
+             , "რამოდენიმე"
              ]
+  , examples (NumeralValue 4)
+             [ "4"
+             , "ოთხი"
+             ]
+  , examples (NumeralValue 5)
+             [ "5"
+             , "ხუთი"
+             ]
+  , examples (NumeralValue 6)
+             [ "6"
+             , "ექვსი"
+             ]
+  , examples (NumeralValue 7)
+             [ "7"
+             , "შვიდი"
+             ]
+  , examples (NumeralValue 8)
+             [ "8"
+             , "რვა"
+             ]
+  , examples (NumeralValue 9)
+             [ "9"
+             , "ცხრა"
+             ]
+  , examples (NumeralValue 10)
+             [ "10"
+             , "ათი"
+             ]
+  , examples (NumeralValue 11)
+             [ "11"
+             , "თერთმეტი"
+             ]
+  , examples (NumeralValue 12)
+             [ "12"
+             , "თორმეტი"
+             ]
+  , examples (NumeralValue 13)
+             [ "13"
+             , "ცამეტი"
+             ]
+  , examples (NumeralValue 14)
+             [ "14"
+             , "თოთხმეტი"
+             ]
+  , examples (NumeralValue 15)
+             [ "15"
+             , "თხუთმეტი"
+             ]
+  , examples (NumeralValue 16)
+             [ "16"
+             , "თექვსმეტი"
+             ]
+  , examples (NumeralValue 17)
+             [ "17"
+             , "ჩვიდმეტი"
+             ]
+  , examples (NumeralValue 18)
+             [ "18"
+             , "თვრამეტი"
+             ]
+  , examples (NumeralValue 19)
+             [ "19"
+             , "ცხრამეტი"
+             ]
+  , examples (NumeralValue 20)
+             [ "20"
+             , "ოცი"
+             ]
+  , examples (NumeralValue 21)
+             [ "21"
+             -- , "ოცდაერთი"
+             ]
+  , examples (NumeralValue 22)
+             [ "22"
+             -- , "ოცდაორი"
+             ]
+  , examples (NumeralValue 23)
+             [ "23"
+             -- , "ოცდასამი"
+             ]
+  , examples (NumeralValue 24)
+             [ "24"
+             -- , "ოცდაოთხი"
+             ]
+  , examples (NumeralValue 25)
+             [ "25"
+             -- , "ოცდახუთი"
+             ]
+  , examples (NumeralValue 26)
+             [ "26"
+             -- , "ოცდაექვსი"
+             ]
+  , examples (NumeralValue 27)
+             [ "27"
+             -- , "ოცდაშვიდი"
+             ]
+  , examples (NumeralValue 30)
+             [ "30"
+             , "ოცდაათი"
+             ]
+  , examples (NumeralValue 31)
+             [ "31"
+             -- , "ოცდათერთმეტი"
+             ]
+  , examples (NumeralValue 38)
+             [ "38"
+             -- , "ოცდათვრამეტი"
+             ]
+  , examples (NumeralValue 39)
+             [ "39"
+             -- , "ოცდაცხრამეტი"
+             ]
+  , examples (NumeralValue 40)
+             [ "40"
+             , "ორმოცი"
+             ]
+  , examples (NumeralValue 42)
+             [ "42"
+             -- , "ორმოცდაორი"
+             ]
+  , examples (NumeralValue 47)
+             [ "47"
+             -- , "ორმოცდაშვიდი"
+             ]
+  , examples (NumeralValue 99)
+             [ "99"
+             --, "ოთხმოცდაცხრამეტი"
+             ]
+  , examples (NumeralValue 100)
+             [ "100"
+             , "ასი"
+             ]
+  , examples (NumeralValue 101)
+             [ "101"
+             , "ას ერთი"
+             ]
+  , examples (NumeralValue 102)
+             [ "102"
+             , "ას ორი"
+             ]
+  , examples (NumeralValue 121)
+             [ "121"
+             --, "ას ოცდაერთი"
+             ]
+  , examples (NumeralValue 200)
+             [ "200"
+             , "ორასი"
+             ]
+  , examples (NumeralValue 201)
+             [ "201"
+             , "ორას ერთი"
+             ]
+  , examples (NumeralValue 250)
+             [ "250"
+             , "ორას ორმოცდაათი"
+             ]
+  , examples (NumeralValue 300)
+             [ "300"
+             , "სამასი"
+             ]
+  , examples (NumeralValue 310)
+             [ "310"
+             , "სამას ათი"
+             ]
+  , examples (NumeralValue 415)
+             [ "415"
+             , "ოთხას თხუთმეტი"
+             ]
+  , examples (NumeralValue 600)
+             [ "600"
+             , "ექვსასი"
+             ]
+  , examples (NumeralValue 909)
+             [ "909"
+             , "ცხრაას ცხრა"
+             ]
+  , examples (NumeralValue 999)
+             [ "999"
+             --, "ცხრაას ოთხმოცდაცხრამეტი"
+             ]
+  , examples (NumeralValue 1000)
+             [ "1000"
+             , "ათასი"
+             ]
+  , examples (NumeralValue 1001)
+             [ "1001"
+             , "ათას ერთი"
+             ]
+  , examples (NumeralValue 2000)
+             [ "2000"
+             , "ორი ათასი"
+             ]
+  , examples (NumeralValue 2010)
+             [ "2010"
+             , "ორი ათას ათი"
+             ]
+  , examples (NumeralValue 7892)
+             [ "7892"
+             --, "შვიდი ათას რვაას ოთხმოცდათორმეტი"
+             ]
+  , examples (NumeralValue 10000)
+             [ "10000"
+             , "ათი ათასი"
+             ]
+  , examples (NumeralValue 121000)
+             [ "121000"
+             --, "ას ოცდაერთი ათასი"
+             ]
+  , examples (NumeralValue 120000)
+             [ "120000"
+             , "ას ოცი ათასი"
+             ]
+  , examples (NumeralValue 124000)
+             [ "124000"
+             --, "ას ოცდაოთხი ათასი"
+             ]
+  , examples (NumeralValue 999000)
+             [ "999000"
+             --, "ცხრაას ოთხმოცდაცხრამეტი ათასი"
+             ]
+  , examples (NumeralValue 999900)
+             [ "999900"
+             --, "ცხრაას ოთხმოცდაცხრამეტი ათას ცხრაასი"
+             ]
+  , examples (NumeralValue 999990)
+             [ "999990"
+             --, "ცხრაას ოთხმოცდაცხრამეტი ათას ცხრაას ოთხმოცდაათი"
+             ]
+  , examples (NumeralValue 999999)
+             [ "999999"
+             -- , "ცხრაას ოთხმოცდაცხრამეტი ათას ცხრაას ოთხმოცდაცხრამეტი"
+             ]
+  , examples (NumeralValue 1000000)
+             [ "1000000"
+             , "ერთი მილიონი"
+             ]
+  , examples (NumeralValue 2000000)
+             [ "2000000"
+             , "ორი მილიონი"
+             ]
+  , examples (NumeralValue 999000999)
+             [ "999000999"
+             -- , "ცხრაას ოთხმოცდაცხრამეტი მილიონ ცხრაას ოთხმოცდაცხრამეტი"
+             ]
+  , examples (NumeralValue 999999999)
+             [ "999999999"
+             -- ,  "ცხრაას ოთხმოცდაცხრამეტი მილიონ ცხრაას ოთხმოცდაცხრამეტი ათას ცხრაას ოთხმოცდაცხრამეტი"
+             ]
+  , examples (NumeralValue 1174315110)
+             [ "1174315110"
+             -- , "ერთი მილიარდ ას სამოცდათოთხმეტი მილიონ სამას თხუთმეტი ათას ას ათი"
+             ]
+  , examples (NumeralValue 1174315119)
+             [ "1174315119"
+             -- , "ერთი მილიარდ ას სამოცდათოთხმეტი მილიონ სამას თხუთმეტი ათას ას ცხრამეტი"
+             ]
+  , examples (NumeralValue 15174315110)
+             [ "15174315110"
+             -- , "თხუთმეტი მილიარდ ას სამოცდათოთხმეტი მილიონ სამას თხუთმეტი ათას ას ათი"
+             ]
+  , examples (NumeralValue 35174315119)
+             [ "35174315119"
+             -- , "ოცდათხუთმეტი მილიარდ ას სამოცდათოთხმეტი მილიონ სამას თხუთმეტი ათას ას ცხრამეტი"
+             ]
+  , examples (NumeralValue 935174315119)
+             [ "935174315119"
+             -- , "ცხრაას ოცდათხუთმეტი მილიარდ ას სამოცდათოთხმეტი მილიონ სამას თხუთმეტი ათას ას ცხრამეტი"
+             ]
+  , examples (NumeralValue 33)
+             [ "33"
+             -- , "ოცდაცამეტი"
+             , "0033"
+             ]
+  , examples (NumeralValue 24)
+             [ "24"
+             -- , "ოცდაოთხი"
+             ]
+  , examples (NumeralValue 1.1)
+             [ "1.1"
+             , "1.10"
+             , "01.10"
+             , "1 მთელი 1"
+             , "ერთი მთელი ერთი"
+             ]
+  , examples (NumeralValue 0.77)
+             [ ".77"
+             , "0.77"
+             -- , "ნოლი მთელი სამოცდაჩვიდმეტი"
+             -- , "ნული მთელი სამოცდაჩვიდმეტი"
+             ]
+  , examples (NumeralValue 100000)
+             [ "100,000"
+             , "100,000.0"
+             , "100000"
+             , "100k"
+             -- , "ასი ათასი"
+             ]
+  , examples (NumeralValue 0.2)
+             [ "1/5"
+             , "2/10"
+             , "3/15"
+             , "20/100"
+             ]
+  , examples (NumeralValue 3e6)
+             [ "3M"
+             , "3000K"
+             , "3000000"
+             , "3,000,000"
+             , "3 მილიონი"
+             -- , "სამი მილიონი"
+             ]
+  , examples (NumeralValue 1.2e6)
+             [ "1,200,000"
+             , "1200000"
+             , "1.2M"
+             , "1200k"
+             , ".0012G"
+             ]
+  , examples (NumeralValue 5000)
+             [ "5 ათასი"
+             -- , "ხუთი ათასი"
+             ]
+  , examples (NumeralValue (-504))
+             [ "-504"
+             -- , "მინუს ხუთას ოთხი"
+             -- , "მინუს 504"
+             ]
+  , examples (NumeralValue (-1.2e6))
+             [ "- 1,200,000"
+             , "-1200000"
+             -- , "მინუს 1,200,000"
+             -- , "მინუს 1200000"
+             , "-1.2M"
+             , "-1200K"
+             , "-.0012G"
+             ]
+{-
+  , examples (NumeralValue 122)
+             [ "ას ოცდაორი"
+             , "ასოცდაორი"
+             ]
+  , examples (NumeralValue 2e5)
+             [ "ორასი ათასი"
+             ]
+  , examples (NumeralValue 21011)
+             [ "ოცდაერთიათას თერთმეტი"
+             ]
+  , examples (NumeralValue 721012)
+             [ "შვიდას ოცდაერთი ათას თორმეტი"
+             ]
+  , examples (NumeralValue 31256721)
+             [ "ოცდათერთმეტი მილიონ ორას ორმოცდათექვსმეტი ათას შვიდას ოცდაერთი"
+             ]
+  , examples (NumeralValue 2400)
+             [ "ორიათას ოთხასი"
+             , "ორიათასოთხასი"
+             ]
+  , examples (NumeralValue 2200000)
+             [ "ორი მთელი ორი მილიონი"
+             , "ორი მილიონ ორასი ათას"
+             ]
+  , examples (NumeralValue 3000000000)
+             [ "სამი მილიარდი"
+             , "3 მილიარდი"
+             ]
+-}
   ]
diff --git a/Duckling/Numeral/KA/Rules.hs b/Duckling/Numeral/KA/Rules.hs
--- a/Duckling/Numeral/KA/Rules.hs
+++ b/Duckling/Numeral/KA/Rules.hs
@@ -2,17 +2,19 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Numeral.KA.Rules
   ( rules
   ) where
 
+import Control.Applicative ((<|>))
 import Data.HashMap.Strict (HashMap)
 import Data.Maybe
 import Data.String
@@ -28,34 +30,376 @@
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 
-ruleNumeralMap :: HashMap Text Integer
-ruleNumeralMap = HashMap.fromList
-  [ ( "ნული", 0 )
-  , ( "ერთი", 1 )
-  , ( "ორი", 2 )
-  , ( "სამი", 3 )
-  , ( "ოთხი", 4 )
-  , ( "ხუთი", 5)
-  , ( "ექვსი", 6)
-  , ( "შვიდი", 7)
-  , ( "რვა", 8)
-  , ( "ცხრა", 9)
-  , ( "ათი", 10)
+zeroNineteenMap :: HashMap Text Integer
+zeroNineteenMap = HashMap.fromList
+  [ ( "ნოლ"       , 0  )
+  , ( "ნულ"       , 0  )
+  , ( "ნული"      , 0  )
+  , ( "ნოლ"       , 0  )
+  , ( "ნოლი"      , 0  )
+  , ( "ერთი"      , 1  )
+  , ( "ორი"       , 2  )
+  , ( "ორ"        , 2  )
+  , ( "სამი"      , 3  )
+  , ( "სამ"       , 3  )
+  , ( "ოთხი"      , 4  )
+  , ( "ოთხ"       , 4  )
+  , ( "ხუთი"      , 5  )
+  , ( "ხუთ"       , 5  )
+  , ( "ექვსი"     , 6  )
+  , ( "ექვს"      , 6  )
+  , ( "შვიდი"     , 7  )
+  , ( "შვიდ"      , 7  )
+  , ( "რვა"       , 8  )
+  , ( "რვ"        , 8  )
+  , ( "ცხრა"      , 9  )
+  , ( "ცხრ"       , 9  )
+  , ( "ათი"       , 10 )
+  , ( "აათი"      , 10 )
+  , ( "თერთმეტი"  , 11 )
+  , ( "თერთმეტ"   , 11 )
+  , ( "თორმეტი"   , 12 )
+  , ( "თორმეტ"    , 12 )
+  , ( "ცამეტი"    , 13 )
+  , ( "ცამეტ"     , 13 )
+  , ( "თოთხმეტი"  , 14 )
+  , ( "თოთხმეტ"   , 14 )
+  , ( "თხუთმეტი"  , 15 )
+  , ( "თხუთმეტ"   , 15 )
+  , ( "თექვსმეტი" , 16 )
+  , ( "თექვსმეტ"  , 16 )
+  , ( "ჩვიდმეტი"  , 17 )
+  , ( "ჩვიდმეტ"   , 17 )
+  , ( "თვრამეტი"  , 18 )
+  , ( "თვრამეტ"   , 18 )
+  , ( "ცხრამეტი"  , 19 )
+  , ( "ცხრამეტ"   , 19 )
   ]
 
-ruleNumeral :: Rule
-ruleNumeral = Rule
-  { name = "number (0..10)"
+informalMap :: HashMap Text Integer
+informalMap = HashMap.fromList
+  [ ( "ერთი"       , 1 )
+  , ( "წყვილი"     , 2 )
+  , ( "წყვილები"   , 2 )
+  , ( "ცოტა"       , 3 )
+  , ( "რამდენიმე"  , 3 )
+  , ( "რამოდენიმე" , 3 )
+  ]
+
+ruleToNineteen :: Rule
+ruleToNineteen = Rule
+  { name = "integer (0..19)"
   , pattern =
-    [ regex "(ნული|ერთი|ორი|სამი|ოთხი|ხუთი|ექვსი|შვიდი|რვა|ცხრა|ათი)"
+    [ regex "(წყვილ(ებ)?ი|ცოტა|რამდენიმე|რამოდენიმე|ნოლი?|ნული?|ერთი|ორი?|სამი?|ოთხი?|ხუთი?|ექვსი?|შვიდი?|რვა|თერთმეტი?|თორმეტი?|ცამეტი?|თოთხმეტი?|თხუთმეტი?|თექვსმეტი?|ჩვიდმეტი?|თვრამეტი?|ცხრამეტი?|ცხრა|ა?ათი)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
-        HashMap.lookup (Text.toLower match) ruleNumeralMap >>= integer
+        let x = Text.toLower match in
+        (HashMap.lookup x zeroNineteenMap >>= integer) <|>
+        (HashMap.lookup x informalMap >>= integer >>= notOkForAnyTime)
       _ -> Nothing
   }
 
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "ოცი"         , 20 )
+  , ( "ოცდა"        , 20 )
+  , ( "ოც"          , 20 )
+  , ( "ოცდაათ"      , 30 )
+  , ( "ოცდაათი"     , 30 )
+  , ( "ორმოც"       , 40 )
+  , ( "ორმოცი"      , 40 )
+  , ( "ორმოცდა"     , 40 )
+  , ( "ორმოცდაათ"   , 50 )
+  , ( "ორმოცდაათი"  , 50 )
+  , ( "სამოც"       , 60 )
+  , ( "სამოცი"      , 60 )
+  , ( "სამოცდა"     , 60 )
+  , ( "სამოცდაათ"   , 70 )
+  , ( "სამოცდაათი"  , 70 )
+  , ( "ოთხმოც"      , 80 )
+  , ( "ოთხმოცი"     , 80 )
+  , ( "ოთხმოცდა"    , 80 )
+  , ( "ოთხმოცდაათ"  , 90 )
+  , ( "ოთხმოცდაათი" , 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(ოცდაათი?|ორმოცდაათი?|სამოცდაათი?|ოთხმოცდაათი?|ოცდა|ორმოცდა|სამოცდა|ოთხმოცდა|ოცი?|ორმოცი?|სამოცი?|ოთხმოცი?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+hundredsMap :: HashMap Text Integer
+hundredsMap = HashMap.fromList
+  [ ( "ასი"      , 100 )
+  , ( "ორასი"    , 200 )
+  , ( "სამასი"   , 300 )
+  , ( "ოთხასი"   , 400 )
+  , ( "ხუთასი"   , 500 )
+  , ( "ექვსასი"  , 600 )
+  , ( "შვიდასი"  , 700 )
+  , ( "რვაასი"   , 800 )
+  , ( "ცხრაასი"  , 900 )
+  , ( "ას"       , 100 )
+  , ( "ორას"     , 200 )
+  , ( "სამას"    , 300 )
+  , ( "ოთხას"    , 400 )
+  , ( "ხუთას"    , 500 )
+  , ( "ექვსას"   , 600 )
+  , ( "შვიდას"   , 700 )
+  , ( "რვაას"    , 800 )
+  , ( "ცხრაას"   , 900 )
+  , ( "ორ ას"    , 200 )
+  , ( "სამ ას"   , 300 )
+  , ( "ოთხ ას"   , 400 )
+  , ( "ხუთ ას"   , 500 )
+  , ( "ექვს ას"  , 600 )
+  , ( "შვიდ ას"  , 700 )
+  , ( "რვა ას"   , 800 )
+  , ( "ცხრა ას"  , 900 )
+  , ( "ორ ასი"   , 200 )
+  , ( "სამ ასი"  , 300 )
+  , ( "ოთხ ასი"  , 400 )
+  , ( "ხუთ ასი"  , 500 )
+  , ( "ექვს ასი" , 600 )
+  , ( "შვიდ ასი" , 700 )
+  , ( "რვა ასი"  , 800 )
+  , ( "ცხრა ასი" , 900 )
+  ]
+
+ruleHundreds :: Rule
+ruleHundreds = Rule
+  { name = "integer (800..900)"
+  , pattern =
+    [ regex "(ასი?|ორ ?ასი?|სამ ?ასი?|ოთხ ?ასი?|ხუთ ?ასი?|ექვს ?ასი?|შვიდ ?ასი?|რვა ?ასი?|ცხრა ?ასი?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) hundredsMap >>= integer
+      _ -> Nothing
+  }
+
+rulePowersOfTen :: Rule
+rulePowersOfTen = Rule
+  { name = "powers of tens"
+  , pattern =
+    [ regex "(ათასი?|მილიონი?|მილიარდი?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "ათასი" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "ათას" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "მილიონი"  -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        "მილიონ"  -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        "მილიარდი"  -> double 1e9 >>= withGrain 9 >>= withMultipliable
+        "მილიარდ"  -> double 1e9 >>= withGrain 9 >>= withMultipliable
+        _          -> Nothing
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer 21..99"
+  , pattern =
+    [ oneOf [20,40..90]
+    , numberBetween 1 20
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = tens}:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
+ruleCompositeHundreds :: Rule
+ruleCompositeHundreds = Rule
+  { name = "integer 100..999"
+  , pattern =
+    [ oneOf [100,200..900]
+    , oneOf [20,40..90]
+    , numberBetween 1 20
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = hundreds}:
+       Token Numeral NumeralData{TNumeral.value = tens}:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ hundreds + tens + units
+      _ -> Nothing
+  }
+
+ruleCompositeHundredsAndUnits :: Rule
+ruleCompositeHundredsAndUnits = Rule
+  { name = "integer 100..999"
+  , pattern =
+    [ oneOf [100,200..900]
+    , numberBetween 1 20
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = hundreds}:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ hundreds + units
+      _ -> Nothing
+  }
+
+ruleCompositeHundredsAndTens :: Rule
+ruleCompositeHundredsAndTens = Rule
+  { name = "integer 100..999"
+  , pattern =
+    [ oneOf [100,200..900]
+    , oneOf [10,20..90]
+    ]
+  , prod = \case
+      (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 "წერტილი|მთელი"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \case
+      (Token Numeral nd1:_:Token Numeral nd2:_) ->
+        double $ TNumeral.value nd1 + decimalsToDouble (TNumeral.value nd2)
+      _ -> Nothing
+  }
+
+ruleLeadingDotSpelledOut :: Rule
+ruleLeadingDotSpelledOut = Rule
+  { name = "point 77"
+  , pattern =
+    [ regex "წერტილი|მთელი"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \case
+      (_:Token Numeral nd:_) -> double . decimalsToDouble $ TNumeral.value nd
+      _ -> Nothing
+  }
+
+ruleDecimals :: Rule
+ruleDecimals = Rule
+  { name = "decimal number"
+  , pattern =
+    [ regex "(\\d*\\.\\d+)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal True match
+      _ -> Nothing
+  }
+
+ruleCommas :: Rule
+ruleCommas = Rule
+  { name = "comma-separated numbers"
+  , pattern =
+    [ regex "(\\d+(,\\d\\d\\d)+(\\.\\d+)?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseDouble (Text.replace "," Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+ruleSuffixes :: Rule
+ruleSuffixes = Rule
+  { name = "suffixes (K,M,G))"
+  , pattern =
+    [ dimension Numeral
+    , regex "(k|m|g)(?=[\\W$€¢£]|$)"
+    ]
+  , prod = \case
+      (Token Numeral nd : Token RegexMatch (GroupMatch (match : _)):_) -> do
+        x <- case Text.toLower match of
+          "k" -> Just 1e3
+          "m" -> Just 1e6
+          "g" -> Just 1e9
+          _ -> Nothing
+        double $ TNumeral.value nd * x
+      _ -> Nothing
+  }
+
+ruleNegative :: Rule
+ruleNegative = Rule
+  { name = "negative numbers"
+  , pattern =
+    [ regex "(-|მინუს|მინ)(?!\\s*-)"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (_:Token Numeral nd:_) -> double (TNumeral.value nd * (-1))
+      _ -> Nothing
+  }
+
+ruleSum :: Rule
+ruleSum = Rule
+  { name = "intersect 2 numbers"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleSumAnd :: Rule
+ruleSumAnd = Rule
+  { name = "intersect 2 numbers (with and)"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , regex "და"
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \case
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
-  [ ruleNumeral
+  [ ruleToNineteen
+  , ruleHundreds
+  , ruleCompositeHundreds
+  , ruleCompositeHundredsAndUnits
+  , ruleCompositeHundredsAndTens
+  , ruleTens
+  , rulePowersOfTen
+  , ruleCompositeTens
+  , ruleDotSpelledOut
+  , ruleLeadingDotSpelledOut
+  , ruleDecimals
+  , ruleCommas
+  , ruleSuffixes
+  , ruleNegative
+  , ruleSum
+  , ruleSumAnd
+  , ruleMultiply
   ]
diff --git a/Duckling/Numeral/KM/Corpus.hs b/Duckling/Numeral/KM/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/KM/Corpus.hs
@@ -0,0 +1,107 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.KM.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Numeral.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale KM Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "០"
+             , "សូន្យ"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "១"
+             , "មួយ"
+             ]
+  , examples (NumeralValue 2)
+             [ "2"
+             , "២"
+             , "ពីរ"
+             ]
+  , examples (NumeralValue 3)
+             [ "3"
+             , "៣"
+             , "បី"
+             ]
+  , examples (NumeralValue 4)
+             [ "4"
+             , "៤"
+             , "បួន"
+             ]
+  , examples (NumeralValue 5)
+             [ "5"
+             , "៥"
+             , "ប្រាំ"
+             ]
+  , examples (NumeralValue 6)
+             [ "6"
+             , "៦"
+             , "ប្រាំមួយ"
+             ]
+  , examples (NumeralValue 7)
+             [ "7"
+             , "៧"
+             , "ប្រាំពីរ"
+             ]
+  , examples (NumeralValue 8)
+             [ "8"
+             , "៨"
+             , "ប្រាំបី"
+             ]
+  , examples (NumeralValue 9)
+             [ "9"
+             , "៩"
+             , "ប្រាំបួន"
+             ]
+  , examples (NumeralValue 10)
+             [ "ដប់"
+             ]
+  , examples (NumeralValue 11)
+             [ "ដប់មួយ"
+             ]
+  , examples (NumeralValue 22)
+             [ "ម្ភៃពីរ"
+             ]
+  , examples (NumeralValue 33)
+             [ "សាមបី"
+             ]
+  , examples (NumeralValue 99)
+             [ "កៅប្រាំបួន"
+             ]
+  , examples (NumeralValue 320)
+             [ "បីរយម្ភៃ"
+             ]
+  , examples (NumeralValue 6078)
+             [ "ប្រាំមួយពាន់ចិតប្រាំបី"
+             ]
+  , examples (NumeralValue 5689443)
+             [ "ប្រាំលានប្រាំមួយសែនប្រាំបីម៉ឺនប្រាំបួនពាន់បួនរយសែបី"
+             ]
+  , examples (NumeralValue 800000000)
+             [ "ប្រាំបីរយលាន"
+             ]
+  ]
diff --git a/Duckling/Numeral/KM/Rules.hs b/Duckling/Numeral/KM/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/KM/Rules.hs
@@ -0,0 +1,163 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.KM.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
+
+ruleNumeralMap :: HashMap Text Integer
+ruleNumeralMap = HashMap.fromList
+  [ ( "០", 0 )
+  , ( "១", 1 )
+  , ( "២", 2 )
+  , ( "៣", 3 )
+  , ( "៤", 4 )
+  , ( "៥", 5 )
+  , ( "៦", 6 )
+  , ( "៧", 7 )
+  , ( "៨", 8 )
+  , ( "៩", 9 )
+  , ( "សូន្យ", 0 )
+  , ( "មួយ", 1 )
+  , ( "ពីរ", 2 )
+  , ( "បី", 3 )
+  , ( "បួន", 4 )
+  , ( "ប្រាំ", 5 )
+  , ( "ប្រាំមួយ", 6 )
+  , ( "ប្រាំពីរ", 7 )
+  , ( "ប្រាំបី", 8 )
+  , ( "ប្រាំបួន", 9 )
+  ]
+
+ruleNumeral :: Rule
+ruleNumeral = Rule
+  { name = "integer (0..9)"
+  -- ត្រូវដាក់ពាក្យ ប្រាំមួយ ប្រាំពីរ ប្រាំបី និងប្រាំបួន នៅខាងមុខលេខប្រាំ។ បើមិនដូច្នោះទេ វាមិនអាចផ្គូរផ្គងត្រូវទេ។
+  , pattern =
+    [ regex "(០|១|២|៣|៤|៥|៦|៧|៨|៩|ប្រាំបួន|ប្រាំបី|ប្រាំពីរ|ប្រាំមួយ|ប្រាំ|បួន|បី|ពីរ|មួយ|សូន្យ)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match ruleNumeralMap >>= integer
+      _ -> Nothing
+  }
+
+ruleTensMap :: HashMap Text Integer
+ruleTensMap = HashMap.fromList
+  -- លេខ ១០ ២០ ៣០ ៤០ ៥០ ៦០ ៧០ ៨០ ៩០ អត់ត្រូវបានបញ្ចូលទេ ព្រោះមិនទាន់អាចរក
+  -- វិធីដកលេខ ០ ចេញ នៅពេលផ្គំុជាមួយលេខដទៃ។
+  -- ពពួក "សិប" ក៏មិនត្រូវបានបញ្ចូលដែរ ព្រោះមិនទាន់រកឃើញវិធីផ្គូរផ្គងត្រូវ។
+  [ ( "ដប់", 10 )
+  , ( "ម្ភៃ", 20 )
+  , ( "សាម", 30 )
+  , ( "សែ", 40 )
+  , ( "ហា", 50 )
+  , ( "ហុក", 60 )
+  , ( "ចិត", 70 )
+  , ( "ប៉ែត", 80 )
+  , ( "កៅ", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (10..90)"
+  , pattern =
+    [ regex "(កៅ|ប៉ែត|ចិត|ហុក|ហា|សែ|សាម|ម្ភៃ|ដប់)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match ruleTensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer (11..99)"
+  , pattern =
+    [ oneOf [10, 20 .. 90]
+    , oneOf [1 .. 9]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + v2
+      _ -> Nothing
+  }
+
+rulePowersOfTen :: Rule
+rulePowersOfTen = Rule
+  { name = "powers of tens"
+  , pattern =
+    [ regex "(រយ|ពាន់|ម៉ឺន|សែន|លាន)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
+        "រយ" -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "ពាន់" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "ម៉ឺន" -> double 1e4 >>= withGrain 4 >>= withMultipliable
+        "សែន" -> double 1e5 >>= withGrain 5 >>= withMultipliable
+        "លាន" -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        _ -> Nothing
+      _ -> Nothing
+  }
+
+-- សម្រាប់ផ្គុំពីរលេខ ដែលចាប់ពីខ្ទង់រយទៅ និងខ្ទង់រាយ
+ruleSum :: Rule
+ruleSum = Rule
+  { name = "intersect 2 numbers"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+-- សម្រាប់លេខចាប់ពីខ្ទង់រយទៅ
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \tokens -> case tokens of
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNumeral
+  , ruleTens
+  , ruleCompositeTens
+  , rulePowersOfTen
+  , ruleSum
+  , ruleMultiply
+  ]
diff --git a/Duckling/Numeral/KN/Corpus.hs b/Duckling/Numeral/KN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/KN/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.KN.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 KN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "ಸೊನ್ನೆ"
+             , "೦"
+             ]
+  , examples (NumeralValue 1)
+             [ "ಒಂದು"
+             , "೧"
+             ]
+  , examples (NumeralValue 2)
+             [ "ಎರಡು"
+             , "೨"
+             ]
+  , examples (NumeralValue 3)
+             [ "ಮೂರು"
+             , "೩"
+             ]
+  , examples (NumeralValue 4)
+             [ "ನಾಲ್ಕು"
+             , "೪"
+             ]
+  , examples (NumeralValue 5)
+             [ "ಐದು"
+             , "೫"
+             ]
+  , examples (NumeralValue 6)
+             [ "ಆರು"
+             , "೬"
+             ]
+  , examples (NumeralValue 7)
+             [ "ಏಳು"
+             , "೭"
+             ]
+  , examples (NumeralValue 8)
+             [ "ಎಂಟು"
+             , "೮"
+             ]
+  , examples (NumeralValue 9)
+             [ "ಒಂಬತ್ತು"
+             , "೯"
+             ]
+  ]
diff --git a/Duckling/Numeral/KN/Rules.hs b/Duckling/Numeral/KN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/KN/Rules.hs
@@ -0,0 +1,90 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.KN.Rules
+  ( rules
+  ) where
+
+import Data.HashMap.Strict (HashMap)
+import Data.Maybe
+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.Regex.Types
+import Duckling.Types
+
+ankiMap :: HashMap Char Char
+ankiMap = HashMap.fromList
+  [ ('೦', '0')
+  , ('೧', '1')
+  , ('೨', '2')
+  , ('೩', '3')
+  , ('೪', '4')
+  , ('೫', '5')
+  , ('೬', '6')
+  , ('೭', '7')
+  , ('೮', '8')
+  , ('೯', '9')
+  ]
+
+ankiToArab :: Char -> Char
+ankiToArab c = HashMap.lookupDefault c c ankiMap
+
+ruleAnki :: Rule
+ruleAnki = Rule
+  { name = "anki forms"
+  , pattern =
+    [ regex "([೦೧೨೩೪೫೬೭೮೯]{1,10})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        toInteger <$> parseInt (Text.map ankiToArab match) >>= integer
+      _ -> Nothing
+  }
+
+ruleNumeralMap :: [(Text, Integer)]
+ruleNumeralMap =
+  [ ("ಸೊನ್ನೆ", 0)
+  , ("ಒಂದು", 1)
+  , ("ಎರಡು", 2)
+  , ("ಮೂರು", 3)
+  , ("ನಾಲ್ಕು", 4)
+  , ("ಐದು", 5)
+  , ("ಆರು", 6)
+  , ("ಏಳು", 7)
+  , ("ಎಂಟು", 8)
+  , ("ಒಂಬತ್ತು", 9)
+  ]
+
+ruleNumerals :: [Rule]
+ruleNumerals =
+  map constructRule ruleNumeralMap
+  where
+    constructRule :: (Text, Integer) -> Rule
+    constructRule (s, i) = Rule
+      { name = "number: " `mappend` s
+      , pattern =
+        [ regex $ Text.unpack s
+        ]
+      , prod = const $ integer i
+      }
+
+
+rules :: [Rule]
+rules =
+  [ ruleAnki
+  ]
+  ++ ruleNumerals
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/LO/Corpus.hs b/Duckling/Numeral/LO/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/LO/Corpus.hs
@@ -0,0 +1,89 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.LO.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 LO Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "ສູນ"
+             ]
+  , examples (NumeralValue 1)
+             [ "ໜຶ່ງ"
+             ]
+  , examples (NumeralValue 2)
+             [ "ສອງ"
+             ]
+  , examples (NumeralValue 3)
+             [ "ສາມ"
+             ]
+  , examples (NumeralValue 4)
+             [ "ສີ່"
+             ]
+  , examples (NumeralValue 5)
+             [ "ຫ້າ"
+             ]
+  , examples (NumeralValue 6)
+             [ "ຫົກ"
+             ]
+  , examples (NumeralValue 7)
+             [ "ເຈັດ"
+             ]
+  , examples (NumeralValue 8)
+             [ "ແປດ"
+             ]
+  , examples (NumeralValue 9)
+             [ "ເກົ້າ"
+             ]
+  , examples (NumeralValue 11)
+             [ "ສິບເອັດ"
+             ]
+  , examples (NumeralValue 15)
+             [ "ສິບຫ້າ"
+             ]
+  , examples (NumeralValue 17)
+             [ "ສິບເຈັດ"
+             ]
+  , examples (NumeralValue 22)
+             [ "ຊາວສອງ"
+             ]
+  , examples (NumeralValue 24)
+             [ "ຊາວສີ່"
+             ]
+  , examples (NumeralValue 26)
+             [ "ຊາວຫົກ"
+             ]
+  , examples (NumeralValue 28)
+             [ "ຊາວແປດ"
+             ]
+  , examples (NumeralValue 34)
+             [ "ສາມສິບສີ່"
+             ]
+  , examples (NumeralValue 10)
+             [ "ສິບ"
+             ]
+  , examples (NumeralValue 20)
+             [ "ຊາວ"
+             ]
+  , examples (NumeralValue 50)
+             [ "ຫ້າສິບ"
+             ]
+  ]
diff --git a/Duckling/Numeral/LO/Rules.hs b/Duckling/Numeral/LO/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/LO/Rules.hs
@@ -0,0 +1,153 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.LO.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
+
+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
+  }
+
+elevenToNineteenMap :: HashMap Text Integer
+elevenToNineteenMap = HashMap.fromList
+  [ ( "ສິບເອັດ", 11 )
+  , ( "ສິບສອງ", 12 )
+  , ( "ສິບສາມ", 13 )
+  , ( "ສິບສີ່", 14 )
+  , ( "ສິບຫ້າ", 15 )
+  , ( "ສິບຫົກ", 16 )
+  , ( "ສິບເຈັດ", 17 )
+  , ( "ສິບແປດ", 18 )
+  , ( "ສິບເກົ້າ", 19 )
+  ]
+
+ruleElevenToNineteen :: Rule
+ruleElevenToNineteen = Rule
+  { name = "number (11..19)"
+  , pattern =
+    [ regex "(ສິບເອັດ|ສິບສອງ|ສິບສາມ|ສິບສີ່|ສິບຫ້າ|ສິບຫົກ|ສິບເຈັດ|ສິບແປດ|ສິບເກົ້າ)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) elevenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+twentyoneToTwentynineMap :: HashMap Text Integer
+twentyoneToTwentynineMap = HashMap.fromList
+  [ ( "ຊາວເອັດ", 21 )
+  , ( "ຊາວສອງ", 22 )
+  , ( "ຊາວສາມ", 23 )
+  , ( "ຊາວສີ່", 24 )
+  , ( "ຊາວຫ້າ", 25 )
+  , ( "ຊາວຫົກ", 26 )
+  , ( "ຊາວເຈັດ", 27 )
+  , ( "ຊາວແປດ", 28 )
+  , ( "ຊາວເກົ້າ", 29 )
+  ]
+
+ruleTwentyoneToTwentynine :: Rule
+ruleTwentyoneToTwentynine = Rule
+  { name = "number (21..29)"
+  , pattern =
+    [ regex "(ຊາວເອັດ|ຊາວສອງ|ຊາວສາມ|ຊາວສີ່|ຊາວຫ້າ|ຊາວຫົກ|ຊາວເຈັດ|ຊາວແປດ|ຊາວເກົ້າ)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) twentyoneToTwentynineMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "ຊາວ", 20 )
+  , ( "ສາມສິບ", 30 )
+  , ( "ສິບສີ່", 40 )
+  , ( "ຫ້າສິບ", 50 )
+  , ( "ຫົກສິບ", 60 )
+  , ( "ເຈັດສິບ", 70 )
+  , ( "ແປດສິບ", 80 )
+  , ( "ເກົ້າສິບ", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20,30..90)"
+  , pattern =
+    [ regex "(ຊາວ|ສາມສິບ|ສິບສີ່|ຫ້າສິບ|ຫົກສິບ|ເຈັດສິບ|ແປດສິບ|ເກົ້າສິບ)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([3-9][1-9])"
+  , pattern =
+    [ regex "(ສາມສິບ|ສິບສີ່|ຫ້າສິບ|ຫົກສິບ|ເຈັດສິບ|ແປດສິບ|ເກົ້າສິບ)(ໜຶ່ງ|ສອງ|ສາມ|ສີ່|ຫ້າ|ຫົກ|ເຈັດ|ແປດ|ເກົ້າ)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) tensMap
+        v2 <- HashMap.lookup (Text.toLower m2) ruleNumeralMap
+        integer $ v1 + v2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNumeral
+  , ruleElevenToNineteen
+  , ruleTwentyoneToTwentynine
+  , ruleTens
+  , ruleCompositeTens
+  ]
diff --git a/Duckling/Numeral/ML/Corpus.hs b/Duckling/Numeral/ML/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ML/Corpus.hs
@@ -0,0 +1,100 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.ML.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Numeral.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+
+context :: Context
+context = testContext {locale = makeLocale ML Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "പൂജ്യം"
+             ]
+  , examples (NumeralValue 1)
+             [ "ഒന്ന്"
+             ]
+  , examples (NumeralValue 2)
+             [ "രണ്ട്"
+             ]
+  , examples (NumeralValue 3)
+             [ "മുന്ന്"
+             ]
+  , examples (NumeralValue 4)
+             [ "നാല്"
+             ]
+  , examples (NumeralValue 5)
+             [ "അഞ്ച്"
+             ]
+  , examples (NumeralValue 6)
+             [ "ആറ്"
+             ]
+  , examples (NumeralValue 7)
+             [ "ഏഴ്"
+             ]
+  , examples (NumeralValue 8)
+             [ "എട്ട്"
+             ]
+  , examples (NumeralValue 9)
+             [ "ഒൻപത്"
+             ]
+  , examples (NumeralValue 10)
+             [ "പത്ത്"
+             ]
+  , examples (NumeralValue 11)
+             [ "പതിനൊന്ന്"
+             ]
+  , examples (NumeralValue 12)
+             [ "പന്ത്രണ്ട്"
+             ]
+  , examples (NumeralValue 13)
+             [ "പതിമൂന്ന്"
+             ]
+  , examples (NumeralValue 19)
+             [ "പത്തൊമ്പത്"
+             ]
+  , examples (NumeralValue 20)
+             [ "ഇരുപത്"
+             ]
+  , examples (NumeralValue 21)
+             [ "ഇരുപത്തിഒന്ന്"
+             ]
+  , examples (NumeralValue 22)
+             [ "ഇരുപത്തിരണ്ട്"
+             ]
+  , examples (NumeralValue 26)
+             [ "ഇരുപത്തിആറ്"
+             ]
+  , examples (NumeralValue 30)
+             [ "മുപ്പത്"
+             ]
+   , examples (NumeralValue 33)
+             [ "മുപ്പത്തിമുന്ന്"
+             ]
+  , examples (NumeralValue 50)
+             [ "അമ്പത്"
+             ]
+  , examples (NumeralValue 51)
+             [ "അമ്പത്തിഒന്ന്"
+             ]
+  ]
diff --git a/Duckling/Numeral/ML/Rules.hs b/Duckling/Numeral/ML/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/ML/Rules.hs
@@ -0,0 +1,138 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Numeral.ML.Rules
+  ( rules
+  ) where
+
+import Data.HashMap.Strict (HashMap)
+import Data.Maybe
+import Data.String
+import Data.Text (Text)
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+
+
+zeroToNineMap :: HashMap Text Integer
+zeroToNineMap = HashMap.fromList
+  [ ( "പൂജ്യം", 0 )
+  , ( "ഒന്ന്", 1 )
+  , ( "രണ്ട്", 2 )
+  , ( "മുന്ന്", 3 )
+  , ( "നാല്", 4 )
+  , ( "അഞ്ച്", 5 )
+  , ( "ആറ്", 6 )
+  , ( "ഏഴ്", 7 )
+  , ( "എട്ട്", 8 )
+  , ( "ഒൻപത്", 9 )
+  ]
+
+ruleZeroToNine :: Rule
+ruleZeroToNine = Rule
+  { name = "integer (0..9)"
+  , pattern =
+    [ regex "(പൂജ്യം|ഒന്ന്|രണ്ട്|മുന്ന്|നാല്|അഞ്ച്|ആറ്|ഏഴ്|എട്ട്|ഒൻപത്)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroToNineMap >>= integer
+      _ -> Nothing
+  }
+
+tenToNineteenMap :: HashMap Text Integer
+tenToNineteenMap = HashMap.fromList
+  [ ( "പത്ത്", 10 )
+  , ( "പതിനൊന്ന്", 11 )
+  , ( "പന്ത്രണ്ട്", 12 )
+  , ( "പതിമൂന്ന്", 13 )
+  , ( "പതിനാല്", 14 )
+  , ( "പതിനഞ്ച്", 15 )
+  , ( "പതിനാറ്", 16 )
+  , ( "പതിനേഴ്", 17 )
+  , ( "പതിനെട്ട്", 18 )
+  , ( "പത്തൊമ്പത്", 19 )
+  ]
+
+ruleTenToNineteen :: Rule
+ruleTenToNineteen = Rule
+  { name = "integer (10..19)"
+  , pattern =
+    [
+      regex "(പത്ത്|പതിനൊന്ന്|പന്ത്രണ്ട്|പതിമൂന്ന്|പതിനാല്|പതിനഞ്ച്|പതിനാറ്|പതിനേഴ്|പതിനെട്ട്|പത്തൊമ്പത്)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "ഇരുപത്", 20 )
+  , ( "ഇരുപത്തി", 20 )
+  , ( "മുപ്പത്", 30 )
+  , ( "മുപ്പത്തി", 30 )
+  , ( "നാല്പത്", 40 )
+  , ( "നാല്പത്തി", 40 )
+  , ( "അമ്പത്", 50 )
+  , ( "അമ്പത്തി", 50 )
+  , ( "അറുപത്", 60 )
+  , ( "അറുപത്തി", 60 )
+  , ( "എഴുപത്", 70 )
+  , ( "എഴുപത്തി", 70 )
+  , ( "എൺപത്", 80 )
+  , ( "എൺപത്തി", 80 )
+  , ( "തൊണ്ണൂറ്", 90 )
+  , ( "തൊണ്ണൂറ്റി", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(ഇരുപത്|മുപ്പത്|നാല്പത്|അമ്പത്|അറുപത്|എഴുപത്|എൺപത്|തൊണ്ണൂറ്)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([2-9][1-9])"
+  , pattern =
+    [ regex "(ഇരുപത്തി|മുപ്പത്തി|നാല്പത്തി|അമ്പത്തി|അറുപത്തി|എഴുപത്തി|എൺപത്തി|തൊണ്ണൂറ്റി)(ഒന്ന്|രണ്ട്|മുന്ന്|നാല്|അഞ്ച്|ആറ്|ഏഴ്|എട്ട്|ഒൻപത്)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) tensMap
+        v2 <- HashMap.lookup (Text.toLower m2) zeroToNineMap
+        integer $ v1 + v2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleZeroToNine
+  , ruleTenToNineteen
+  , ruleCompositeTens
+  , ruleTens
+  ]
diff --git a/Duckling/Numeral/MN/Corpus.hs b/Duckling/Numeral/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/MN/Corpus.hs
@@ -0,0 +1,104 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.MN.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Numeral.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale MN Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "нойл"
+             , "тэг"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "нэг"
+             ]
+  , examples (NumeralValue 2)
+             [ "хоёр"
+             ]
+  , examples (NumeralValue 3)
+             [ "гурав"
+             ]
+  , examples (NumeralValue 4)
+             [ "дөрөв"
+             ]
+  , examples (NumeralValue 5)
+             [ "тав"
+             ]
+  , examples (NumeralValue 6)
+             [ "зургаа"
+             ]
+  , examples (NumeralValue 7)
+             [ "долоо"
+             ]
+  , examples (NumeralValue 8)
+             [ "найм"
+             ]
+  , examples (NumeralValue 9)
+             [ "ес"
+             ]
+  , examples (NumeralValue 11)
+             [ "арван нэг"
+             ]
+  , examples (NumeralValue 15)
+             [ "арван тав"
+             ]
+  , examples (NumeralValue 17)
+             [ "арван долоо"
+             ]
+  , examples (NumeralValue 20)
+             [ "20"
+             , "хорь"
+             ]
+  , examples (NumeralValue 22)
+             [ "хорин хоёр"
+             ]
+  , examples (NumeralValue 24)
+             [ "24"
+             , "хорин дөрөв"
+             ]
+  , examples (NumeralValue 26)
+             [ "хорин зургаа"
+             ]
+  , examples (NumeralValue 28)
+             [ "хорин найм"
+             ]
+  , examples (NumeralValue 10)
+             [ "арав"
+             ]
+  , examples (NumeralValue 20)
+             [ "хорь"
+             ]
+  , examples (NumeralValue 50)
+             [ "тавь"
+             ]
+  , examples (NumeralValue 34)
+             [ "гучин дөрөв"
+             ]
+  , examples (NumeralValue 99)
+             [ "ерэн ес"
+             ]
+  ]
diff --git a/Duckling/Numeral/MN/Rules.hs b/Duckling/Numeral/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/MN/Rules.hs
@@ -0,0 +1,319 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.MN.Rules
+  ( rules
+  ) where
+
+import Data.HashMap.Strict (HashMap)
+import Data.Maybe
+import Data.Text (Text)
+import Prelude
+import Data.String
+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
+
+ruleNumeralsPrefixWithNegativeOrMinus :: Rule
+ruleNumeralsPrefixWithNegativeOrMinus = Rule
+  { name = "numbers prefix with -, negative or minus"
+  , pattern =
+    [ regex "-|хасах|сөрөг"
+    , Predicate isPositive
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        double $ v * (- 1)
+      _ -> Nothing
+  }
+
+ruleFew :: Rule
+ruleFew = Rule
+  { name = "few"
+  , pattern =
+    [ regex "хэдхэн"
+    ]
+  , prod = \_ -> integer 3
+  }
+
+ruleTen :: Rule
+ruleTen = Rule
+  { name = "ten"
+  , pattern =
+    [ regex "арав"
+    ]
+  , prod = \_ -> integer 10 >>= withGrain 1
+  }
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator"
+  , pattern =
+    [ regex "(\\d+(\\.\\d\\d\\d)+\\,\\d+)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+
+-- TODO: Single-word composition (#110)
+ruleInteger3 :: Rule
+ruleInteger3 = Rule
+  { name = "integer ([2-9][1-9])"
+  , pattern =
+    [ regex "(хорин|гучин|дөчин|тавин|жаран|далан|наян|ерэн) ?(нэг|хоёр|гурав|дөрөв|тав|зургаа|долоо|найм|ес)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- case Text.toLower m1 of
+          "хорин" -> Just 20
+          "гучин" -> Just 30
+          "дөчин" -> Just 40
+          "тавин" -> Just 50
+          "жаран" -> Just 60
+          "далан" -> Just 70
+          "наян" -> Just 80
+          "ерэн" -> Just 90
+          _ -> Nothing
+        v2 <- case Text.toLower m2 of
+          "нэг" -> Just 1
+          "хоёр" -> Just 2
+          "гурав" -> Just 3
+          "дөрөв" -> Just 4
+          "тав" -> Just 5
+          "зургаа" -> Just 6
+          "долоо" -> Just 7
+          "найм" -> Just 8
+          "ес" -> Just 9
+          _ -> Nothing
+        integer $ v1 + v2
+      _ -> Nothing
+  }
+
+ruleNumeralsUnd :: Rule
+ruleNumeralsUnd = Rule
+  { name = "numbers und"
+  , pattern =
+    [ oneOf [20, 30 .. 90]
+    , numberBetween 1 10
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + v2
+      _ -> Nothing
+  }
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \tokens -> case tokens of
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate hasGrain
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleNumeralsSuffixesKMG :: Rule
+ruleNumeralsSuffixesKMG = Rule
+  { name = "numbers suffixes (K, M, G)"
+  , pattern =
+    [ dimension Numeral
+    , regex "([kmg])(?=[\\W\\$€]|$)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "k" -> double $ v * 1e3
+         "m" -> double $ v * 1e6
+         "g" -> double $ v * 1e9
+         _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleCouple :: Rule
+ruleCouple = Rule
+  { name = "couple"
+  , pattern =
+    [ regex "хос"
+    ]
+  , prod = \_ -> integer 2
+  }
+
+
+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 1e2 >>= withGrain 2 >>= withMultipliable
+        "зуун"  -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "мянга"   -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "мянган"  -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "сая"   -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        "саяын" -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        _           -> Nothing
+      _ -> Nothing
+  }
+
+zeroNineteenMap :: HashMap Text Integer
+zeroNineteenMap = HashMap.fromList
+  [ ("нуль", 0)
+  , ("тэг", 0)
+  , ("нойл", 0)
+  , ("нэг", 1)
+  , ("ганц", 1)
+  , ("хоёр", 2)
+  , ("гурав", 3)
+  , ("дөрөв", 4)
+  , ("тав", 5)
+  , ("зургаа", 6)
+  , ("долоо", 7)
+  , ("найм", 8)
+  , ("ес", 9)
+  , ("арван", 10)
+  , ("арав", 10)
+  , ("арван нэг", 11)
+  , ("арван хоёр", 12)
+  , ("арван гурав", 13)
+  , ("арван дөрөв", 14)
+  , ("арван тав", 15)
+  , ("арван зургаа", 16)
+  , ("арван долоо", 17)
+  , ("арван найм", 18)
+  , ("арван ес", 19)
+  ]
+
+-- TODO: Single-word composition (#110)
+ruleZeroToNineteen :: Rule
+ruleZeroToNineteen = Rule
+  { name = "integer (0..19)"
+  , pattern =
+    [ regex "(нуль|тэг|нойл|нэг|ганц|хоёр|гурав|дөрөв|тав|зургаа|долоо|найм|ес|арван нэг|арван хоёр|арван гурав|арван дөрөв|арван тав|арван зургаа|арван долоо|арван найм|арван ес|арав|арван)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "хорь" , 20 )
+  , ( "гуч", 30 )
+  , ( "дөч" , 40 )
+  , ( "тавь" , 50 )
+  , ( "жар" , 60 )
+  , ( "дал" , 70 )
+  , ( "ная" , 80 )
+  , ( "ер" , 90 )
+  ]
+
+-- TODO: Single-word composition (#110)
+ruleInteger2 :: Rule
+ruleInteger2 = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(хорь|гуч|дөч|тавь|жар|дал|ная|ер)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleNumeralDotNumeral :: Rule
+ruleNumeralDotNumeral = Rule
+  { name = "number dot number"
+  , pattern =
+    [ dimension Numeral
+    , regex "цэг"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + decimalsToDouble v2
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number"
+  , pattern =
+    [ regex "(\\d*\\.\\d+)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal True match
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern =
+    [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseDouble (Text.replace "." Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleCouple
+  , ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleFew
+  , ruleInteger2
+  , ruleInteger3
+  , ruleIntegerWithThousandsSeparator
+  , ruleIntersect
+  , ruleMultiply
+  , ruleNumeralDotNumeral
+  , ruleNumeralsPrefixWithNegativeOrMinus
+  , ruleNumeralsSuffixesKMG
+  , ruleNumeralsUnd
+  , rulePowersOfTen
+  , ruleTen
+  , ruleZeroToNineteen
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -90,12 +89,14 @@
              , "100000"
              , "100K"
              , "100k"
+             , "100 000"
              ]
   , examples (NumeralValue 3000000)
              [ "3M"
              , "3000K"
              , "3000000"
              , "3.000.000"
+             , "3 000 000"
              ]
   , examples (NumeralValue 1200000)
              [ "1.200.000"
@@ -103,6 +104,7 @@
              , "1,2M"
              , "1200K"
              , ",0012G"
+             , "1 200 000"
              ]
   , examples (NumeralValue (-1200000))
              [ "- 1.200.000"
@@ -112,15 +114,313 @@
              , "-1,2M"
              , "-1200K"
              , "-,0012G"
+             , "-1 200 000"
              ]
   , examples (NumeralValue 5000)
              [ "5 tusen"
              , "fem tusen"
+             , "5 000"
              ]
   , examples (NumeralValue 100)
              [ "hundre"
              ]
   , examples (NumeralValue 5020)
              [ "fem tusen og tjue"
+             ]
+  , examples (NumeralValue 1e9)
+             [ "en milliard"
+             ]
+  , examples (NumeralValue 1e12)
+             [ "en billion"
+             ]
+  , examples (NumeralValue 1e15)
+             [ "en billiard"
+             ]
+  , examples (NumeralValue 1e18)
+             [ "en trillion"
+             ]
+  , examples (NumeralValue 1e21)
+             [ "en trilliard"
+             ]
+  , examples (NumeralValue 1e24)
+             [ "en kvadrillion"
+             ]
+  , examples (NumeralValue 1e27)
+             [ "en kvadrilliard"
+             ]
+  , examples (NumeralValue 6e10)
+             [ "seksti milliarder"
+             , "60 milliarder"
+             ]
+  , examples (NumeralValue 3e12)
+             [ "tre billioner"
+             , "3 billioner"
+             ]
+  , examples (NumeralValue 4e17)
+             [ "fire hundre billiarder"
+             , "400 billiarder"
+             ]
+  , examples (NumeralValue 2e18)
+             [ "to trillioner"
+             , "2 trillioner"
+             ]
+  , examples (NumeralValue 1.8e22)
+             [ "atten trilliarder"
+             , "18 trilliarder"
+             ]
+  , examples (NumeralValue 1.8e22)
+             [ "atten trilliarder"
+             , "18 trilliarder"
+             ]
+  , examples (NumeralValue 4.11e26)
+             [ "fire hundre og elleve kvadrillioner"
+             , "411 kvadrillioner"
+             ]
+  , examples (NumeralValue 9e27)
+             [ "ni kvadrilliarder"
+             , "9 kvadrilliarder"
+             ]
+  , examples (NumeralValue 21)
+             [ "tjueen"
+             , "tjueén"
+             ]
+  , examples (NumeralValue 22)
+             [ "tjueto"
+             ]
+  , examples (NumeralValue 23)
+             [ "tjuetre"
+             ]
+  , examples (NumeralValue 24)
+             [ "tjuefire"
+             ]
+  , examples (NumeralValue 25)
+             [ "tjuefem"
+             ]
+  , examples (NumeralValue 26)
+             [ "tjueseks"
+             ]
+  , examples (NumeralValue 27)
+             [ "tjuesju"
+             , "tjuesyv"
+             ]
+  , examples (NumeralValue 28)
+             [ "tjueåtte"
+             ]
+  , examples (NumeralValue 29)
+             [ "tjueni"
+             ]
+  , examples (NumeralValue 31)
+             [ "trettien"
+             , "trettién"
+             ]
+  , examples (NumeralValue 32)
+             [ "trettito"
+             ]
+  , examples (NumeralValue 33)
+             [ "trettitre"
+             ]
+  , examples (NumeralValue 34)
+             [ "trettifire"
+             ]
+  , examples (NumeralValue 35)
+             [ "trettifem"
+             ]
+  , examples (NumeralValue 36)
+             [ "trettiseks"
+             ]
+  , examples (NumeralValue 37)
+             [ "trettisju"
+             , "trettisyv"
+             ]
+  , examples (NumeralValue 38)
+             [ "trettiåtte"
+             ]
+  , examples (NumeralValue 39)
+             [ "trettini"
+             ]
+  , examples (NumeralValue 41)
+             [ "førtien"
+             , "førtién"
+             ]
+  , examples (NumeralValue 42)
+             [ "førtito"
+             ]
+  , examples (NumeralValue 43)
+             [ "førtitre"
+             ]
+  , examples (NumeralValue 44)
+             [ "førtifire"
+             ]
+  , examples (NumeralValue 45)
+             [ "førtifem"
+             ]
+  , examples (NumeralValue 46)
+             [ "førtiseks"
+             ]
+  , examples (NumeralValue 47)
+             [ "førtisju"
+             , "førtisyv"
+             ]
+  , examples (NumeralValue 48)
+             [ "førtiåtte"
+             ]
+  , examples (NumeralValue 49)
+             [ "førtini"
+             ]
+  , examples (NumeralValue 51)
+             [ "femtien"
+             , "femtién"
+             ]
+  , examples (NumeralValue 52)
+             [ "femtito"
+             ]
+  , examples (NumeralValue 53)
+             [ "femtitre"
+             ]
+  , examples (NumeralValue 54)
+             [ "femtifire"
+             ]
+  , examples (NumeralValue 55)
+             [ "femtifem"
+             ]
+  , examples (NumeralValue 56)
+             [ "femtiseks"
+             ]
+  , examples (NumeralValue 57)
+             [ "femtisju"
+             , "femtisyv"
+             ]
+  , examples (NumeralValue 58)
+             [ "femtiåtte"
+             ]
+  , examples (NumeralValue 59)
+             [ "femtini"
+             ]
+  , examples (NumeralValue 61)
+             [ "sekstien"
+             , "sekstién"
+             ]
+  , examples (NumeralValue 62)
+             [ "sekstito"
+             ]
+  , examples (NumeralValue 63)
+             [ "sekstitre"
+             ]
+  , examples (NumeralValue 64)
+             [ "sekstifire"
+             ]
+  , examples (NumeralValue 65)
+             [ "sekstifem"
+             ]
+  , examples (NumeralValue 66)
+             [ "sekstiseks"
+             ]
+  , examples (NumeralValue 67)
+             [ "sekstisju"
+             , "sekstisyv"
+             ]
+  , examples (NumeralValue 68)
+             [ "sekstiåtte"
+             ]
+  , examples (NumeralValue 69)
+             [ "sekstini"
+             ]
+  , examples (NumeralValue 71)
+             [ "syttien"
+             , "søttien"
+             , "søttién"
+             , "søttién"
+             ]
+  , examples (NumeralValue 72)
+             [ "syttito"
+             , "søttito"
+             ]
+  , examples (NumeralValue 73)
+             [ "syttitre"
+             , "søttitre"
+             ]
+  , examples (NumeralValue 74)
+             [ "syttifire"
+             , "søttifire"
+             ]
+  , examples (NumeralValue 75)
+             [ "syttifem"
+             , "søttifem"
+             ]
+  , examples (NumeralValue 76)
+             [ "syttiseks"
+             , "søttiseks"
+             ]
+  , examples (NumeralValue 77)
+             [ "syttisju"
+             , "syttisju"
+             , "søttisyv"
+             , "søttisyv"
+             ]
+  , examples (NumeralValue 78)
+             [ "søttiåtte"
+             , "søttiåtte"
+             ]
+  , examples (NumeralValue 79)
+             [ "søttini"
+             , "søttini"
+             ]
+  , examples (NumeralValue 81)
+             [ "åttien"
+             , "åttién"
+             ]
+  , examples (NumeralValue 82)
+             [ "åttito"
+             ]
+  , examples (NumeralValue 83)
+             [ "åttitre"
+             ]
+  , examples (NumeralValue 84)
+             [ "åttifire"
+             ]
+  , examples (NumeralValue 85)
+             [ "åttifem"
+             ]
+  , examples (NumeralValue 86)
+             [ "åttiseks"
+             ]
+  , examples (NumeralValue 87)
+             [ "åttisju"
+             , "åttisyv"
+             ]
+  , examples (NumeralValue 88)
+             [ "åttiåtte"
+             ]
+  , examples (NumeralValue 89)
+             [ "åttini"
+             ]
+  , examples (NumeralValue 91)
+             [ "nittien"
+             , "nittién"
+             ]
+  , examples (NumeralValue 92)
+             [ "nittito"
+             ]
+  , examples (NumeralValue 93)
+             [ "nittitre"
+             ]
+  , examples (NumeralValue 94)
+             [ "nittifire"
+             ]
+  , examples (NumeralValue 95)
+             [ "nittifem"
+             ]
+  , examples (NumeralValue 96)
+             [ "nittiseks"
+             ]
+  , examples (NumeralValue 97)
+             [ "nittisju"
+             , "nittisyv"
+             ]
+  , examples (NumeralValue 98)
+             [ "nittiåtte"
+             ]
+  , examples (NumeralValue 99)
+             [ "nittini"
              ]
   ]
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
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Numeral.NB.Rules
@@ -36,7 +36,7 @@
     , regex "og"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
        _:
        Token Numeral NumeralData{TNumeral.value = val2}:
@@ -51,7 +51,7 @@
     [ regex "-|minus|negativ"
     , Predicate isPositive
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (_:Token Numeral nd:_) -> double (TNumeral.value nd * (-1))
       _ -> Nothing
   }
@@ -71,7 +71,7 @@
   , pattern =
     [ regex "(\\d+(\\.\\d\\d\\d)+\\,\\d+)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):
        _) -> let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
         in parseDouble fmt >>= double
@@ -85,7 +85,7 @@
     [ dimension Numeral
     , Predicate isMultipliable
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (token1:token2:_) -> multiply token1 token2
       _ -> Nothing
   }
@@ -96,7 +96,7 @@
   , pattern =
     [ regex "(\\d*,\\d+)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):
        _) -> parseDecimal False match
       _ -> Nothing
@@ -109,7 +109,7 @@
     [ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
     , numberBetween 1 10
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v1}:
        Token Numeral NumeralData{TNumeral.value = v2}:
        _) -> double $ v1 + v2
@@ -132,7 +132,7 @@
     [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
        Token Numeral NumeralData{TNumeral.value = val2}:
        _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
@@ -146,7 +146,7 @@
     [ dimension Numeral
     , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case Text.toLower match of
@@ -161,9 +161,9 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(hundre(de)?|tusen?|million(er)?)"
+    [ regex "(hundre(de)?|tusen?|million(er)?|milliard(?:er)?|billion(?:er)?|billiard(?:er)?|trillion(?:er)?|trilliard(?:er)?|kvadrillion(?:er)?|kvadrilliard(?:er)?)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "hundre"    -> double 1e2 >>= withGrain 2 >>= withMultipliable
         "hundrede"  -> double 1e2 >>= withGrain 2 >>= withMultipliable
@@ -171,6 +171,20 @@
         "tusen"     -> double 1e3 >>= withGrain 3 >>= withMultipliable
         "million"   -> double 1e6 >>= withGrain 6 >>= withMultipliable
         "millioner" -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        "milliard" -> double 1e9 >>= withGrain 9 >>= withMultipliable
+        "milliarder" -> double 1e9 >>= withGrain 9 >>= withMultipliable
+        "billion" -> double 1e12 >>= withGrain 12 >>= withMultipliable
+        "billioner" -> double 1e12 >>= withGrain 12 >>= withMultipliable
+        "billiard" -> double 1e15 >>= withGrain 15 >>= withMultipliable
+        "billiarder" -> double 1e15 >>= withGrain 15 >>= withMultipliable
+        "trillion" -> double 1e18 >>= withGrain 18 >>= withMultipliable
+        "trillioner" -> double 1e18 >>= withGrain 18 >>= withMultipliable
+        "trilliard" -> double 1e21 >>= withGrain 21 >>= withMultipliable
+        "trilliarder" -> double 1e21 >>= withGrain 21 >>= withMultipliable
+        "kvadrillion" -> double 1e24 >>= withGrain 24 >>= withMultipliable
+        "kvadrillioner" -> double 1e24 >>= withGrain 24 >>= withMultipliable
+        "kvadrilliard" -> double 1e27 >>= withGrain 27 >>= withMultipliable
+        "kvadrilliarder" -> double 1e27 >>= withGrain 27 >>= withMultipliable
         _           -> Nothing
       _ -> Nothing
   }
@@ -208,7 +222,7 @@
   , ( "seks" , 6 )
   , ( "sju" , 7 )
   , ( "syv" , 7 )
-  , ( "otte" , 8 )
+  , ( "åtte" , 8 )
   , ( "ni" , 9 )
   , ( "ti" , 10 )
   , ( "elleve" , 11 )
@@ -229,12 +243,137 @@
   , pattern =
     [ 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
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         HashMap.lookup (Text.toLower match) zeroToNineteenMap >>= integer
       _ -> Nothing
   }
 
+twentyToHundredMap :: HashMap Text Integer
+twentyToHundredMap = HashMap.fromList
+  [ ("tjueen", 21)
+  , ("tjueén", 21)
+  , ("tjueto", 22)
+  , ("tjuetre", 23)
+  , ("tjuefire", 24)
+  , ("tjuefem", 25)
+  , ("tjueseks", 26)
+  , ("tjuesju", 27)
+  , ("tjuesyv", 27)
+  , ("tjueåtte", 28)
+  , ("tjueni", 29)
+  , ("trettien", 31)
+  , ("trettién", 31)
+  , ("trettito", 32)
+  , ("trettitre", 33)
+  , ("trettifire", 34)
+  , ("trettifem", 35)
+  , ("trettiseks", 36)
+  , ("trettisju", 37)
+  , ("trettisyv", 37)
+  , ("trettiåtte", 38)
+  , ("trettini", 39)
+  , ("førtien", 41)
+  , ("førtién", 41)
+  , ("førtito", 42)
+  , ("førtitre", 43)
+  , ("førtifire", 44)
+  , ("førtifem", 45)
+  , ("førtiseks", 46)
+  , ("førtisju", 47)
+  , ("førtisyv", 47)
+  , ("førtiåtte", 48)
+  , ("førtini", 49)
+  , ("femtien", 51)
+  , ("femtién", 51)
+  , ("femtito", 52)
+  , ("femtitre", 53)
+  , ("femtifire", 54)
+  , ("femtifem", 55)
+  , ("femtiseks", 56)
+  , ("femtisju", 57)
+  , ("femtisyv", 57)
+  , ("femtiåtte", 58)
+  , ("femtini", 59)
+  , ("sekstien", 61)
+  , ("sekstién", 61)
+  , ("sekstito", 62)
+  , ("sekstitre", 63)
+  , ("sekstifire", 64)
+  , ("sekstifem", 65)
+  , ("sekstiseks", 66)
+  , ("sekstisju", 67)
+  , ("sekstisyv", 67)
+  , ("sekstiåtte", 68)
+  , ("sekstini", 69)
+  , ("syttien", 71)
+  , ("syttién", 71)
+  , ("syttito", 72)
+  , ("syttitre", 73)
+  , ("syttifire", 74)
+  , ("syttifem", 75)
+  , ("syttiseks", 76)
+  , ("syttisju", 77)
+  , ("syttisyv", 77)
+  , ("syttiåtte", 78)
+  , ("syttini", 79)
+  , ("søttien", 71)
+  , ("søttién", 71)
+  , ("søttito", 72)
+  , ("søttitre", 73)
+  , ("søttifire", 74)
+  , ("søttifem", 75)
+  , ("søttiseks", 76)
+  , ("søttisju", 77)
+  , ("søttisyv", 77)
+  , ("søttiåtte", 78)
+  , ("søttini", 79)
+  , ("åttien", 81)
+  , ("åttién", 81)
+  , ("åttito", 82)
+  , ("åttitre", 83)
+  , ("åttifire", 84)
+  , ("åttifem", 85)
+  , ("åttiseks", 86)
+  , ("åttisju", 87)
+  , ("åttisyv", 87)
+  , ("åttiåtte", 88)
+  , ("åttini", 89)
+  , ("nittien", 91)
+  , ("nittién", 91)
+  , ("nittito", 92)
+  , ("nittitre", 93)
+  , ("nittifire", 94)
+  , ("nittifem", 95)
+  , ("nittiseks", 96)
+  , ("nittisju", 97)
+  , ("nittisyv", 97)
+  , ("nittiåtte", 98)
+  , ("nittini", 99)
+  ]
+
+ruleInteger4 :: Rule
+ruleInteger4 = Rule
+  { name = "integer (21..99)"
+  , pattern =
+    [ regex "(tjueen|tjueén|tjueto|tjuetre|tjuefire|tjuefem|tjueseks|tjuesju|tjuesyv|tjueåtte|tjueni\
+            \|trettien|trettién|trettito|trettitre|trettifire|trettifem|trettiseks|trettisju|trettisyv|trettiåtte|trettini\
+            \|førtien|førtién|førtito|førtitre|førtifire|førtifem|førtiseks|førtisju|førtisyv|førtiåtte|førtini\
+            \|femtien|femtién|femtito|femtitre|femtifire|femtifem|femtiseks|femtisju|femtisyv|femtiåtte|femtini\
+            \|sekstien|sekstién|sekstito|sekstitre|sekstifire|sekstifem|sekstiseks|sekstisju|sekstisyv|sekstiåtte|sekstini\
+            \|syttien|syttién|syttito|syttitre|syttifire|syttifem|syttiseks|syttisju|syttisyv|syttiåtte|syttini\
+            \|søttien|søttién|søttito|søttitre|søttifire|søttifem|søttiseks|søttisju|søttisyv|søttiåtte|søttini\
+            \|åttien|åttién|åttito|åttitre|åttifire|åttifem|åttiseks|åttisju|åttisyv|åttiåtte|åttini\
+            \|nittien|nittién|nittito|nittitre|nittifire|nittifem|nittiseks|nittisju|nittisyv|nittiåtte|nittini\
+            \)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) twentyToHundredMap >>= integer
+      _ -> Nothing
+  }
+
+
 tensMap :: HashMap Text Integer
 tensMap = HashMap.fromList
   [ ( "tyve" , 20 )
@@ -256,7 +395,7 @@
   , pattern =
     [ regex "(tyve|tjue|tredve|tretti|førti|femti|seksti|sytti|søtti|åtti|nitti)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         HashMap.lookup (Text.toLower match) tensMap >>= integer
       _ -> Nothing
@@ -270,7 +409,7 @@
     , regex "komma"
     , Predicate $ not . hasGrain
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
         double $ TNumeral.value nd1 + decimalsToDouble (TNumeral.value nd2)
       _ -> Nothing
@@ -280,11 +419,12 @@
 ruleIntegerWithThousandsSeparator = Rule
   { name = "integer with thousands separator ."
   , pattern =
-    [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
+    [ regex "(\\d{1,3}((?:\\.| )\\d\\d\\d){1,5})"
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) ->
-        parseDouble (Text.replace "." Text.empty match) >>= double
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDouble
+        (Text.replace " " Text.empty $ Text.replace "." Text.empty $ match)
+        >>= double
       _ -> Nothing
   }
 
@@ -298,6 +438,7 @@
   , ruleInteger
   , ruleInteger2
   , ruleInteger3
+  , ruleInteger4
   , ruleIntegerWithThousandsSeparator
   , ruleIntersect
   , ruleIntersectWithAnd
diff --git a/Duckling/Numeral/NE/Corpus.hs b/Duckling/Numeral/NE/Corpus.hs
--- a/Duckling/Numeral/NE/Corpus.hs
+++ b/Duckling/Numeral/NE/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Numeral/NE/Rules.hs b/Duckling/Numeral/NE/Rules.hs
--- a/Duckling/Numeral/NE/Rules.hs
+++ b/Duckling/Numeral/NE/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -77,6 +76,14 @@
              [ "0,77"
              , ",77"
              ]
+  , examples (NumeralValue 100000)
+             [ "100.000"
+             , "100.000,0"
+             , "100000"
+             , "100K"
+             , "100k"
+             , "honderd duizend"
+             ]
   , examples (NumeralValue 300)
              [ "3 honderd"
              , "drie honderd"
@@ -84,6 +91,8 @@
   , examples (NumeralValue 5000)
              [ "5 duizend"
              , "vijf duizend"
+             , "5.000"
+             , "5.000,00"
              ]
   , examples (NumeralValue 144)
              [ "gros"
@@ -95,6 +104,9 @@
              ]
   , examples (NumeralValue 20000)
              [ "twintig duizend"
+             , "20.000"
+             , "20000"
+             , "20.000,00"
              ]
   , examples (NumeralValue 0.2)
              [ "1/5"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -63,7 +62,7 @@
 ruleDecimalWithThousandsSeparator = Rule
   { name = "decimal with thousands separator"
   , pattern =
-    [ regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"
+    [ regex "(\\d+(\\.\\d\\d\\d)+(,\\d+)?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):
@@ -148,7 +147,7 @@
   { name = "numbers en"
   , pattern =
     [ numberBetween 1 10
-    , regex "en"
+    , regex "-?en-?"
     , oneOf [20, 30 .. 90]
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/PL/Corpus.hs b/Duckling/Numeral/PL/Corpus.hs
--- a/Duckling/Numeral/PL/Corpus.hs
+++ b/Duckling/Numeral/PL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -98,6 +97,22 @@
   , examples (NumeralValue 5000)
              [ "5 tysięcy"
              , "pięć tysięcy"
+             ]
+  , examples (NumeralValue 79)
+             [ "siedemdziesiąt dziewięć"
+             , "siedemdziesięciu dziewięciu"
+             ]
+  , examples (NumeralValue 84)
+             [ "osiemdziesiąt cztery"
+             , "osiemdziesiat cztery"
+             , "osiemdziesięciu czterem"
+             , "osiemdziesieciu czterem"
+             ]
+  , examples (NumeralValue 92)
+             [ "dziewięćdziesiąt dwa"
+             , "dziewiecdziesiat dwa"
+             , "dziewięćdziesięciu dwóm"
+             , "dziewiecdziesieciu dwom"
              ]
   , examples (NumeralValue 122)
              [ "sto dwadzieścia dwa"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -61,6 +60,33 @@
   , prod = \_ -> integer 60
   }
 
+ruleSeventy :: Rule
+ruleSeventy = Rule
+  { name = "seventy"
+  , pattern =
+    [ regex "siedemdziesi((a|ą)t|(e|ę)ci(u|oma))"
+    ]
+  , prod = \_ -> integer 70
+  }
+
+ruleEighty :: Rule
+ruleEighty = Rule
+  { name = "eighty"
+  , pattern =
+    [ regex "osiemdziesi((a|ą)t|(e|ę)ci(u|oma))"
+    ]
+  , prod = \_ -> integer 80
+  }
+
+ruleNinety :: Rule
+ruleNinety = Rule
+  { name = "ninety"
+  , pattern =
+    [ regex "dziewi(e|ę)(c|ć)dziesi((a|ą)|(e|ę))(t|ci(u|oma))"
+    ]
+  , prod = \_ -> integer 90
+  }
+
 ruleIntersectWithAnd :: Rule
 ruleIntersectWithAnd = Rule
   { name = "intersect (with and)"
@@ -553,6 +579,7 @@
   , ruleDozen
   , ruleEight
   , ruleEighteen
+  , ruleEighty
   , ruleEleven
   , ruleFifteen
   , ruleFifty
@@ -568,6 +595,7 @@
   , ruleMultiply
   , ruleNine
   , ruleNineteen
+  , ruleNinety
   , ruleNumeral
   , ruleNumeral2
   , ruleNumeral3
@@ -583,6 +611,7 @@
   , ruleOne
   , ruleSeven
   , ruleSeventeen
+  , ruleSeventy
   , ruleSingle
   , ruleSix
   , ruleSixteen
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -20,8 +19,11 @@
 import Duckling.Resolve
 import Duckling.Testing.Types
 
+context :: Context
+context = testContext {locale = makeLocale RO Nothing}
+
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
+corpus = (context, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -164,6 +166,10 @@
              [ "7 milioane"
              , "sapte milioane"
              , "șapte milioane"
+             ]
+  , examples (NumeralValue 21000000)
+             [ "21 de milioane"
+             , "douazeci si unu de milioane"
              ]
   , examples (NumeralValue 1000000000)
              [ "un miliard"
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
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Numeral.RO.Rules
@@ -23,7 +23,7 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers
-import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Regex.Types
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
@@ -35,7 +35,7 @@
     [ regex "-|minus"
     , Predicate isPositive
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (_:Token Numeral nd:_) -> double (TNumeral.value nd * (-1))
       _ -> Nothing
   }
@@ -46,7 +46,7 @@
   , pattern =
     [ regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):
        _) -> let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
         in parseDouble fmt >>= double
@@ -59,9 +59,8 @@
   , pattern =
     [ regex "(\\d*,\\d+)"
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):
-       _) -> parseDecimal False match
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal False match
       _ -> Nothing
   }
 
@@ -72,7 +71,7 @@
     [ oneOf [20, 30 .. 90]
     , numberBetween 1 10
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v1}:
        Token Numeral NumeralData{TNumeral.value = v2}:
        _) -> double $ v1 + v2
@@ -86,11 +85,24 @@
     [ dimension Numeral
     , Predicate isMultipliable
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (token1:token2:_) -> multiply token1 token2
       _ -> Nothing
   }
 
+ruleMultiplyDe :: Rule
+ruleMultiplyDe = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ numberWith TNumeral.value (>= 20)
+    , regex "de"
+    , Predicate isMultipliable
+    ]
+  , prod = \case
+      (token1:_:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
 ruleIntersect :: Rule
 ruleIntersect = Rule
   { name = "intersect"
@@ -98,7 +110,7 @@
     [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
        Token Numeral NumeralData{TNumeral.value = val2}:
        _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
@@ -110,10 +122,10 @@
   { name = "intersect (cu și)"
   , pattern =
     [ Predicate hasGrain
-    , regex "(s|ș)i"
+    , regex "[sș]i"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
        _:
        Token Numeral NumeralData{TNumeral.value = val2}:
@@ -128,7 +140,7 @@
     [ Predicate isPositive
     , regex "neg(ativ)?"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:
        _) -> double $ v * (-1)
       _ -> Nothing
@@ -140,7 +152,7 @@
   , pattern =
     [ regex "(sut(a|e|ă)?|milio(n|ane)?|miliar(de?)?|mi[ei]?)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "suta"      -> double 1e2 >>= withGrain 2 >>= withMultipliable
         "sute"      -> double 1e2 >>= withGrain 2 >>= withMultipliable
@@ -199,7 +211,7 @@
   , pattern =
     [ 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
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         HashMap.lookup (Text.toLower match) zeroTenMap >>= integer
       _ -> Nothing
@@ -231,7 +243,7 @@
   , pattern =
     [ 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
+  , prod = \case
       (Token RegexMatch (GroupMatch (e1:_:e2:_:r:_)):_) -> do
         match <- case () of
           _ | not $ Text.null e1 -> Just e1
@@ -246,9 +258,9 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(dou(a|ă)|trei|patru|cinci|(s|ș)ai|(s|ș)apte|opt|nou(a|ă))\\s?zeci"
+    [ regex "(dou[aă]|trei|patru|cinci|[sș]ai|[sș]apte|opt|nou[aă])\\s?zeci"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         unit <- HashMap.lookup (Text.toLower match) zeroTenMap
         integer (unit * 10) >>= withGrain 2 >>= withMultipliable
@@ -261,7 +273,7 @@
   , pattern =
     [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):
        _) -> let fmt = Text.replace "." Text.empty match
         in parseDouble fmt >>= double
@@ -280,6 +292,7 @@
   , ruleIntersect
   , ruleIntersectCuI
   , ruleMultiply
+  , ruleMultiplyDe
   , ruleNumeralsPrefixWithOrMinus
   , ruleNumeralsSuffixesWithNegativ
   , rulePowersOfTen
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -56,6 +55,7 @@
   , examples (NumeralValue 33)
              [ "33"
              , "тридцать три"
+             , "тридцати три"
              , "0033"
              ]
   , examples (NumeralValue 11)
@@ -84,11 +84,33 @@
              ]
   , examples (NumeralValue 444)
              [ "четыреста сорок четыре"
+             , "четыреста сорока четыре"
              , "444"
              ]
   , examples (NumeralValue 525)
              [ "пятьсот двадцать пять"
+             , "пятьсот двадцати пять"
              , "525"
+             ]
+  , examples (NumeralValue 555)
+             [ "пятьсот пятьдесят пять"
+             , "пятьсот пятидесяти пять"
+             ]
+  , examples (NumeralValue 565)
+             [ "пятьсот шестьдесят пять"
+             , "пятьсот шестидесяти пять"
+             ]
+  , examples (NumeralValue 575)
+             [ "пятьсот семьдесят пять"
+             , "пятьсот семидесяти пять"
+             ]
+  , examples (NumeralValue 585)
+             [ "пятьсот восемьдесят пять"
+             , "пятьсот восьмидесяти пять"
+             ]
+  , examples (NumeralValue 595)
+             [ "пятьсот девяносто пять"
+             , "пятьсот девяноста пять"
              ]
   , examples (NumeralValue 1.5)
              [ "1.5"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -31,20 +30,32 @@
 tensMap :: HashMap Text Integer
 tensMap = HashMap.fromList
   [ ( "двадцать", 20)
+  , ( "двадцати", 20)
   , ( "тридцать", 30)
+  , ( "тридцати", 30)
   , ( "сорок", 40)
+  , ( "сорока", 40)
   , ( "пятьдесят", 50)
+  , ( "пятидесяти", 50)
   , ( "шестьдесят", 60)
+  , ( "шестидесяти", 60)
+  , ( "шестидесят", 60)
   , ( "семьдесят", 70)
+  , ( "семидесяти", 70)
+  , ( "семидесят", 70)
   , ( "восемьдесят", 80)
+  , ( "восьмидесяти", 80)
+  , ( "восьмидесят", 80)
+  , ( "восемьдесяти", 80)
   , ( "девяносто", 90)
+  , ( "девяноста", 90)
   ]
 
 ruleInteger5 :: Rule
 ruleInteger5 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)"
+    [ regex "(двадцат(ь|и)|тридцат(ь|и)|сорока?|пят(ь|и)десяти?|шест(ь|и)десяти?|сем(ь|и)десяти?|вос(е|ь)м(ь|и)десяти?|девяност(о|а))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -79,7 +90,7 @@
 ruleInteger3 = Rule
   { name = "integer 2"
   , pattern =
-    [ regex "(два|две|двое|пара|пару|парочку|парочка)"
+    [ regex "(дв(а|е|ух|ое)|пар(а|у|очк(у|а)))"
     ]
   , prod = \_ -> integer 2
   }
diff --git a/Duckling/Numeral/Rules.hs b/Duckling/Numeral/Rules.hs
--- a/Duckling/Numeral/Rules.hs
+++ b/Duckling/Numeral/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/SK/Corpus.hs b/Duckling/Numeral/SK/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/SK/Corpus.hs
@@ -0,0 +1,110 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.SK.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 SK Nothing}
+  , testOptions
+  , allExamples
+  )
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "nula"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "jeden"
+             , "jedna"
+             ]
+  , examples (NumeralValue 2)
+             [ "2"
+             , "dva"
+             , "dve"
+             ]
+  , examples (NumeralValue 7)
+             [ "7"
+             , "sedem"
+             ]
+  , examples (NumeralValue 14)
+             [ "14"
+             , "štrnásť"
+             ]
+  , examples (NumeralValue 16)
+             [ "16"
+             , "šestnásť"
+             ]
+  , examples (NumeralValue 17)
+             [ "17"
+             , "sedemnásť"
+             ]
+  , examples (NumeralValue 18)
+             [ "18"
+             , "osemnásť"
+             ]
+  , examples (NumeralValue 20)
+             [ "20"
+             , "dvadsať"
+             ]
+  , examples (NumeralValue 1.1)
+             [ "1,1"
+             , "1,10"
+             , "01,10"
+             ]
+  , examples (NumeralValue 0.77)
+             [ "0,77"
+             , ",77"
+             ]
+  , examples (NumeralValue 100000)
+             [ "100.000"
+             , "100000"
+             , "100K"
+             , "100k"
+             ]
+  , examples (NumeralValue 3000000)
+             [ "3M"
+             , "3000K"
+             , "3000000"
+             , "3.000.000"
+             ]
+  , examples (NumeralValue 1200000)
+             [ "1.200.000"
+             , "1200000"
+             , "1,2M"
+             , "1200K"
+             , ",0012G"
+             ]
+  , examples (NumeralValue (-1200000))
+             [ "- 1.200.000"
+             , "-1200000"
+             , "mínus 1.200.000"
+             , "-1,2M"
+             , "-1200K"
+             , "-,0012G"
+             ]
+  , examples (NumeralValue 5000)
+             [ "5 tisíc"
+             , "päť tisíc"
+             ]
+  ]
diff --git a/Duckling/Numeral/SK/Rules.hs b/Duckling/Numeral/SK/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/SK/Rules.hs
@@ -0,0 +1,309 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.SK.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
+
+ruleIntersectWithAnd :: Rule
+ruleIntersectWithAnd = Rule
+  { name = "intersect (with and)"
+  , pattern =
+    [ Predicate hasGrain
+    , regex "a"
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleNumeralsPrefixWithNegativeOrMinus :: Rule
+ruleNumeralsPrefixWithNegativeOrMinus = Rule
+  { name = "numbers prefix with -, negative or minus"
+  , pattern =
+    [ regex "-|mínus|záporné"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (_:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> double $ v * (-1)
+      _ -> Nothing
+  }
+
+ruleFew :: Rule
+ruleFew = Rule
+  { name = "few"
+  , pattern =
+    [ regex "(zo)?pár"
+    ]
+  , prod = \_ -> integer 3
+  }
+
+ruleDecimalWithThousandsSeparator :: Rule
+ruleDecimalWithThousandsSeparator = Rule
+  { name = "decimal with thousands separator"
+  , pattern =
+    [ regex "(\\d+(\\.\\d\\d\\d)+\\,\\d+)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> let fmt = Text.replace "," "." $ Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+ruleDecimalNumeral :: Rule
+ruleDecimalNumeral = Rule
+  { name = "decimal number"
+  , pattern =
+    [ regex "(\\d*,\\d+)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> parseDecimal False match
+      _ -> Nothing
+  }
+
+ruleIntegerCompositeTens :: Rule
+ruleIntegerCompositeTens = Rule
+  { name = "integer 21..99"
+  , pattern =
+    [ oneOf [20, 30..90]
+    , numberBetween 1 10
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = tens}:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
+ruleSingle :: Rule
+ruleSingle = Rule
+  { name = "single"
+  , pattern =
+    [ regex "jed(en|no|na)"
+    ]
+  , prod = \_ -> integer 1 >>= withGrain 1
+  }
+
+ruleSum :: Rule
+ruleSum = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate hasGrain
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \case
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+ruleNumeralsSuffixesKMG :: Rule
+ruleNumeralsSuffixesKMG = Rule
+  { name = "numbers suffixes (K, M, G)"
+  , pattern =
+    [ dimension Numeral
+    , regex "([kmg])(?=[\\W\\$€]|$)"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "k" -> double $ v * 1e3
+         "m" -> double $ v * 1e6
+         "g" -> double $ v * 1e9
+         _   -> Nothing
+      _ -> Nothing
+  }
+
+rulePowersOfTen :: Rule
+rulePowersOfTen = Rule
+  { name = "powers of tens"
+  , pattern =
+    [ regex "(sto(vky)?|tisíce?|milióny?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "sto"     -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "stovky"  -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "tisíc"   -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "tisíce"  -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "milión"  -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        "milióny" -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        _         -> Nothing
+      _ -> Nothing
+  }
+
+ruleCouple :: Rule
+ruleCouple = Rule
+  { name = "couple, a pair"
+  , pattern =
+    [ regex "páry?"
+    ]
+  , prod = \_ -> integer 2
+  }
+
+ruleDozen :: Rule
+ruleDozen = Rule
+  { name = "dozen"
+  , pattern =
+    [ regex "tucet"
+    ]
+  , prod = \_ -> integer 12 >>= withGrain 1 >>= withMultipliable
+  }
+
+zeroToNineteenMap :: HashMap Text Integer
+zeroToNineteenMap = HashMap.fromList
+  [ ( "nula"    , 0 )
+  , ( "jeden"   , 1 )
+  , ( "jedna"   , 1 )
+  , ( "jedno"   , 1 )
+  , ( "dva"     , 2 )
+  , ( "dve"     , 2 )
+  , ( "tri"     , 3 )
+  , ( "štyri"   , 4 )
+  , ( "päť"     , 5 )
+  , ( "šesť"    , 6 )
+  , ( "sedem"   , 7 )
+  , ( "osem"    , 8 )
+  , ( "deväť"   , 9 )
+  , ( "desať"   , 10 )
+  , ( "jedenásť", 11 )
+  , ( "dvanásť" , 12 )
+  , ( "trinásť" , 13 )
+  , ( "štrnásť" , 14 )
+  , ( "pätnásť" , 15 )
+  , ( "šestnásť", 16 )
+  , ( "sedemnásť", 17 )
+  , ( "osemnásť" , 18 )
+  , ( "devätnásť", 19 )
+  ]
+
+ruleInteger :: Rule
+ruleInteger = Rule
+  { name = "integer (0..19)"
+  -- e.g. jedenásť must be before jeden, otherwise jeden will always shadow jedenásť
+  , pattern =
+    [ regex "(nula|jed(enásť|en|na|no)|dv(anásť|a|e)|trinásť|tri|štrnásť|štyri|pätnásť|päť|šestnásť|šesť|sedemnásť|sedem|osemnásť|osem|devätnásť|deväť|desať)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+dozenMap :: HashMap Text Integer
+dozenMap = HashMap.fromList
+  [ ( "dvadsať"        , 20)
+  , ( "tridsať"        , 30)
+  , ( "štyridsať"      , 40)
+  , ( "päťdesiat"      , 50)
+  , ( "šesťdesiat"     , 60)
+  , ( "sedemdesiat"    , 70)
+  , ( "osemdesiat"     , 80)
+  , ( "devätdesiat"    , 90)
+  ]
+
+ruleInteger2 :: Rule
+ruleInteger2 = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "((dva|tri|štyri)dsať|(päť|šesť|sedem|osem|devät)desiat)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) dozenMap >>= integer
+      _ -> Nothing
+  }
+
+ruleNumeralDotNumeral :: Rule
+ruleNumeralDotNumeral = Rule
+  { name = "number dot number"
+  , pattern =
+    [ dimension Numeral
+    , regex "celá|celých|celé"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \case
+      (Token Numeral nd1:_:Token Numeral nd2:_) ->
+        double $ TNumeral.value nd1 + decimalsToDouble (TNumeral.value nd2)
+      _ -> Nothing
+  }
+
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ."
+  , pattern =
+    [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> let fmt = Text.replace "." Text.empty match
+        in parseDouble fmt >>= double
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleCouple
+  , ruleDecimalNumeral
+  , ruleDecimalWithThousandsSeparator
+  , ruleDozen
+  , ruleFew
+  , ruleInteger
+  , ruleInteger2
+  , ruleIntegerCompositeTens
+  , ruleIntegerWithThousandsSeparator
+  , ruleSum
+  , ruleIntersectWithAnd
+  , ruleMultiply
+  , ruleNumeralDotNumeral
+  , ruleNumeralsPrefixWithNegativeOrMinus
+  , ruleNumeralsSuffixesKMG
+  , rulePowersOfTen
+  , ruleSingle
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/SW/Corpus.hs b/Duckling/Numeral/SW/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/SW/Corpus.hs
@@ -0,0 +1,86 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.SW.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 SW Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "sufuri"
+             , "zero"
+             ]
+  , examples (NumeralValue 1)
+             [ "moja"
+             ]
+  , examples (NumeralValue 2)
+             [ "mbili"
+             ]
+  , examples (NumeralValue 3)
+             [ "tatu"
+             ]
+  , examples (NumeralValue 4)
+             [ "nne"
+             ]
+  , examples (NumeralValue 5)
+             [ "tano"
+             ]
+  , examples (NumeralValue 6)
+             [ "sita"
+             ]
+  , examples (NumeralValue 7)
+             [ "saba"
+             ]
+  , examples (NumeralValue 8)
+             [ "nane"
+             ]
+  , examples (NumeralValue 9)
+             [ "tisa"
+             ]
+  , examples (NumeralValue 10)
+             [ "kumi"
+             ]
+  , examples (NumeralValue 20)
+             [ "ishirini"
+             ]
+  , examples (NumeralValue 30)
+             [ "thelathini"
+             ]
+  , examples (NumeralValue 40)
+             [ "arubaini"
+             , "arobaini"
+             ]
+  , examples (NumeralValue 50)
+             [ "hamsini"
+             ]
+  , examples (NumeralValue 60)
+             [ "sitini"
+             ]
+  , examples (NumeralValue 70)
+             [ "sabini"
+             ]
+  , examples (NumeralValue 80)
+             [ "themanini"
+             ]
+  , examples (NumeralValue 90)
+             [ "tisini"
+             ]
+  ]
diff --git a/Duckling/Numeral/SW/Rules.hs b/Duckling/Numeral/SW/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/SW/Rules.hs
@@ -0,0 +1,104 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.SW.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
+
+ruleNumeralMap :: HashMap Text Integer
+ruleNumeralMap = HashMap.fromList
+  [ ( "sufuri", 0 )
+  , ( "zero", 0 )
+  , ( "moja", 1 )
+  , ( "mbili", 2 )
+  , ( "tatu", 3 )
+  , ( "nne", 4 )
+  , ( "tano", 5)
+  , ( "sita", 6)
+  , ( "saba", 7)
+  , ( "nane", 8)
+  , ( "tisa", 9)
+  , ( "kumi", 10)
+  ]
+
+ruleNumeral :: Rule
+ruleNumeral = Rule
+  { name = "number (0..10)"
+  , pattern =
+    [ regex "(sufuri|zero|moja|mbili|tatu|nne|tano|sita|saba|nane|tisa|kumi)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) ruleNumeralMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "ishirini", 20 )
+  , ( "thelathini", 30 )
+  , ( "arubaini", 40 )
+  , ( "arobaini", 40 )
+  , ( "hamsini", 50 )
+  , ( "sitini", 60 )
+  , ( "sabini", 70 )
+  , ( "themanini", 80 )
+  , ( "tisini", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20,30..90)"
+  , pattern =
+    [ regex "(ishirini|thelathini|arubaini|arobaini|hamsini|sitini|sabini|themanini|tisini)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer 11..19 21..29 .. 91..99"
+  , pattern = [oneOf [20,30..90]
+  , regex "-?na-?"
+  , numberBetween 1 10]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v1 + v2
+      _ -> Nothing
+  }
+
+
+rules :: [Rule]
+rules =
+  [ ruleNumeral
+  , ruleTens
+  , ruleCompositeTens
+  ]
diff --git a/Duckling/Numeral/TA/Corpus.hs b/Duckling/Numeral/TA/Corpus.hs
--- a/Duckling/Numeral/TA/Corpus.hs
+++ b/Duckling/Numeral/TA/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Numeral/TA/Rules.hs b/Duckling/Numeral/TA/Rules.hs
--- a/Duckling/Numeral/TA/Rules.hs
+++ b/Duckling/Numeral/TA/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Numeral/TE/Corpus.hs b/Duckling/Numeral/TE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/TE/Corpus.hs
@@ -0,0 +1,123 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.TE.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 TE Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "సున్న"
+             ]
+  , examples (NumeralValue 1)
+             [ "ఒకటి"
+             ]
+  , examples (NumeralValue 2)
+             [ "రెండు"
+             ]
+  , examples (NumeralValue 3)
+             [ "మూడు"
+             ]
+  , examples (NumeralValue 4)
+             [ "నాలుగు"
+             ]
+  , examples (NumeralValue 5)
+             [ "ఐదు"
+             ]
+  , examples (NumeralValue 6)
+             [ "ఆరు"
+             ]
+  , examples (NumeralValue 7)
+             [ "ఏడు"
+             ]
+  , examples (NumeralValue 8)
+             [ "ఎనిమిది"
+             ]
+  , examples (NumeralValue 9)
+             [ "తొమ్మిది"
+             ]
+  , examples (NumeralValue 10)
+             [ "పది"
+             ]
+  , examples (NumeralValue 11)
+             [ "పదకొండు"
+             ]
+  , examples (NumeralValue 12)
+             [ "పన్నెండు"
+             ]
+  , examples (NumeralValue 13)
+             [ "పదమూడు"
+             ]
+  , examples (NumeralValue 14)
+             [ "పద్నాల్గు"
+             ]
+  , examples (NumeralValue 15)
+             [ "పదిహేను"
+             ]
+  , examples (NumeralValue 16)
+             [ "పదహారు"
+             ]
+  , examples (NumeralValue 17)
+             [ "పదిహేడు"
+             ]
+  , examples (NumeralValue 18)
+             [ "పద్దెనిమిది"
+             ]
+  , examples (NumeralValue 19)
+             [ "పంతొమ్మిది"
+             ]
+  , examples (NumeralValue 20)
+             [ "ఇరవై"
+             ]
+  , examples (NumeralValue 30)
+             [ "ముప్పై"
+             ]
+   , examples (NumeralValue 40)
+             [ "నలబై"
+             ]
+  , examples (NumeralValue 50)
+             [ "యాబై"
+             ]
+  , examples (NumeralValue 60)
+             [ "అరవై"
+             ]
+  , examples (NumeralValue 70)
+             [ "డెబ్బై"
+             ]
+  , examples (NumeralValue 80)
+             [ "ఎనబై"
+             ]
+  , examples (NumeralValue 90)
+             [ "తొంబై"
+             ]
+  , examples (NumeralValue 100)
+             [ "వంద"
+             ]
+  , examples (NumeralValue 1000)
+             [ "వెయ్యి"
+             ]
+  , examples (NumeralValue 100000)
+             [ "లక్ష"
+             ]
+  , examples (NumeralValue 10000000)
+             [ "కోటి"
+             ]
+  ]
diff --git a/Duckling/Numeral/TE/Rules.hs b/Duckling/Numeral/TE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/TE/Rules.hs
@@ -0,0 +1,161 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.TE.Rules
+  ( rules
+  ) where
+
+import Data.HashMap.Strict (HashMap)
+import Data.Maybe
+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.Regex.Types
+import Duckling.Types
+
+teluguMap :: HashMap Char Char
+teluguMap = HashMap.fromList
+  [ ( '౦', '0' )
+  , ( '౧', '1' )
+  , ( '౨', '2' )
+  , ( '౩', '3' )
+  , ( '౪', '4' )
+  , ( '౫', '5' )
+  , ( '౬', '6' )
+  , ( '౭', '7' )
+  , ( '౮', '8' )
+  , ( '౯', '9' )
+  ]
+
+teluguToArab :: Char -> Char
+teluguToArab c = HashMap.lookupDefault c c teluguMap
+
+ruleTelugu :: Rule
+ruleTelugu = Rule
+  { name = "telugu forms"
+  , pattern =
+    [ regex "([౦౧౨౩౪౫౬౭౮౯]{1,18})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        toInteger <$> parseInt (Text.map teluguToArab match) >>= integer
+      _ -> Nothing
+  }
+
+zeroToNineMap :: HashMap Text Integer
+zeroToNineMap = HashMap.fromList
+  [ ( "సున్న", 0 )
+  , ( "ఒకటి", 1 )
+  , ( "రెండు", 2 )
+  , ( "మూడు", 3 )
+  , ( "నాలుగు", 4 )
+  , ( "ఐదు", 5 )
+  , ( "ఆరు", 6 )
+  , ( "ఏడు", 7 )
+  , ( "ఎనిమిది", 8 )
+  , ( "తొమ్మిది", 9 )
+  ]
+
+ruleZeroToNine :: Rule
+ruleZeroToNine = Rule
+  { name = "integer (0..9)"
+  , pattern =
+    [ regex "(సున్న|ఒకటి|రెండు|మూడు|నాలుగు|ఐదు|ఆరు|ఏడు|ఎనిమిది|తొమ్మిది)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroToNineMap >>= integer
+      _ -> Nothing
+  }
+
+tenToNineteenMap :: HashMap Text Integer
+tenToNineteenMap = HashMap.fromList
+  [ ( "పది", 10 )
+  , ( "పదకొండు", 11 )
+  , ( "పన్నెండు", 12 )
+  , ( "పదమూడు", 13 )
+  , ( "పద్నాల్గు", 14 )
+  , ( "పదిహేను", 15 )
+  , ( "పదహారు", 16 )
+  , ( "పదిహేడు", 17 )
+  , ( "పద్దెనిమిది", 18 )
+  , ( "పంతొమ్మిది", 19 )
+  ]
+
+ruleTenToNineteen :: Rule
+ruleTenToNineteen = Rule
+  { name = "integer (10..19)"
+  , pattern =
+    [ regex "(పదకొండు|పన్నెండు|పదమూడు|పద్నాల్గు|పదిహేను|పదహారు|పదిహేడు|పద్దెనిమిది|పంతొమ్మిది|పది)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "ఇరవై", 20 )
+  , ( "ముప్పై", 30 )
+  , ( "నలబై", 40 )
+  , ( "యాబై", 50 )
+  , ( "అరవై", 60 )
+  , ( "డెబ్బై", 70 )
+  , ( "ఎనబై", 80 )
+  , ( "తొంబై", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(ఇరవై|ముప్పై|నలబై|యాబై|అరవై|డెబ్బై|ఎనబై|తొంబై)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup match tensMap >>= integer
+      _ -> Nothing
+  }
+
+hundredsMap :: HashMap Text Integer
+hundredsMap = HashMap.fromList
+  [ ( "వంద", 100 )
+  , ( "వెయ్యి", 1000 )
+  , ( "లక్ష", 100000 )
+  , ( "కోటి", 10000000 )
+  ]
+
+rulehundreds :: Rule
+rulehundreds = Rule
+  { name = "integer (100,1000,100000,10000000)"
+  , pattern =
+    [ regex "(వంద|వెయ్యి|లక్ష|కోటి)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) hundredsMap >>= integer
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleTelugu
+  , ruleZeroToNine
+  , ruleTenToNineteen
+  , ruleTens
+  , rulehundreds
+  ]
diff --git a/Duckling/Numeral/TH/Corpus.hs b/Duckling/Numeral/TH/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/TH/Corpus.hs
@@ -0,0 +1,153 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.TH.Corpus
+  ( corpus ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Locale
+import Duckling.Numeral.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale TH Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [
+    examples (NumeralValue 0)
+             [ "0"
+             , "ไม่มี"
+             , "ศูนย์"
+             ]
+   ,examples (NumeralValue 1)
+             [ "1"
+             , "หนึ่ง"
+             ]
+  , examples (NumeralValue 2)
+             [ "2"
+             , "สอง"
+             ]
+  , examples (NumeralValue 3)
+             [ "3"
+             , "สาม"
+             ]
+  , examples (NumeralValue 10)
+             [ "10"
+             , "สิบ"
+             ]
+  , examples (NumeralValue 12)
+             [ "12"
+             , "สิบสอง"
+             , "โหล"
+             ]
+  , examples (NumeralValue 14)
+             [ "14"
+             , "สิบสี่"
+             ]
+  , examples (NumeralValue 16)
+             [ "16"
+             , "สิบหก"
+             ]
+  , examples (NumeralValue 17)
+             [ "17"
+             , "สิบเจ็ด"
+             ]
+  , examples (NumeralValue 18)
+             [ "18"
+             , "สิบแปด"
+             ]
+  , examples (NumeralValue 33)
+             [ "33"
+             , "0033"
+             ]
+  , examples (NumeralValue 24)
+             [ "24"
+             , "สองโหล"
+             ]
+  , examples (NumeralValue 1.1)
+             [ "1.1"
+             , "1.10"
+             , "01.10"
+             , "1 จุด 1"
+             , "หนึ่งจุดหนึ่ง"
+             ]
+  , examples (NumeralValue 0.77)
+             [ ".77"
+             , "0.77"
+             , "จุด 77"
+             ]
+  , examples (NumeralValue 100000)
+             [ "100,000"
+             , "100,000.0"
+             , "100000"
+             , "หนึ่งแสน"
+             ]
+  , examples (NumeralValue 0.2)
+             [ "1/5"
+             , "2/10"
+             , "3/15"
+             , "20/100"
+             , "ศูนย์จุดสอง"
+             ]
+  , examples (NumeralValue 3e6)
+             [ "3000000"
+             , "3,000,000"
+             , "3 ล้าน"
+             , "สามล้าน"
+             ]
+  , examples (NumeralValue 1.2e6)
+             [ "1,200,000"
+             , "1200000"
+             , "1.2 ล้าน"
+             , "หนึ่งจุดสองล้าน"
+             ]
+  , examples (NumeralValue 5000)
+             [ "ห้าพัน"
+             ]
+  , examples (NumeralValue (-504))
+             [ "-504"
+             ]
+  , examples (NumeralValue (-1.2e6))
+             [ "- 1,200,000"
+             , "-1200000"
+             , "ลบ 1,200,000"
+             ]
+  , examples (NumeralValue 122)
+             [ "หนึ่งร้อยยี่สิบสอง"
+             ]
+  , examples (NumeralValue 2e5)
+             [ "สองแสน"
+             ]
+  , examples (NumeralValue 21011)
+             [ "สองหมื่นหนึ่งพันสิบเอ็ด"
+             , "สองหมื่นหนึ่งพันสิบหนึ่ง"
+             ]
+  , examples (NumeralValue 721012)
+             [ "เจ็ดแสนสองหมื่นหนึ่งพันสิบสอง"
+             ]
+  , examples (NumeralValue 31256721)
+             [ "สามสิบเอ็ดล้านสองแสนห้าหมื่นหกพันเจ็ดร้อยยี่สิบเอ็ด"
+             , "สามสิบหนึ่งล้านสองแสนห้าหมื่นหกพันเจ็ดร้อยยี่สิบหนึ่ง"
+             ]
+  , examples (NumeralValue 2400)
+             [ "สองร้อยโหล"
+             , "200 โหล"
+             ]
+  , examples (NumeralValue 2200000)
+             [ "สองจุดสองล้าน"
+             , "สองล้านสองแสน"
+             ]
+  , examples (NumeralValue 3000000000)
+             [ "สามพันล้าน"
+             ]
+  ]
diff --git a/Duckling/Numeral/TH/Rules.hs b/Duckling/Numeral/TH/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/TH/Rules.hs
@@ -0,0 +1,460 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Numeral.TH.Rules
+  ( rules
+  ) where
+
+import Control.Applicative ((<|>))
+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
+
+ruleDozen :: Rule
+ruleDozen = Rule
+  { name = "a dozen of"
+  , pattern =
+    [ regex "โหล?( ของ)?"
+    ]
+  , prod = \_ -> integer 12 >>= withMultipliable >>= notOkForAnyTime
+  }
+
+zeroNineteenMap :: HashMap Text Integer
+zeroNineteenMap = HashMap.fromList
+  [ ( "ไม่มี", 0 )
+  , ( "ศูนย์", 0 )
+  , ( "หนึ่ง", 1 )
+  , ( "เอ็ด", 1 )
+  , ( "สอง", 2 )
+  , ( "สาม", 3 )
+  , ( "สี่", 4 )
+  , ( "ห้า", 5 )
+  , ( "หก", 6 )
+  , ( "เจ็ด", 7 )
+  , ( "แปด", 8 )
+  , ( "เก้า", 9 )
+  , ( "สิบ", 10 )
+  , ( "สิบเอ็ด", 11 )
+  , ( "สิบหนึ่ง", 11 )
+  , ( "สิบสอง", 12 )
+  , ( "สิบสาม", 13 )
+  , ( "สิบสี่", 14 )
+  , ( "สิบห้า", 15 )
+  , ( "สิบหก", 16 )
+  , ( "สิบเจ็ด", 17 )
+  , ( "สิบแปด", 18 )
+  , ( "สิบเก้า", 19 )
+  ]
+
+informalMap :: HashMap Text Integer
+informalMap = HashMap.fromList
+  [ ( "อันนึง", 1 )
+  , ( "คู่นึง", 2 )
+  , ( "คู่ของ", 2 )
+  ]
+
+ruleToNineteen :: Rule
+ruleToNineteen = Rule
+  { name = "integer (0..19)"
+  -- e.g. fourteen must be before four, otherwise four will always shadow fourteen
+  , pattern =
+    [ regex "(ไม่มี|ศูนย์|สิบหนึ่ง|หนึ่ง|(คู่)s?( ของ)?|(คู่)s?( นึง)?|สิบเอ็ด|เอ็ด|สิบสอง|สิบสาม|สิบสี่|สิบห้า|สิบหก|สิบเจ็ด|สิบแปด|สิบเก้า|สอง|สาม|สี่|ห้า|หก|เจ็ด|แปด|เก้า|สิบ)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        let x = Text.toLower match in
+        (HashMap.lookup x zeroNineteenMap >>= integer) <|>
+        (HashMap.lookup x informalMap >>= integer >>= notOkForAnyTime)
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "ยี่สิบ", 20 )
+  , ( "สามสิบ", 30 )
+  , ( "สี่สิบ", 40 )
+  , ( "ห้าสิบ", 50 )
+  , ( "หกสิบ", 60 )
+  , ( "เจ็ดสิบ", 70 )
+  , ( "แปดสิบ", 80 )
+  , ( "เก้าสิบ", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = singleStringLookupRule tensMap "integer (20..90)" integer
+
+digitsHundredTwentyToTwentyNineMap :: HashMap Text Integer
+digitsHundredTwentyToTwentyNineMap = HashMap.fromList
+  [ ( "ร้อยยี่สิบ", 120 )
+  , ( "ร้อยยี่สิบเอ็ด", 121 )
+  , ( "ร้อยยี่สิบหนึ่ง", 121 )
+  , ( "ร้อยยี่สิบสอง", 122 )
+  , ( "ร้อยยี่สิบสาม", 123 )
+  , ( "ร้อยยี่สิบสี่", 124 )
+  , ( "ร้อยยี่สิบห้า", 125 )
+  , ( "ร้อยยี่สิบหก", 126 )
+  , ( "ร้อยยี่สิบเจ็ด", 127 )
+  , ( "ร้อยยี่สิบแปด", 128 )
+  , ( "ร้อยยี่สิบเก้า", 129 )
+  , ( "หนึ่งร้อยยี่สิบ", 120 )
+  , ( "หนึ่งร้อยยี่สิบเอ็ด", 121 )
+  , ( "หนึ่งร้อยยี่สิบหนึ่ง", 121 )
+  , ( "หนึ่งร้อยยี่สิบสอง", 122 )
+  , ( "หนึ่งร้อยยี่สิบสาม", 123 )
+  , ( "หนึ่งร้อยยี่สิบสี่", 124 )
+  , ( "หนึ่งร้อยยี่สิบห้า", 125 )
+  , ( "หนึ่งร้อยยี่สิบหก", 126 )
+  , ( "หนึ่งร้อยยี่สิบเจ็ด", 127 )
+  , ( "หนึ่งร้อยยี่สิบแปด", 128 )
+  , ( "หนึ่งร้อยยี่สิบเก้า", 129 )
+  , ( "สองร้อยยี่สิบ", 220 )
+  , ( "สองร้อยยี่สิบเอ็ด", 221 )
+  , ( "สองร้อยยี่สิบหนึ่ง", 221 )
+  , ( "สองร้อยยี่สิบสอง", 222 )
+  , ( "สองร้อยยี่สิบสาม", 223 )
+  , ( "สองร้อยยี่สิบสี่", 224 )
+  , ( "สองร้อยยี่สิบห้า", 225 )
+  , ( "สองร้อยยี่สิบหก", 226 )
+  , ( "สองร้อยยี่สิบเจ็ด", 227 )
+  , ( "สองร้อยยี่สิบแปด", 228 )
+  , ( "สองร้อยยี่สิบเก้า", 229 )
+  , ( "สามร้อยยี่สิบ", 320 )
+  , ( "สามร้อยยี่สิบเอ็ด", 321 )
+  , ( "สามร้อยยี่สิบหนึ่ง", 321 )
+  , ( "สามร้อยยี่สิบสอง", 322 )
+  , ( "สามร้อยยี่สิบสาม", 323 )
+  , ( "สามร้อยยี่สิบสี่", 324 )
+  , ( "สามร้อยยี่สิบห้า", 325 )
+  , ( "สามร้อยยี่สิบหก", 326 )
+  , ( "สามร้อยยี่สิบเจ็ด", 327 )
+  , ( "สามร้อยยี่สิบแปด", 328 )
+  , ( "สามร้อยยี่สิบเก้า", 329 )
+  , ( "สี่ร้อยยี่สิบ", 420 )
+  , ( "สี่ร้อยยี่สิบเอ็ด", 421 )
+  , ( "สี่ร้อยยี่สิบหนึ่ง", 421 )
+  , ( "สี่ร้อยยี่สิบสอง", 422 )
+  , ( "สี่ร้อยยี่สิบสาม", 423 )
+  , ( "สี่ร้อยยี่สิบสี่", 424 )
+  , ( "สี่ร้อยยี่สิบห้า", 425 )
+  , ( "สี่ร้อยยี่สิบหก", 426 )
+  , ( "สี่ร้อยยี่สิบเจ็ด", 427 )
+  , ( "สี่ร้อยยี่สิบแปด", 428 )
+  , ( "สี่ร้อยยี่สิบเก้า", 429 )
+  , ( "ห้าร้อยยี่สิบ", 520 )
+  , ( "ห้าร้อยยี่สิบเอ็ด", 521 )
+  , ( "ห้าร้อยยี่สิบหนึ่ง", 521 )
+  , ( "ห้าร้อยยี่สิบสอง", 522 )
+  , ( "ห้าร้อยยี่สิบสาม", 523 )
+  , ( "ห้าร้อยยี่สิบสี่", 524 )
+  , ( "ห้าร้อยยี่สิบห้า", 525 )
+  , ( "ห้าร้อยยี่สิบหก", 526 )
+  , ( "ห้าร้อยยี่สิบเจ็ด", 527 )
+  , ( "ห้าร้อยยี่สิบแปด", 528 )
+  , ( "ห้าร้อยยี่สิบเก้า", 529 )
+  , ( "หกร้อยยี่สิบ", 620 )
+  , ( "หกร้อยยี่สิบเอ็ด", 621 )
+  , ( "หกร้อยยี่สิบหนึ่ง", 621 )
+  , ( "หกร้อยยี่สิบสอง", 622 )
+  , ( "หกร้อยยี่สิบสาม", 623 )
+  , ( "หกร้อยยี่สิบสี่", 624 )
+  , ( "หกร้อยยี่สิบห้า", 625 )
+  , ( "หกร้อยยี่สิบหก", 626 )
+  , ( "หกร้อยยี่สิบเจ็ด", 627 )
+  , ( "หกร้อยยี่สิบแปด", 628 )
+  , ( "หกร้อยยี่สิบเก้า", 629 )
+  , ( "เจ็ดร้อยยี่สิบ", 720 )
+  , ( "เจ็ดร้อยยี่สิบเอ็ด", 721 )
+  , ( "เจ็ดร้อยยี่สิบหนึ่ง", 721 )
+  , ( "เจ็ดร้อยยี่สิบสอง", 722 )
+  , ( "เจ็ดร้อยยี่สิบสาม", 723 )
+  , ( "เจ็ดร้อยยี่สิบสี่", 724 )
+  , ( "เจ็ดร้อยยี่สิบห้า", 725 )
+  , ( "เจ็ดร้อยยี่สิบหก", 726 )
+  , ( "เจ็ดร้อยยี่สิบเจ็ด", 727 )
+  , ( "เจ็ดร้อยยี่สิบแปด", 728 )
+  , ( "เจ็ดร้อยยี่สิบเก้า", 729 )
+  , ( "แปดร้อยยี่สิบ", 820 )
+  , ( "แปดร้อยยี่สิบเอ็ด", 821 )
+  , ( "แปดร้อยยี่สิบหนึ่ง", 821 )
+  , ( "แปดร้อยยี่สิบสอง", 822 )
+  , ( "แปดร้อยยี่สิบสาม", 823 )
+  , ( "แปดร้อยยี่สิบสี่", 824 )
+  , ( "แปดร้อยยี่สิบห้า", 825 )
+  , ( "แปดร้อยยี่สิบหก", 826 )
+  , ( "แปดร้อยยี่สิบเจ็ด", 827 )
+  , ( "แปดร้อยยี่สิบแปด", 828 )
+  , ( "แปดร้อยยี่สิบเก้า", 829 )
+  , ( "เก้าร้อยยี่สิบ", 920 )
+  , ( "เก้าร้อยยี่สิบเอ็ด", 921 )
+  , ( "เก้าร้อยยี่สิบหนึ่ง", 921 )
+  , ( "เก้าร้อยยี่สิบสอง", 922 )
+  , ( "เก้าร้อยยี่สิบสาม", 923 )
+  , ( "เก้าร้อยยี่สิบสี่", 924 )
+  , ( "เก้าร้อยยี่สิบห้า", 925 )
+  , ( "เก้าร้อยยี่สิบหก", 926 )
+  , ( "เก้าร้อยยี่สิบเจ็ด", 927 )
+  , ( "เก้าร้อยยี่สิบแปด", 928 )
+  , ( "เก้าร้อยยี่สิบเก้า", 929 )
+  ]
+
+ruleXHundredTwentyToXHundredTwentyNine :: Rule
+ruleXHundredTwentyToXHundredTwentyNine = singleStringLookupRule
+  digitsHundredTwentyToTwentyNineMap "integer (x20,x21,...,x29)" integer
+
+rulePowersOfTen :: Rule
+rulePowersOfTen = Rule
+  { name = "powers of tens"
+  , pattern = [regex "(ร้อย|พัน|หมื่น|แสน|ล้าน|สิบล้าน|ร้อยล้าน|พันล้าน)"]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match : _)) : _) ->
+        case Text.toLower match of
+          "ร้อย" -> double 1e2 >>= withGrain 2 >>= withMultipliable
+          "พัน" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+          "หมื่น" -> double 1e4 >>= withGrain 4 >>= withMultipliable
+          "แสน" -> double 1e5 >>= withGrain 5 >>= withMultipliable
+          "ล้าน" -> double 1e6 >>= withGrain 6 >>= withMultipliable
+          "สิบล้าน" -> double 1e7 >>= withGrain 7 >>= withMultipliable
+          "ร้อยล้าน" -> double 1e8 >>= withGrain 8 >>= withMultipliable
+          "พันล้าน" -> double 1e9 >>= withGrain 9 >>= withMultipliable
+          _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer 21..99"
+  , pattern =
+    [ oneOf [20,30..90]
+    , regex "[\\s\\-]+"
+    , numberBetween 1 10
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = tens}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
+ruleSumTenDigits :: Rule
+ruleSumTenDigits = Rule
+  { name = "สามสิบสี่"
+  , pattern =
+    [ regex "(ยี่สิบ|สามสิบ|สี่สิบ|ห้าสิบ|หกสิบ|เจ็ดสิบ|แปดสิบ|เก้าสิบ)"
+    , regex "(หนึ่ง|เอ็ด|สอง|สาม|สี่|ห้า|หก|เจ็ด|แปด|เก้า|สิบ)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:_)):
+       Token RegexMatch (GroupMatch (m2:_)):
+       _) -> do
+       let x1 = Text.toLower m1
+       let x2 = Text.toLower m2
+       hundreds <- HashMap.lookup x1 tensMap
+       rest <- HashMap.lookup x2 zeroNineteenMap
+       integer (hundreds + rest)
+      _ -> Nothing
+  }
+
+ruleSkipHundreds1 :: Rule
+ruleSkipHundreds1 = Rule
+  { name = "one eleven"
+  , pattern =
+    [ regex "(หนึ่ง|สอง|สาม|สี่|ห้า|หก|เจ็ด|แปด|เก้า)"
+    , regex "(สิบ|สิบเอ็ด|สิบสอง|สิบสาม|สิบสี่|สิบห้า|สิบหก|สิบเจ็ด|สิบแปด|สิบเก้า|ยี่สิบ|สามสิบ|สี่สิบ|ห้าสิบ|หกสิบ|เจ็ดสิบ|แปดสิบ|เก้าสิบ)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:_)):
+       Token RegexMatch (GroupMatch (m2:_)):
+       _) -> do
+       let x1 = Text.toLower m1
+       let x2 = Text.toLower m2
+       hundreds <- HashMap.lookup x1 zeroNineteenMap
+       rest <- HashMap.lookup x2 zeroNineteenMap <|> HashMap.lookup x2 tensMap
+       integer (hundreds * 100 + rest)
+      _ -> Nothing
+  }
+
+ruleSkipHundreds2 :: Rule
+ruleSkipHundreds2 = Rule
+  { name = "one twenty two"
+  , pattern =
+    [ regex "(หนึ่ง|สอง|สาม|สี่|ห้า|หก|เจ็ด|แปด|เก้า)"
+    , regex "(ยี่สิบ|สามสิบ|สี่สิบ|ห้าสิบ|หกสิบ|เจ็ดสิบ|แปดสิบ|เก้าสิบ)"
+    , regex "(หนึ่ง|สอง|สาม|สี่|ห้า|หก|เจ็ด|แปด|เก้า)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:_)):
+       Token RegexMatch (GroupMatch (m2:_)):
+       Token RegexMatch (GroupMatch (m3:_)):
+       _) -> do
+       let x1 = Text.toLower m1
+       let x2 = Text.toLower m2
+       let x3 = Text.toLower m3
+       hundreds <- HashMap.lookup x1 zeroNineteenMap
+       tens <- HashMap.lookup x2 tensMap
+       rest <- HashMap.lookup x3 zeroNineteenMap
+       integer (hundreds * 100 + tens + rest)
+      _ -> Nothing
+  }
+
+ruleDotSpelledOut :: Rule
+ruleDotSpelledOut = Rule
+  { name = "one point 2"
+  , pattern =
+    [ dimension Numeral
+    , regex "จุด"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \case
+      (Token Numeral nd1:_:Token Numeral nd2:_) ->
+        double $ TNumeral.value nd1 + decimalsToDouble (TNumeral.value nd2)
+      _ -> Nothing
+  }
+
+ruleLeadingDotSpelledOut :: Rule
+ruleLeadingDotSpelledOut = Rule
+  { name = "point 77"
+  , pattern =
+    [ regex "จุด"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \case
+      (_:Token Numeral nd:_) -> double $ decimalsToDouble $ TNumeral.value nd
+      _ -> Nothing
+  }
+
+ruleDecimals :: Rule
+ruleDecimals = Rule
+  { name = "decimal number"
+  , pattern =
+    [ regex "(\\d*\\.\\d+)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal True match
+      _ -> Nothing
+  }
+
+ruleCommas :: Rule
+ruleCommas = Rule
+  { name = "comma-separated numbers"
+  , pattern =
+    [ regex "(\\d+(,\\d\\d\\d)+(\\.\\d+)?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseDouble (Text.replace "," Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+ruleSuffixes :: Rule
+ruleSuffixes = Rule
+  { name = "suffixes (กิโลกรัม,กรัม))"
+  , pattern =
+    [ dimension Numeral
+    , regex "(กิโลกรัม|กรัม)(?=[\\W$€¢£]|$)"
+    ]
+  , prod = \case
+      (Token Numeral nd : Token RegexMatch (GroupMatch (match : _)):_) -> do
+        x <- case Text.toLower match of
+          "กิโลกรัม" -> Just 1e3
+          "กรัม" -> Just 1e1
+          _ -> Nothing
+        double $ TNumeral.value nd * x
+      _ -> Nothing
+  }
+
+ruleNegative :: Rule
+ruleNegative = Rule
+  { name = "negative numbers"
+  , pattern =
+    [ regex "(-|ลบ)(?!\\s*-)"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (_:Token Numeral nd:_) -> double (TNumeral.value nd * (-1))
+      _ -> Nothing
+  }
+
+ruleSum :: Rule
+ruleSum = Rule
+  { name = "intersect 2 numbers"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleSumAnd :: Rule
+ruleSumAnd = Rule
+  { name = "intersect 2 numbers (with and)"
+  , pattern =
+    [ Predicate $ and . sequence [hasGrain, isPositive]
+    , regex "และ"
+    , Predicate $ and . sequence [not . isMultipliable, isPositive]
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = val1, TNumeral.grain = Just g}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = val2}:
+       _) | (10 ** fromIntegral g) > val2 -> double $ val1 + val2
+      _ -> Nothing
+  }
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isMultipliable
+    ]
+  , prod = \case
+      (token1:token2:_) -> multiply token1 token2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleXHundredTwentyToXHundredTwentyNine
+  , ruleSkipHundreds1
+  , ruleSkipHundreds2
+  , ruleToNineteen
+  , ruleTens
+  , rulePowersOfTen
+  , ruleCompositeTens
+  , ruleSumTenDigits
+  , ruleDotSpelledOut
+  , ruleLeadingDotSpelledOut
+  , ruleDecimals
+  , ruleCommas
+  , ruleSuffixes
+  , ruleNegative
+  , ruleSum
+  , ruleSumAnd
+  , ruleMultiply
+  , ruleDozen
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -153,7 +152,7 @@
 ruleNumeralSuffixesHalfsuffixText = Rule
   { name = "number suffixes (half-suffix text) (1..9)"
   , pattern =
-    [ regex "((bir?|iki|üç|dört|beş|altı|yedi|sekiz|dokuz)(buçuk))"
+    [ regex "((bir?|iki|üçü?|dört|beş|altı|yedi|sekiz|dokuz)(buçuk))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -515,7 +514,7 @@
 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ırk|elli|atmış|altmış|yetmiş|seksen|doksan)(bir|bi|iki|üç|dört|beş|altı|yedi|sekiz|dokuz)(buçuk))"
+    [ 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:_)):_) ->
@@ -543,6 +542,7 @@
   , ( "tek", 1)
   , ( "iki", 2)
   , ( "üç", 3)
+  , ( "üçü", 3)
   , ( "dört", 4)
   , ( "beş", 5)
   , ( "altı", 6)
@@ -555,7 +555,7 @@
 ruleInteger = Rule
   { name = "integer (0..9)"
   , pattern =
-    [ regex "(yok|hi(ç)|s(ı)f(ı)r|bir?|[ty]ek|iki|(ü)(ç)|d(ö)rt|be(ş)|alt(ı)|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:_)):_) ->
diff --git a/Duckling/Numeral/Types.hs b/Duckling/Numeral/Types.hs
--- a/Duckling/Numeral/Types.hs
+++ b/Duckling/Numeral/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -58,7 +57,7 @@
              ]
   , examples (NumeralValue 100)
             [ "100"
-            , "tră"
+            , "trăm"
             ]
   , examples (NumeralValue 1.1)
              [ "1,1"
@@ -96,15 +95,22 @@
              , "-1200K"
              , "-,0012G"
              ]
+  , examples (NumeralValue 20)
+             [ "hai chục"
+             , "hai mươi"
+             ]
   , examples (NumeralValue 5000)
              [ "5 nghìn"
              , "năm nghìn"
+             , "năm ngàn"
              ]
   , examples (NumeralValue 200000)
              [ "hai trăm nghìn"
+             , "hai trăm ngàn"
              ]
   , examples (NumeralValue 1000000000)
              [ "một tỷ"
+             , "một tỉ"
              ]
   , examples (NumeralValue 21011)
              [ "hai mươi mốt nghìn không trăm mười một"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -28,21 +27,20 @@
 
 powersOfTenMap :: HashMap.HashMap Text.Text (Double, Int)
 powersOfTenMap = HashMap.fromList
-  [ ( "tră",   (1e2, 2) )
+  [ ( "chục",  (1e1, 1) )
   , ( "trăm",  (1e2, 2) )
-  , ( "nghì",  (1e3, 3) )
   , ( "nghìn", (1e3, 3) )
-  , ( "triệ",  (1e6, 6) )
+  , ( "ngàn",  (1e3, 3) )
   , ( "triệu", (1e6, 6) )
-  , ( "t",     (1e9, 9) )
   , ( "tỷ",    (1e9, 9) )
+  , ( "tỉ",    (1e9, 9) )
   ]
 
 rulePowersOfTen :: Rule
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(trăm?|nghìn?|triệu?|tỷ?)"
+    [ regex "(chục|trăm|nghìn|ngàn|triệu|t(ỷ|ỉ))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -36,67 +35,97 @@
              , "一"
              , "一个"
              , "1个"
+             , "壹"
              ]
   , examples (NumeralValue 2)
              [ "2"
              , "二個"
              , "二个"
+             , "貳"
+             , "一對"
+             , "一雙"
              ]
   , examples (NumeralValue 10)
              [ "10"
              , "十"
+             , "拾"
+             , "五對"
+             , "五雙"
              ]
   , examples (NumeralValue 11)
              [ "11"
              , "十一"
+             , "拾壹"
              ]
   , examples (NumeralValue 20)
              [ "20"
              , "二十"
+             , "貳拾"
+             , "廿"
              ]
   , examples (NumeralValue 60)
              [ "60"
              , "六十"
+             , "陸拾"
+             , "五打"
              ]
   , examples (NumeralValue 33)
              [ "33"
              , "三十三"
+             , "參拾參"
+             , "卅三"
              ]
   , examples (NumeralValue 96)
              [ "96"
              , "九十六"
+             , "玖拾陸"
+             , "八打"
              ]
   , examples (NumeralValue 203)
              [ "203"
              , "二百零三"
+             , "貳佰零參"
              ]
   , examples (NumeralValue 534)
              [ "534"
              , "五百三十四"
+             , "伍佰參拾肆"
+             , "五百卅四"
              ]
   , examples (NumeralValue 34567)
              [ "34567"
              , "34,567"
              , "三万四千五百六十七"
+             , "三萬四千五百六十七"
+             , "參萬肆仟伍佰陸拾柒"
              ]
   , examples (NumeralValue 10040)
              [ "10040"
              , "10,040"
              , "一万零四十"
+             , "一萬零四十"
+             , "壹萬零肆拾"
+             , "一萬零卌"
              ]
   , examples (NumeralValue 1.1)
              [ "1.1"
              , "1.10"
              , "01.10"
+             , "一點一"
+             , "十份十一"
+             , "一又十分一"
              ]
   , examples (NumeralValue 0.77)
              [ "0.77"
              , ".77"
+             , "零點77"
              ]
   , examples (NumeralValue 34507)
              [ "34507"
              , "34,507"
              , "三万四千五百零七"
+             , "三萬四千五百零七"
+             , "參萬肆仟伍佰零柒"
              ]
   , examples (NumeralValue 100000)
              [ "100,000"
@@ -104,18 +133,24 @@
              , "100K"
              , "100k"
              , "十万"
+             , "十萬"
+             , "拾萬"
              ]
   , examples (NumeralValue 3000000)
              [ "3M"
              , "3000000"
              , "3,000,000"
              , "三百万"
+             , "三百萬"
+             , "參佰萬"
              ]
   , examples (NumeralValue 1040000)
              [ "1,040,000"
              , "1040000"
              , "1.04M"
              , "一百零四万"
+             , "一百零四萬"
+             , "壹佰零肆萬"
              ]
   , examples (NumeralValue 1200000)
              [ "1,200,000"
@@ -123,6 +158,9 @@
              , "1.2M"
              , ".0012G"
              , "一百二十万"
+             , "一百二十萬"
+             , "壹佰貳拾萬"
+             , "百二萬"
              ]
   , examples (NumeralValue (-1200000))
              [ "- 1,200,000"
@@ -136,5 +174,25 @@
              , "-1200K"
              , "-.0012G"
              , "负一百二十万"
+             , "負一百二十萬"
+             , "負壹佰貳拾萬"
+             ]
+    , examples (NumeralValue 0.5)
+             [ "0.5"
+             , "一半"
+             , "一半半"
+             , "1半"
+             , "半个"
+             , "半個"
+             , "零點五"
+             , "二分之一"
+             , "二份一"
+             ]
+    , examples (NumeralValue 1100)
+             [ "千一"
+             , "一千一百"
+             ]
+    , examples (NumeralValue 19000)
+             [ "萬九"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -32,7 +31,7 @@
 ruleInteger = Rule
   { name = "integer (0..10)"
   , pattern =
-    [ regex "(〇|零|一|二|两|兩|三|四|五|六|七|八|九|十)"
+    [ regex "(〇|零|一|二|两|兩|三|四|五|六|七|八|九|十|壹|貳|參|肆|伍|陸|柒|捌|玖|拾)"
     ]
   , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -45,20 +44,64 @@
   [ ( "〇", 0 )
   , ( "零", 0 )
   , ( "一", 1 )
+  , ( "壹", 1 )
   , ( "兩", 2 )
   , ( "两", 2 )
   , ( "二", 2 )
+  , ( "貳", 2 )
   , ( "三", 3 )
+  , ( "參", 3 )
   , ( "四", 4 )
+  , ( "肆", 4 )
   , ( "五", 5 )
+  , ( "伍", 5 )
   , ( "六", 6 )
+  , ( "陸", 6 )
   , ( "七", 7 )
+  , ( "柒", 7 )
   , ( "八", 8 )
+  , ( "捌", 8 )
   , ( "九", 9 )
+  , ( "玖", 9 )
   , ( "十", 10 )
+  , ( "拾", 10 )
   ]
 
+tensMap :: HashMap.HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "廿" , 20 )
+  , ( "卅" , 30 )
+  , ( "卌" , 40 )
+  ]
 
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20,30,40)"
+  , pattern =
+    [ regex "(廿|卅|卌)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer 21..49"
+  , pattern =
+    [ oneOf [20,30,40]
+    , regex "[\\s\\-]+"
+    , numberBetween 1 10
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = tens}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = units}:
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
 ruleNumeralsPrefixWithNegativeOrMinus :: Rule
 ruleNumeralsPrefixWithNegativeOrMinus = Rule
   { name = "numbers prefix with -, negative or minus"
@@ -94,6 +137,56 @@
       _ -> Nothing
   }
 
+ruleDotSpelledOut :: Rule
+ruleDotSpelledOut = Rule
+  { name = "one point 2"
+  , pattern =
+    [ dimension Numeral
+    , regex "點"
+    , Predicate $ not . hasGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral nd1:_:Token Numeral nd2:_) ->
+        double $ TNumeral.value nd1 + decimalsToDouble (TNumeral.value nd2)
+      _ -> Nothing
+  }
+
+ruleFraction :: Rule
+ruleFraction = Rule
+  { name = "fraction"
+  , pattern =
+    [ dimension Numeral
+    , regex "分之|分|份"
+    , dimension Numeral
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _) -> double $ v2 / v1
+      _ -> Nothing
+  }
+
+ruleMixedFraction :: Rule
+ruleMixedFraction = Rule
+  { name = " mixed fraction"
+  , pattern =
+    [ dimension Numeral
+    , regex "又"
+    , dimension Numeral
+    , regex "分之|分|份"
+    , dimension Numeral
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v2}:
+       _:
+       Token Numeral NumeralData{TNumeral.value = v3}:
+       _) -> double $ v3 / v2 + v1
+      _ -> Nothing
+  }
+
 ruleNumeral :: Rule
 ruleNumeral = Rule
   { name = "<number>个/個"
@@ -106,16 +199,45 @@
       _ -> Nothing
   }
 
+ruleHalf :: Rule
+ruleHalf = Rule
+  { name = "half"
+  , pattern =
+    [ regex "(1|一)?半(半|个|個)?"
+    ]
+  , prod = \case
+      (_:_) -> double 0.5 >>= withMultipliable
+      _ -> Nothing
+  }
+
+ruleDozen :: Rule
+ruleDozen = Rule
+  { name = "a dozen of"
+  , pattern =
+    [ regex "打"
+    ]
+  , prod = \_ -> integer 12 >>= withMultipliable >>= notOkForAnyTime
+  }
+
+rulePair :: Rule
+rulePair = Rule
+  { name = "a pair"
+  , pattern =
+    [ regex "雙|對"
+    ]
+  , prod = \_ -> integer 2 >>= withMultipliable >>= notOkForAnyTime
+  }
+
 numeralSuffixList :: [(Text, Maybe Token)]
 numeralSuffixList =
   [ ("K", double 1e3 >>= withGrain 3 >>= withMultipliable)
   , ("M", double 1e6 >>= withGrain 6 >>= withMultipliable)
   , ("G", double 1e9 >>= withGrain 9 >>= withMultipliable)
-  , ("十", double 1e1 >>= withGrain 1 >>= withMultipliable)
-  , ("百", double 1e2 >>= withGrain 2 >>= withMultipliable)
-  , ("千", double 1e3 >>= withGrain 3 >>= withMultipliable)
-  , ("万", double 1e4 >>= withGrain 4 >>= withMultipliable)
-  , ("亿", double 1e8 >>= withGrain 8 >>= withMultipliable)
+  , ("十|拾", double 1e1 >>= withGrain 1 >>= withMultipliable)
+  , ("百|佰", double 1e2 >>= withGrain 2 >>= withMultipliable)
+  , ("千|仟", double 1e3 >>= withGrain 3 >>= withMultipliable)
+  , ("万|萬", double 1e4 >>= withGrain 4 >>= withMultipliable)
+  , ("亿|億", double 1e8 >>= withGrain 8 >>= withMultipliable)
   ]
 
 ruleNumeralSuffixes :: [Rule]
@@ -197,6 +319,45 @@
       | d == 1 = Just $ v1 + v2
       | otherwise = Nothing
 
+ruleHundredPrefix :: Rule
+ruleHundredPrefix = Rule
+  { name = "one hundred and <integer> (short form)"
+  , pattern =
+    [ regex "百|佰"
+    , numberBetween 1 10
+    ]
+  , prod = \case
+    (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+      double $ 100 + v*10
+    _ -> Nothing
+  }
+
+ruleThousandPrefix :: Rule
+ruleThousandPrefix = Rule
+  { name = "one thousand and <integer> (short form)"
+  , pattern =
+    [ regex "千|仟"
+    , numberBetween 1 10
+    ]
+  , prod = \case
+    (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+      double $ 1000 + v*100
+    _ -> Nothing
+  }
+
+ruleTenThousandPrefix :: Rule
+ruleTenThousandPrefix = Rule
+  { name = "ten thousand and <integer> (short form)"
+  , pattern =
+    [ regex "万|萬"
+    , numberBetween 1 10
+    ]
+  , prod = \case
+    (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+      double $ 10000 + v*1000
+    _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleDecimalNumeral
@@ -208,5 +369,16 @@
   , ruleNumeralsIntersectNonconsectiveUnit
   , ruleNumeralsPrefixWithNegativeOrMinus
   , ruleMultiply
+  , ruleTens
+  , ruleCompositeTens
+  , ruleHalf
+  , ruleDotSpelledOut
+  , ruleDozen
+  , rulePair
+  , ruleFraction
+  , ruleMixedFraction
+  , ruleHundredPrefix
+  , ruleThousandPrefix
+  , ruleTenThousandPrefix
   ]
   ++ ruleNumeralSuffixes
diff --git a/Duckling/Ordinal/AR/Corpus.hs b/Duckling/Ordinal/AR/Corpus.hs
--- a/Duckling/Ordinal/AR/Corpus.hs
+++ b/Duckling/Ordinal/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/BG/Corpus.hs b/Duckling/Ordinal/BG/Corpus.hs
--- a/Duckling/Ordinal/BG/Corpus.hs
+++ b/Duckling/Ordinal/BG/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/BG/Rules.hs b/Duckling/Ordinal/BG/Rules.hs
--- a/Duckling/Ordinal/BG/Rules.hs
+++ b/Duckling/Ordinal/BG/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/CA/Corpus.hs b/Duckling/Ordinal/CA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/CA/Corpus.hs
@@ -0,0 +1,126 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.CA.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 CA Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "primer"
+             , "primera"
+             , "primers"
+             , "primeres"
+             ]
+   , examples (OrdinalData 2)
+              [ "segon"
+              , "segona"
+              , "segons"
+              , "segones"
+              ]
+   , examples (OrdinalData 3)
+              [ "tercer"
+              , "tercera"
+              , "tercers"
+              , "terceres"
+              ]
+   , examples (OrdinalData 4)
+              [ "quart"
+              , "quarta"
+              , "quarts"
+              , "quartes"
+              ]
+   , examples (OrdinalData 5)
+              [ "cinquè"
+              , "cinquena"
+              , "cinquens"
+              , "cinquenes"
+              ]
+   , examples (OrdinalData 6)
+              [ "sisè"
+              , "sisena"
+              , "sisens"
+              , "sisenes"
+              ]
+   , examples (OrdinalData 7)
+              [ "setè"
+              , "setena"
+              , "setens"
+              , "setenes"
+              ]
+   , examples (OrdinalData 8)
+              [ "vuitè"
+              , "vuitena"
+              , "vuitens"
+              , "vuitenes"
+              ]
+   , examples (OrdinalData 9)
+              [ "novè"
+              , "novena"
+              , "novens"
+              , "novenes"
+              ]
+   , examples (OrdinalData 10)
+              [ "desè"
+              , "desena"
+              , "desens"
+              , "desenes"
+              ]
+    , examples (OrdinalData 11)
+              [ "onzè"
+              , "onzena"
+              ]
+    , examples (OrdinalData 12)
+              [ "dotzè"
+              , "dotzena"
+              ]
+    , examples (OrdinalData 13)
+              [ "tretzè"
+              , "tretzena"
+              ]
+    , examples (OrdinalData 14)
+              [ "catorzè"
+              , "catorzena"
+              ]
+    , examples (OrdinalData 15)
+              [ "quinzè"
+              , "quinzena"
+              ]
+    , examples (OrdinalData 16)
+              [ "setzè"
+              , "setzena"
+              ]
+    , examples (OrdinalData 17)
+              [ "dissetè"
+              , "dissetena"
+              ]
+    , examples (OrdinalData 18)
+              [ "divuitè"
+              , "divuitena"
+              ]
+    , examples (OrdinalData 19)
+              [ "dinovè"
+              , "dinovena"
+              ]
+    , examples (OrdinalData 20)
+              [ "vintè"
+              , "vintena"
+              ]
+  ]
diff --git a/Duckling/Ordinal/CA/Rules.hs b/Duckling/Ordinal/CA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/CA/Rules.hs
@@ -0,0 +1,104 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Ordinal.CA.Rules
+  ( rules ) where
+
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+import Prelude
+import Data.String
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ordinalsMap :: HashMap.HashMap Text.Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "primer" , 1 )
+  , ( "primers" , 1 )
+  , ( "primera" , 1 )
+  , ( "primeres" , 1 )
+  , ( "segon" , 2 )
+  , ( "segona" , 2 )
+  , ( "segones" , 2 )
+  , ( "segons" , 2 )
+  , ( "tercer" , 3 )
+  , ( "tercera" , 3 )
+  , ( "tercers" , 3 )
+  , ( "terceres" , 3 )
+  , ( "quart" , 4 )
+  , ( "quarta" , 4 )
+  , ( "quarts" , 4 )
+  , ( "quartes" , 4 )
+  , ( "cinquè" , 5 )
+  , ( "cinquena" , 5 )
+  , ( "cinquens" , 5 )
+  , ( "cinquenes" , 5 )
+  , ( "sisè" , 6 )
+  , ( "sisena" , 6 )
+  , ( "sisens" , 6 )
+  , ( "sisenes" , 6 )
+  , ( "setè" , 7 )
+  , ( "setena" , 7 )
+  , ( "setens" , 7 )
+  , ( "setenes" , 7 )
+  , ( "vuitè" , 8 )
+  , ( "vuitena" , 8 )
+  , ( "vuitens" , 8 )
+  , ( "vuitenes" , 8 )
+  , ( "novè" , 9 )
+  , ( "novena" , 9 )
+  , ( "novens" , 9 )
+  , ( "novenes" , 9 )
+  , ( "desè" , 10 )
+  , ( "desena" , 10 )
+  , ( "desens" , 10 )
+  , ( "desenes" , 10 )
+  , ( "onzè" , 11 )
+  , ( "onzena" , 11 )
+  , ( "dotzè" , 12 )
+  , ( "dotzena" , 12 )
+  , ( "tretzè" , 13 )
+  , ( "tretzena" , 13 )
+  , ( "catorzè" , 14 )
+  , ( "catorzena" , 14 )
+  , ( "quinzè" , 15 )
+  , ( "quinzena" , 15 )
+  , ( "setzè" , 16 )
+  , ( "setzena" , 16 )
+  , ( "dissetè" , 17 )
+  , ( "dissetena" , 17 )
+  , ( "divuitè" , 18 )
+  , ( "divuitena" , 18 )
+  , ( "dinovè" , 19 )
+  , ( "dinovena" , 19 )
+  , ( "vintè" , 20 )
+  , ( "vintena" , 20 )
+  ]
+
+ruleOrdinalsPrimero :: Rule
+ruleOrdinalsPrimero = Rule
+  { name = "ordinals (primero..10)"
+  , pattern =
+    [ regex "(primer(a|s|es)?|segon(a|s|es)?|tercer(a|s|es)?|quart(a|s|es)?|cinqu(è|(en(a|s|es)))|sis(è|en(a|s|es))|set(è|en(a|s|es))|vuit(è|en(a|s|es))|nov(è|en(a|s|es))|des(è|en(a|s|es))|onz(è|ena)|dotz(è|ena)|tretz(è|ena)|catorz(è|ena)|quinz(è|ena)|setz(è|ena)|disset(è|ena)|divuit(è|ena)|dinov(è|ena)|vint(è|ena))"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinalsPrimero
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -23,9 +22,24 @@
 corpus = (testContext {locale = makeLocale DA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
-allExamples =
-  examples (OrdinalData 4)
-           [ "4."
-           , "fjerde"
-           , "Fjerde"
-           ]
+allExamples = concat
+  [ examples (OrdinalData 4)
+             [ "4."
+             , "fjerde"
+             , "Fjerde"
+             ]
+  , examples (OrdinalData 41)
+             [ "enogfyrrende"
+             ]
+  , examples (OrdinalData 78)
+             [ "otteoghalvfjerdsindstyvende"
+             ]
+  , examples (OrdinalData 263)
+             [ "to hundrede og treogtresindstyvende"
+             , "tohundrede og treogtresindstyvende"
+             ]
+  , examples (OrdinalData 70)
+             [ "halvfjerdsende"
+             , "halvfjerdsindstyvende"
+             ]
+  ]
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
@@ -2,69 +2,151 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
 
 module Duckling.Ordinal.DA.Rules
   ( rules ) where
 
-import qualified Data.Text as Text
+
+import Data.HashMap.Strict (HashMap)
+import Data.Text (Text)
 import Prelude
-import Data.String
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Numeral.Helpers (parseInt, numberWith)
+import Duckling.Numeral.Types (NumeralData (..), getIntValue)
 import Duckling.Ordinal.Helpers
+import Duckling.Ordinal.Types (OrdinalData (..))
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
 
+ordinalsMap :: HashMap Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "første", 1 )
+  , ( "anden", 2 )
+  , ( "tredje", 3 )
+  , ( "fjerde", 4 )
+  , ( "femte", 5 )
+  , ( "sjette", 6 )
+  , ( "syvende", 7 )
+  , ( "ottende", 8 )
+  , ( "niende", 9 )
+  , ( "tiende", 10 )
+  , ( "elfte", 11 )
+  , ( "tolvte", 12 )
+  , ( "trettende", 13 )
+  , ( "fjortende", 14 )
+  , ( "femtende", 15 )
+  , ( "sekstende", 16 )
+  , ( "syttende", 17 )
+  , ( "attende", 18 )
+  , ( "nittende", 19 )
+  , ( "tyvende", 20 )
+  , ( "tenogtyvende", 21 )
+  , ( "toogtyvende", 22 )
+  , ( "treogtyvende", 23 )
+  , ( "fireogtyvende", 24 )
+  , ( "femogtyvende", 25 )
+  , ( "seksogtyvende", 26 )
+  , ( "syvogtyvende", 27 )
+  , ( "otteogtyvende", 28 )
+  , ( "niogtyvende", 29 )
+  , ( "tredivte", 30 )
+  , ( "enogtredivte", 31 )
+  ]
+
+cardinalsMap :: HashMap Text Int
+cardinalsMap = HashMap.fromList
+  [ ( "tyvende", 20 )
+  , ( "tredivte", 30 )
+  , ( "fyrrende", 40 )
+  , ( "fyrretyvende", 40 )
+  , ( "halvtredsende", 50 )
+  , ( "halvtredsindstyvende", 50 )
+  , ( "tressende", 60 )
+  , ( "tresindstyvende", 60 )
+  , ( "halvfjerdsende", 70 )
+  , ( "halvfjerdsindstyvende", 70 )
+  , ( "firsende", 80 )
+  , ( "firsindsstyvende", 80 )
+  , ( "halvfemsende", 90 )
+  , ( "halvfemsindstyvende", 90 )
+  ]
+
+oneValMap :: HashMap Text Int
+oneValMap = HashMap.fromList
+  [ ( "", 0 )
+  , ( "enog", 1 )
+  , ( "toog", 2 )
+  , ( "treog", 3 )
+  , ( "fireog", 4 )
+  , ( "femog", 5 )
+  , ( "seksog", 6 )
+  , ( "syvog", 7 )
+  , ( "otteog", 8 )
+  , ( "niog", 9 )
+  ]
+
 ruleOrdinalsFirstst :: Rule
 ruleOrdinalsFirstst = Rule
-  { name = "ordinals (first..31st)"
+  { name = "ordinals (first..19st)"
   , pattern =
-    [ 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)"
+    [ regex "(første|anden|tredje|fjerde|femte|sjette|syvende|ottende|niende|tiende|elfte|tolvte|trettende|fjortende|femtende|sekstende|syttende|attende|nittende)"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "første" -> Just $ ordinal 1
-        "anden" -> Just $ ordinal 2
-        "tredje" -> Just $ ordinal 3
-        "fjerde" -> Just $ ordinal 4
-        "femte" -> Just $ ordinal 5
-        "sjette" -> Just $ ordinal 6
-        "syvende" -> Just $ ordinal 7
-        "ottende" -> Just $ ordinal 8
-        "niende" -> Just $ ordinal 9
-        "tiende" -> Just $ ordinal 10
-        "elfte" -> Just $ ordinal 11
-        "tolvte" -> Just $ ordinal 12
-        "trettende" -> Just $ ordinal 13
-        "fjortende" -> Just $ ordinal 14
-        "femtende" -> Just $ ordinal 15
-        "sekstende" -> Just $ ordinal 16
-        "syttende" -> Just $ ordinal 17
-        "attende" -> Just $ ordinal 18
-        "nittende" -> Just $ ordinal 19
-        "tyvende" -> Just $ ordinal 20
-        "tenogtyvende" -> Just $ ordinal 21
-        "toogtyvende" -> Just $ ordinal 22
-        "treogtyvende" -> Just $ ordinal 23
-        "fireogtyvende" -> Just $ ordinal 24
-        "femogtyvende" -> Just $ ordinal 25
-        "seksogtyvende" -> Just $ ordinal 26
-        "syvogtyvende" -> Just $ ordinal 27
-        "otteogtyvende" -> Just $ ordinal 28
-        "niogtyvende" -> Just $ ordinal 29
-        "tredivte" -> Just $ ordinal 30
-        "enogtredivte" -> Just $ ordinal 31
-        _ -> Nothing
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
       _ -> Nothing
   }
 
+ruleSpelledOutOrdinals :: Rule
+ruleSpelledOutOrdinals = Rule
+  { name = "ordinals, 20 to 99, spelled-out"
+  , pattern =
+    [ regex (concat ["((?:en|to|tre|fire|fem|seks|syv|otte|ni)og)?",
+                     "(tyvende",
+                     "|tredivte",
+                     "|fyrr(?:etyv)?ende",
+                     "|halvtreds(?:indstyv)?ende",
+                     "|tres(?:indstyv|s)?ende",
+                     "|halvfjerds(?:indstyv)?ende",
+                     "|firs(?:indstyv)?ende",
+                     "|halvfems(?:indstyv)?ende)"])
+    ]
+  , prod = \case
+    (Token RegexMatch (GroupMatch (ones:tens:_)):_) -> do
+      oneVal <- HashMap.lookup (Text.toLower ones) oneValMap
+      tenVal <- HashMap.lookup (Text.toLower tens) cardinalsMap
+      Just $ ordinal (oneVal + tenVal)
+    _ -> Nothing
+
+  }
+
+ruleSpelledOutBigOrdinals :: Rule
+ruleSpelledOutBigOrdinals = Rule
+  { name = "ordinals, above 99, spelled out"
+  , pattern =
+    [ numberWith TNumeral.value (> 99)
+    , regex "og"
+    , dimension Ordinal
+    ]
+  , prod = \case
+      Token Numeral NumeralData {TNumeral.value=maybenumnum}:_:Token Ordinal (OrdinalData ordnum):_ ->
+            case getIntValue maybenumnum of
+              Just numnum -> Just $ ordinal (numnum + ordnum)
+              Nothing -> Nothing
+      _ -> Nothing
+  }
+
 ruleOrdinalDigits :: Rule
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
@@ -82,4 +164,6 @@
 rules =
   [ ruleOrdinalDigits
   , ruleOrdinalsFirstst
+  , ruleSpelledOutOrdinals
+  , ruleSpelledOutBigOrdinals
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,19 +2,24 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Ordinal.DE.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
-import qualified Data.Text as Text
+import Data.Semigroup ((<>))
 import Prelude
 import Data.String
+import Data.Text (Text)
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.List as List
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
@@ -22,64 +27,71 @@
 import Duckling.Regex.Types
 import Duckling.Types
 
+ordinalList :: [(Text, Int)]
+ordinalList =
+  [ ("erste", 1)
+  , ("zweite", 2)
+  , ("dritte", 3)
+  , ("vierte", 4)
+  , ("fünfte", 5)
+  , ("sechste", 6)
+  , ("siebte", 7)
+  , ("achte", 8)
+  , ("neunte", 9)
+  , ("zehnte", 10)
+  , ("elfte", 11)
+  , ("zwölfte", 12)
+  , ("dreizente", 13)
+  , ("vierzehnte", 14)
+  , ("fünfzehnte", 15)
+  , ("sechzente", 16)
+  , ("siebzehnte", 17)
+  , ("achtzehnte", 18)
+  , ("neunzehnte", 19)
+  , ("zwanzigste", 20)
+  , ("einundzwanzigste", 21)
+  , ("zweiundzwanzigste", 22)
+  , ("dreiundzwanzigste", 23)
+  , ("vierundzwanzigste", 24)
+  , ("fünfundzwanzigste", 25)
+  , ("sechsundzwanzigste", 26)
+  , ("siebenundzwanzigste", 27)
+  , ("achtundzwanzigste", 28)
+  , ("neunundzwanzigste", 29)
+  , ("dreissigste", 30)
+  , ("dreißigste", 30)
+  , ("einunddreissigste", 31)
+  , ("einunddreißigste", 31)
+  ]
+
 ruleOrdinalsFirstth :: Rule
 ruleOrdinalsFirstth = Rule
-  { name = "ordinals (first..19th)"
+  { name = "ordinal (1..31)"
   , 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ölfter|dreizenter|vierzehnter|fünfzehnter|sechzenter|siebzehnter|achtzehnter|neunzehnter)"
+    [ regex $ Text.unpack construction
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "erstes" -> Just $ ordinal 1
-        "erster" -> Just $ ordinal 1
-        "erste" -> Just $ ordinal 1
-        "zweiter" -> Just $ ordinal 2
-        "zweite" -> Just $ ordinal 2
-        "zweites" -> Just $ ordinal 2
-        "drittes" -> Just $ ordinal 3
-        "dritte" -> Just $ ordinal 3
-        "dritter" -> Just $ ordinal 3
-        "viertes" -> Just $ ordinal 4
-        "vierte" -> Just $ ordinal 4
-        "vierter" -> Just $ ordinal 4
-        "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
-        "siebtes" -> Just $ ordinal 7
-        "siebte" -> Just $ ordinal 7
-        "siebter" -> Just $ ordinal 7
-        "achtes" -> Just $ ordinal 8
-        "achte" -> Just $ ordinal 8
-        "achter" -> Just $ ordinal 8
-        "neuntes" -> Just $ ordinal 9
-        "neunter" -> Just $ ordinal 9
-        "neunte" -> Just $ ordinal 9
-        "zehnte" -> Just $ ordinal 10
-        "zehnter" -> Just $ ordinal 10
-        "zehntes" -> Just $ ordinal 10
-        "elfter" -> Just $ ordinal 11
-        "zwölfter" -> Just $ ordinal 12
-        "dreizehnter" -> Just $ ordinal 13
-        "vierzehnter" -> Just $ ordinal 14
-        "fünfzehnter" -> Just $ ordinal 15
-        "sechzehnter" -> Just $ ordinal 16
-        "siebzehnter" -> Just $ ordinal 17
-        "achtzehnter" -> Just $ ordinal 18
-        "neunzehnter" -> Just $ ordinal 19
-        _ -> Nothing
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalMap
       _ -> Nothing
   }
+  where
+    ordinalMap :: HashMap.HashMap Text Int
+    ordinalMap = HashMap.fromList ordinalList
 
+    construction :: Text
+    construction =
+      "("
+      <> mconcat (List.intersperse "|" (fst <$> ordinalList))
+      <> ")[rsn]?"
+
 ruleOrdinalDigits :: Rule
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
     [ regex "(?<!\\d|\\.)0*(\\d+)(\\.(?!\\d)| ?(te(n|r|s)?)|(ste(n|r|s)?))"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         v <- parseInt match
         Just $ ordinal v
@@ -88,6 +100,6 @@
 
 rules :: [Rule]
 rules =
-  [ ruleOrdinalDigits
-  , ruleOrdinalsFirstth
+  [ ruleOrdinalsFirstth
+  , ruleOrdinalDigits
   ]
diff --git a/Duckling/Ordinal/EL/Corpus.hs b/Duckling/Ordinal/EL/Corpus.hs
--- a/Duckling/Ordinal/EL/Corpus.hs
+++ b/Duckling/Ordinal/EL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/EL/Rules.hs b/Duckling/Ordinal/EL/Rules.hs
--- a/Duckling/Ordinal/EL/Rules.hs
+++ b/Duckling/Ordinal/EL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/EN/Corpus.hs b/Duckling/Ordinal/EN/Corpus.hs
--- a/Duckling/Ordinal/EN/Corpus.hs
+++ b/Duckling/Ordinal/EN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/EN/Rules.hs b/Duckling/Ordinal/EN/Rules.hs
--- a/Duckling/Ordinal/EN/Rules.hs
+++ b/Duckling/Ordinal/EN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/ES/Corpus.hs b/Duckling/Ordinal/ES/Corpus.hs
--- a/Duckling/Ordinal/ES/Corpus.hs
+++ b/Duckling/Ordinal/ES/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -33,6 +32,11 @@
              [ "segundo"
              , "segunda"
              , "segundos"
+             ]
+  , examples (OrdinalData 3)
+             [ "tercero"
+             , "tercera"
+             , "terceros"
              ]
   , examples (OrdinalData 10)
              [ "decimo"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -80,7 +79,7 @@
 ruleOrdinalsPrimero = Rule
   { name = "ordinals (primero..10)"
   , pattern =
-    [ regex "((primer|segund|cuart|quint|sext|s[eé]ptim|octav|noven|d[eé]cim)(os?|as?)|(prim|terc)er)"
+    [ regex "((primer|segund|tercer|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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,66 +2,67 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Ordinal.FR.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.HashMap.Strict ( HashMap)
-import qualified Data.HashMap.Strict as HashMap
+import Data.String
 import Data.Text (Text)
-import qualified Data.Text as Text
 import Prelude
-import Data.String
+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.Regex.Types (GroupMatch (..))
 import Duckling.Types
 
-ruleOrdinalsPremierseiziemeMap :: HashMap Text Int
-ruleOrdinalsPremierseiziemeMap = HashMap.fromList
-  [ ( "première"   , 1 )
-  , ( "premiere"        , 1 )
-  , ( "premier"         , 1 )
-  , ( "deuxième"   , 2 )
-  , ( "deuxieme"        , 2 )
-  , ( "second"          , 2 )
-  , ( "seconde"         , 2 )
-  , ( "troisième"  , 3 )
-  , ( "troisieme"       , 3 )
-  , ( "quatrieme"       , 4 )
-  , ( "quatrième"  , 4 )
-  , ( "cinquieme"       , 5 )
-  , ( "cinquième"  , 5 )
-  , ( "sixième"    , 6 )
-  , ( "sixieme"         , 6 )
-  , ( "septieme"        , 7 )
-  , ( "septième"   , 7 )
-  , ( "huitième"   , 8 )
-  , ( "huitieme"        , 8 )
-  , ( "neuvieme"        , 9 )
-  , ( "neuvième"   , 9 )
-  , ( "dixième"    , 10 )
-  , ( "dixieme"         , 10 )
-  , ( "onzième"    , 11 )
-  , ( "onzieme"         , 11 )
-  , ( "douzieme"        , 12 )
-  , ( "douzième"   , 12 )
-  , ( "treizieme"       , 13 )
-  , ( "treizième"  , 13 )
+ordinalsMap :: HashMap Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "première", 1 )
+  , ( "premiere", 1 )
+  , ( "premier", 1 )
+  , ( "deuxième", 2 )
+  , ( "deuxieme", 2 )
+  , ( "second", 2 )
+  , ( "seconde", 2 )
+  , ( "troisième", 3 )
+  , ( "troisieme", 3 )
+  , ( "quatrieme", 4 )
+  , ( "quatrième", 4 )
+  , ( "cinquieme", 5 )
+  , ( "cinquième", 5 )
+  , ( "sixième", 6 )
+  , ( "sixieme", 6 )
+  , ( "septieme", 7 )
+  , ( "septième", 7 )
+  , ( "huitième", 8 )
+  , ( "huitieme", 8 )
+  , ( "neuvieme", 9 )
+  , ( "neuvième", 9 )
+  , ( "dixième", 10 )
+  , ( "dixieme", 10 )
+  , ( "onzième", 11 )
+  , ( "onzieme", 11 )
+  , ( "douzieme", 12 )
+  , ( "douzième", 12 )
+  , ( "treizieme", 13 )
+  , ( "treizième", 13 )
   , ( "quatorzième", 14 )
-  , ( "quatorzieme"     , 14 )
-  , ( "quinzième"  , 15 )
-  , ( "quinzieme"       , 15 )
-  , ( "seizieme"        , 16 )
-  , ( "seizième"   , 16 )
+  , ( "quatorzieme", 14 )
+  , ( "quinzième", 15 )
+  , ( "quinzieme", 15 )
+  , ( "seizieme", 16 )
+  , ( "seizième", 16 )
   ]
 
 ruleOrdinalsPremierseizieme :: Rule
@@ -70,9 +71,9 @@
   , pattern =
     [ 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
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
-        ordinal <$> HashMap.lookup (Text.toLower match) ruleOrdinalsPremierseiziemeMap
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
       _ -> Nothing
   }
 
@@ -82,10 +83,8 @@
   , pattern =
     [ regex "0*(\\d+) ?(ere?|ère|ème|eme|e)"
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> do
-        n <- parseInt match
-        Just $ ordinal n
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
       _ -> Nothing
   }
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/HI/Corpus.hs b/Duckling/Ordinal/HI/Corpus.hs
--- a/Duckling/Ordinal/HI/Corpus.hs
+++ b/Duckling/Ordinal/HI/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/HI/Rules.hs b/Duckling/Ordinal/HI/Rules.hs
--- a/Duckling/Ordinal/HI/Rules.hs
+++ b/Duckling/Ordinal/HI/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/HU/Corpus.hs b/Duckling/Ordinal/HU/Corpus.hs
--- a/Duckling/Ordinal/HU/Corpus.hs
+++ b/Duckling/Ordinal/HU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/HU/Rules.hs b/Duckling/Ordinal/HU/Rules.hs
--- a/Duckling/Ordinal/HU/Rules.hs
+++ b/Duckling/Ordinal/HU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/Helpers.hs b/Duckling/Ordinal/Helpers.hs
--- a/Duckling/Ordinal/Helpers.hs
+++ b/Duckling/Ordinal/Helpers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -17,20 +16,20 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 
 -- -----------------------------------------------------------------
 -- Patterns
 
--- -----------------------------------------------------------------
--- Production
-
-ordinal :: Int -> Token
-ordinal x = Token Ordinal OrdinalData {TOrdinal.value = x}
-
 oneOf :: [Int] -> PatternItem
 oneOf vs = Predicate $ \x ->
   case x of
     (Token Ordinal OrdinalData {TOrdinal.value = v}) -> elem v vs
     _ -> False
+
+-- -----------------------------------------------------------------
+-- Production
+
+ordinal :: Int -> Token
+ordinal x = Token Ordinal OrdinalData {TOrdinal.value = x}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/ID/Rules.hs b/Duckling/Ordinal/ID/Rules.hs
--- a/Duckling/Ordinal/ID/Rules.hs
+++ b/Duckling/Ordinal/ID/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/KA/Corpus.hs b/Duckling/Ordinal/KA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/KA/Corpus.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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.KA.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Ordinal.Types
+import Duckling.Testing.Types
+
+import Duckling.Locale
+import Duckling.Resolve
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale KA Nothing}, testOptions, allExamples)
+
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "პირველი"
+             , "1-ლი"
+             ]
+  , examples (OrdinalData 2)
+             [ "მეორე"
+             , "მე-2"
+             ]
+  , examples (OrdinalData 3)
+             [ "მესამე"
+             , "მე-3"
+             ]
+  , examples (OrdinalData 4)
+             [ "მეოთხე"
+             , "მე-4"
+             ]
+  , examples (OrdinalData 8)
+             [ "მერვე"
+             , "მე-8"
+             ]
+  , examples (OrdinalData 25)
+             [ "ოცდამეხუთე"
+             , "25-ე"
+             ]
+  , examples (OrdinalData 31)
+             [ "ოცდამეთერთმეტე"
+             , "31-ე"
+             ]
+  , examples (OrdinalData 42)
+             [ "ორმოცდამეორე"
+             , "42-ე"
+             ]
+  , examples (OrdinalData 73)
+            [ "სამოცდამეცამეტე"
+            , "73-ე"
+            ]
+  , examples (OrdinalData 90)
+            [ "ოთხმოცდამეათე"
+            , "90-ე"
+            ]
+  ]
diff --git a/Duckling/Ordinal/KA/Rules.hs b/Duckling/Ordinal/KA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/KA/Rules.hs
@@ -0,0 +1,145 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Ordinal.KA.Rules
+  ( rules
+  ) where
+
+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
+  [ ("პირველი", 1)
+  , ("პირველ", 1)
+  , ("მეერთე", 1)
+  , ("მეორე", 2)
+  , ("მესამე", 3)
+  , ("მეოთხე", 4)
+  , ("მეხუთე", 5)
+  , ("მეექვსე", 6)
+  , ("მეშვიდე", 7)
+  , ("მერვე", 8)
+  , ("მეცხრე", 9)
+  , ("მეათე", 10)
+  , ("მეთერთმეტე", 11)
+  , ("მეთორმეტე", 12)
+  , ("მეცამეტე", 13)
+  , ("მეთოთხმეტე", 14)
+  , ("მეთხუთმეტე", 15)
+  , ("მეთქვსმეტე", 16)
+  , ("მეჩვიდმეტე", 17)
+  , ("მეთვრამეტე", 18)
+  , ("მეცხრამეტე", 19)
+  , ("მეოცე", 20)
+  , ("ოცდამეათე", 30)
+  , ("მეორმოცე", 40)
+  , ("ორმოცდამეათე", 50)
+  , ("მესამოცე", 60)
+  , ("სამოცდამეათე", 70)
+  , ("მეოთხმოცე", 80)
+  , ("ოთხმოცდამეათე", 90)
+  ]
+
+cardinalsMap :: HashMap Text Int
+cardinalsMap = HashMap.fromList
+  [ ("ოცი", 20)
+  , ("ოცდა", 20)
+  , ("ოცდაათი", 30)
+  , ("ორმოცი", 40)
+  , ("ორმოცდა", 40)
+  , ("ორმოცდაათი", 50)
+  , ("სამოცი", 60)
+  , ("სამოცდა", 60)
+  , ("სამოცდაათი", 70)
+  , ("ოთხმოცი", 80)
+  , ("ოთხმოცდა", 80)
+  , ("ოთხმოცდაათი", 90)
+  ]
+
+ruleOrdinals :: Rule
+ruleOrdinals = Rule
+  { name = "ordinals (first..twentieth,thirtieth,...)"
+  , pattern =
+    [ regex "(პირველი?|მეორე|მესამე|მეოთხე|მეხუთე|მეექვსე|მეშვიდე|მერვე|მეცხრე|მეათე|მეთერთმეტე|მეთოთხმეტე|მეცამეტე|მეთოთხმეტე|მეთხუთმეტე|მეთექვსმეტე|მეჩვიდმეტე|მეთვრამეტე|მეცხრამეტე|მეოცე|ოცდამეათე|მეორმოცე|ორმოცდამეათე|მესამოცე|სამოცდამეათე|მეოთხმოცე|ოთხმოცდამეათე)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
+      _ -> Nothing
+    }
+
+ruleCompositeOrdinals :: Rule
+ruleCompositeOrdinals = Rule
+  { name = "ordinals (composite, e.g. eighty-seven, forty—seventh, twenty ninth, thirtythird)"
+  , pattern =
+    [ regex "(ოცდა|ორმოცდა|სამოცდა|ოთხმოცდა)[\\s\\-\\—]?(მეერთე|მეორე|მესამე|მეოთხე|მეხუთე|მეექვსე|მეშვიდე|მერვე|მეცხრე|მეათე|მეთერთმეტე|მეთოთხმეტე|მეცამეტე|მეთოთხმეტე|მეთხუთმეტე|მეთექვსმეტე|მეჩვიდმეტე|მეთვრამეტე|მეცხრამეტე)"
+    ]
+  , prod = \case
+      (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+) ?(-ლი|-ე)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
+      _ -> Nothing
+  }
+
+ruleOrdinalDigits1 :: Rule
+ruleOrdinalDigits1 = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "მე-? ?0*(\\d+)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
+      _ -> Nothing
+  }
+
+ruleOrdinalDigits2 :: Rule
+ruleOrdinalDigits2 = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "მე-? ?0*(\\d+) ?(-ლი|-ე)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinals
+  , ruleCompositeOrdinals
+  , ruleOrdinalDigits
+  , ruleOrdinalDigits1
+  , ruleOrdinalDigits2
+  ]
diff --git a/Duckling/Ordinal/KM/Corpus.hs b/Duckling/Ordinal/KM/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/KM/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.KM.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Ordinal.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext{locale = makeLocale KM Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "ទីមួយ"
+             , "ទី១"
+             ]
+  , examples (OrdinalData 400)
+             [ "ទីបួនរយ"
+             ]
+  ]
diff --git a/Duckling/Ordinal/KM/Rules.hs b/Duckling/Ordinal/KM/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/KM/Rules.hs
@@ -0,0 +1,41 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.KM.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Ordinal.Helpers
+import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleOrdinalDigits :: Rule
+ruleOrdinalDigits = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "ទី"
+    , dimension Numeral
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = x}:_) ->
+        Just . ordinal $ floor x
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinalDigits
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/ML/Corpus.hs b/Duckling/Ordinal/ML/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/ML/Corpus.hs
@@ -0,0 +1,118 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.ML.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Ordinal.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale ML Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "ഒന്നാം"
+             , "1."
+             ]
+  , examples (OrdinalData 2)
+             [ "രണ്ടാം"
+             , "2."
+             ]
+  , examples (OrdinalData 3)
+             [ "മൂന്നാം"
+             , "3."
+             ]
+  , examples (OrdinalData 4)
+             [ "നാലാം"
+             , "4."
+             ]
+  , examples (OrdinalData 5)
+             [ "അഞ്ചാം"
+             , "5."
+             ]
+  , examples (OrdinalData 6)
+             [ "ആറാം"
+             , "6."
+             ]
+  , examples (OrdinalData 7)
+             [ "ഏഴാം"
+             , "7."
+             ]
+  , examples (OrdinalData 8)
+             [ "എട്ടാം"
+             , "8."
+             ]
+  , examples (OrdinalData 9)
+             [ "ഒമ്പതാം"
+             , "9."
+             ]
+  , examples (OrdinalData 10)
+             [ "പത്താം"
+             , "10."
+             ]
+  , examples (OrdinalData 11)
+             [ "പതിനൊന്നാം"
+             , "11."
+             ]
+  , examples (OrdinalData 12)
+             [ "പന്ത്രണ്ടാം"
+             , "12."
+             ]
+  , examples (OrdinalData 20)
+             [ "ഇരുപതാം"
+             , "20."
+             ]
+  , examples (OrdinalData 22)
+             [ "ഇരുപത്തിരണ്ടാം"
+             , "22."
+             ]
+  , examples (OrdinalData 26)
+             [ "ഇരുപത്തിആറാം"
+             , "26."
+             ]
+  , examples (OrdinalData 30)
+             [ "മുപ്പത്തഞ്ചാം"
+             , "30."
+             ]
+   , examples (OrdinalData 33)
+             [ "മുപ്പത്തിമൂന്നാം"
+             , "33."
+             ]
+  , examples (OrdinalData 50)
+             [ "അമ്പതാം"
+             , "50."
+             ]
+   , examples (OrdinalData 54)
+              [ "അമ്പത്തിനാലാം"
+              , "54."
+              ]
+   , examples (OrdinalData 65)
+              [ "അറുപത്തിഅഞ്ചാം"
+              , "65."
+              ]
+   , examples (OrdinalData 76)
+              [ "എഴുപത്തിആറാം"
+              , "76."
+              ]
+   , examples (OrdinalData 87)
+              [ "എൺപത്തിഏഴാം"
+              , "87."
+              ]
+  ]
diff --git a/Duckling/Ordinal/ML/Rules.hs b/Duckling/Ordinal/ML/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/ML/Rules.hs
@@ -0,0 +1,136 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Ordinal.ML.Rules
+  ( rules ) where
+
+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
+
+oneToNineteenMap :: HashMap Text Int
+oneToNineteenMap = HashMap.fromList
+  [ ( "ഒന്നാം", 1 )
+  , ( "രണ്ടാം", 2 )
+  , ( "മൂന്നാം", 3 )
+  , ( "നാലാം", 4 )
+  , ( "അഞ്ചാം", 5 )
+  , ( "ആറാം", 6 )
+  , ( "ഏഴാം", 7 )
+  , ( "എട്ടാം", 8 )
+  , ( "ഒമ്പതാം", 9 )
+  , ( "പത്താം", 10 )
+  , ( "പതിനൊന്നാം", 11 )
+  , ( "പന്ത്രണ്ടാം", 12 )
+  , ( "പതിമൂന്നാം", 13 )
+  , ( "പതിനാലാം", 14 )
+  , ( "പതിനഞ്ചാം", 15 )
+  , ( "പതിനാറാം", 16 )
+  , ( "പതിനേഴാം", 17 )
+  , ( "പതിനെട്ടാം", 18 )
+  , ( "പത്തൊൻപതാം", 19 )
+  ]
+
+ruleOneToNineteen :: Rule
+ruleOneToNineteen = Rule
+  { name = "integer (1..19)"
+  , pattern =
+    [ regex "(ഒന്നാം|രണ്ടാം|മൂന്നാം|നാലാം|അഞ്ചാം|ആറാം|ഏഴാം|എട്ടാം|ഒമ്പതാം|പത്താം|പതിനൊന്നാം|പന്ത്രണ്ടാം|പതിമൂന്നാം|പതിനാലാം|പതിനഞ്ചാം|പതിനാറാം|പതിനേഴാം|പതിനെട്ടാം|പത്തൊൻപതാം)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) oneToNineteenMap
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Int
+tensMap = HashMap.fromList
+  [ ( "ഇരുപതാം", 20 )
+  , ( "മുപ്പത്തഞ്ചാം", 30 )
+  , ( "നാല്പതാം", 40 )
+  , ( "അമ്പതാം", 50 )
+  , ( "അറുപതാം", 60 )
+  , ( "എഴുപത്താം", 70 )
+  , ( "എൺപത്താം", 80 )
+  , ( "തൊണ്ണൂറാം", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(ഇരുപതാം|മുപ്പത്തഞ്ചാം|നാല്പതാം|അമ്പതാം|അറുപതാം|എഴുപത്താം|എൺപത്താം|തൊണ്ണൂറാം)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) tensMap
+      _ -> Nothing
+  }
+
+tensOrdinalMap :: HashMap Text Int
+tensOrdinalMap = HashMap.fromList
+  [ ( "ഇരുപത്തി", 20 )
+  , ( "മുപ്പത്തി", 30 )
+  , ( "നാല്പത്തി", 40 )
+  , ( "അമ്പത്തി", 50 )
+  , ( "അറുപത്തി", 60 )
+  , ( "എഴുപത്തി", 70 )
+  , ( "എൺപത്തി", 80 )
+  , ( "തൊണ്ണൂറ്റി", 90 )
+  ]
+
+oneToNineMap :: HashMap Text Int
+oneToNineMap = HashMap.filterWithKey (\_ v -> v <= 9) oneToNineteenMap
+
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([2-9][1-9])"
+  , pattern =
+    [ regex "(ഇരുപത്തി|മുപ്പത്തി|നാല്പത്തി|അമ്പത്തി|അറുപത്തി|എഴുപത്തി|എൺപത്തി|തൊണ്ണൂറ്റി)(ആദ്യം|രണ്ടാം|മൂന്നാം|നാലാം|അഞ്ചാം|ആറാം|ഏഴാം|എട്ടാം|ഒമ്പത)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) tensOrdinalMap
+        v2 <- HashMap.lookup (Text.toLower m2) oneToNineMap
+        Just $ ordinal (v1 + v2)
+      _ -> Nothing
+  }
+
+ruleOrdinalDigits :: Rule
+ruleOrdinalDigits = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "0*(\\d+)\\."
+    ]
+  , prod = \case
+    (   Token RegexMatch (GroupMatch (match :_)) : _)
+          -> ordinal <$> parseInt match
+    _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinalDigits
+  , ruleOneToNineteen
+  , ruleTens
+  , ruleCompositeTens
+  ]
diff --git a/Duckling/Ordinal/MN/Corpus.hs b/Duckling/Ordinal/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/MN/Corpus.hs
@@ -0,0 +1,59 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.MN.Corpus
+  ( corpus ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Locale
+import Duckling.Ordinal.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "нэг дүгээр"
+             , "нэг дэх"
+             , "1-р"
+             ]
+  , examples (OrdinalData 3)
+             [ "гурав дахь"
+             , "гурав дугаар"
+             , "3-р"
+             ]
+  , examples (OrdinalData 4)
+             [ "дөрөв дэх"
+             , "4-р"
+             ]
+  , examples (OrdinalData 15)
+             [ "15-р"
+             ]
+  , examples (OrdinalData 21)
+             [ "21-р"
+             ]
+  , examples (OrdinalData 23)
+             [ "23-р"
+             ]
+  , examples (OrdinalData 31)
+             [ "31-р"
+             ]
+  , examples (OrdinalData 48)
+             [ 
+               "48-р"
+             ]
+  , examples (OrdinalData 99)
+             [ "99-р"
+             ]
+  ]
diff --git a/Duckling/Ordinal/MN/Rules.hs b/Duckling/Ordinal/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/MN/Rules.hs
@@ -0,0 +1,139 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Ordinal.MN.Rules
+  ( rules
+  ) where
+
+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
+
+ordinalsFirstthMap :: HashMap Text.Text Int
+ordinalsFirstthMap = HashMap.fromList
+  [ ( "нэг", 1 )
+  , ( "хоёр", 2 )
+  , ( "гурав", 3 )
+  , ( "дөрөв", 4 )
+  , ( "тав", 5 )
+  , ( "зургаа", 6 )
+  , ( "долоо", 7 )
+  , ( "найм", 8 )
+  , ( "ес", 9 )
+  , ( "арав", 10 )
+   ]
+
+cardinalsMap :: HashMap Text.Text Int
+cardinalsMap = HashMap.fromList
+  [ ( "арван", 10 )
+  , ( "хорин", 20 )
+  , ( "хорь", 20 )
+  , ( "гучин", 30 )
+  , ( "гуч", 30 )
+  , ( "дөчин", 40 )
+  , ( "дөч", 40 )
+  , ( "тавин", 50 )
+  , ( "тавь", 50 )
+  , ( "жаран", 60 )
+  , ( "жар", 60 )
+  , ( "далан", 70 )
+  , ( "дал", 70 )
+  , ( "наян", 80 )
+  , ( "ная", 80 )
+  , ( "ерэн", 90 )
+  , ( "ер", 90 )
+  ]
+
+
+
+ruleOrdinalsFirstth :: Rule
+ruleOrdinalsFirstth = Rule
+  { name = "ordinals (first..19th)"
+  , pattern =
+    [ regex "(нэг|хоёр|гурав|дөрөв|тав|зургаа|долоо|найм|ес|арав) ?(дугаар|дүгээр|дахь|дэх)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsFirstthMap
+      _ -> Nothing
+  }
+
+ruleOrdinal :: Rule
+ruleOrdinal = Rule
+  { name = "ordinal 10..99"
+  , pattern =
+    [ regex "(арван|хорин|гучин|дөчин|тавин|жаран|далан|наян|ерэн) ?(нэг|хоёр|гурав|дөрөв|тав|зургаа|долоо|найм|ес) ?(дугаар|дүгээр|дахь|дэх)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:_)):
+       Token RegexMatch (GroupMatch (m2:_)):
+       _) -> do
+         dozen <- HashMap.lookup (Text.toLower m1) cardinalsMap
+         unit <- HashMap.lookup (Text.toLower m2) ordinalsFirstthMap
+         Just . ordinal $ dozen + unit
+      _ -> Nothing
+  }
+
+ -- TODO: Single-word composition (#110)
+ruleInteger2 :: Rule
+ruleInteger2 = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(хорь|гуч|дөч|тавь|жар|дал|ная|ер) ?(дугаар|дүгээр|дахь|дэх)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+         ordinal <$> HashMap.lookup (Text.toLower match) cardinalsMap
+      _ -> 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
+  }
+
+ruleOrdinalDigits2 :: Rule
+ruleOrdinalDigits2 = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "(?<!\\d|\\.)0*(\\d+)(\\.(?!\\d)| ?(дугаар|дүгээр|дахь|дэх))"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        v <- parseInt match
+        Just $ ordinal v
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinalDigits
+  , ruleOrdinalDigits2
+  , ruleOrdinal
+  , ruleInteger2
+  , ruleOrdinalsFirstth
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Ordinal/NL/Rules.hs b/Duckling/Ordinal/NL/Rules.hs
--- a/Duckling/Ordinal/NL/Rules.hs
+++ b/Duckling/Ordinal/NL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -12,8 +11,8 @@
   ( corpus
   ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Locale
 import Duckling.Ordinal.Types
@@ -35,6 +34,50 @@
              ]
   , examples (OrdinalData 7)
              [ "setimo"
+             , "sétimo"
              , "sétimas"
+             ]
+  , examples (OrdinalData 10)
+             [ "decimos"
+             , "décimos"
+             , "decima"
+             , "décima"
+             , "decimas"
+             , "décimas"
+             ]
+  , examples (OrdinalData 11)
+             [ "decimos primeiros"
+             , "décimos primeiros"
+             , "decimo primeiro"
+             , "décimo primeiro"
+             , "decimas primeiras"
+             , "décimas primeiras"
+             , "decima primeira"
+             , "décima primeira"
+             ]
+  , examples (OrdinalData 12)
+             [ "decimos segundos"
+             , "décimos segundos"
+             , "decimo segundo"
+             , "décimo segundo"
+             , "decimas segundas"
+             , "décimas segundas"
+             , "decima segunda"
+             , "décima segunda"
+             ]
+  , examples (OrdinalData 17)
+             [ "decimos setimos"
+             , "décimos setimos"
+             , "decimo setimo"
+             , "décimo sétimo"
+             , "decimas setimas"
+             , "décimas sétimas"
+             , "decima setima"
+             , "décima setima"
+             ]
+  , examples (OrdinalData 58)
+             [ "quinquagésimas oitavas"
+             , "qüinquagesimo oitavo"
+             , "quinquagésimo oitavo"
              ]
   ]
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
@@ -2,86 +2,101 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Ordinal.PT.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
-import qualified Data.Text as Text
-import Prelude
+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.Ordinal.Helpers
-import Duckling.Regex.Types
+import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Regex.Types (GroupMatch (..))
 import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 
-ruleOrdinalsPrimeiro :: Rule
-ruleOrdinalsPrimeiro = Rule
-  { name = "ordinals (primeiro..10)"
+ordinalsMap :: HashMap Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "primeir", 1 )
+  , ( "segund", 2 )
+  , ( "terceir", 3 )
+  , ( "quart", 4 )
+  , ( "quint", 5 )
+  , ( "sext", 6 )
+  , ( "setim", 7 )
+  , ( "sétim", 7 )
+  , ( "oitav", 8 )
+  , ( "non", 9 )
+  , ( "decim", 10 )
+  , ( "décim", 10 )
+  ]
+
+ruleOrdinals :: Rule
+ruleOrdinals = Rule
+  { name = "ordinals (1..10)"
   , pattern =
-    [ regex "((primeir|segund|quart|quint|sext|s(e|é)tim|oitav|non|d(e|é)cim)(os?|as?))"
+    [ regex "(primeir|segund|terceir|quart|quint|sext|s[ée]tim|oitav|non|d[ée]cim)[ao]s?"
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "primeira" -> Just $ ordinal 1
-        "primeiros" -> Just $ ordinal 1
-        "primeiras" -> Just $ ordinal 1
-        "primeiro" -> Just $ ordinal 1
-        "segundo" -> Just $ ordinal 2
-        "segunda" -> Just $ ordinal 2
-        "segundas" -> Just $ ordinal 2
-        "segundos" -> Just $ ordinal 2
-        "terceiros" -> Just $ ordinal 3
-        "terceiro" -> Just $ ordinal 3
-        "terceiras" -> Just $ ordinal 3
-        "terceira" -> Just $ ordinal 3
-        "quartos" -> Just $ ordinal 4
-        "quarto" -> Just $ ordinal 4
-        "quarta" -> Just $ ordinal 4
-        "quartas" -> Just $ ordinal 4
-        "quinto" -> Just $ ordinal 5
-        "quinta" -> Just $ ordinal 5
-        "quintas" -> Just $ ordinal 5
-        "quintos" -> Just $ ordinal 5
-        "sextos" -> Just $ ordinal 6
-        "sexto" -> Just $ ordinal 6
-        "sexta" -> Just $ ordinal 6
-        "sextas" -> Just $ ordinal 6
-        "setimas" -> Just $ ordinal 7
-        "sétima" -> Just $ ordinal 7
-        "setimo" -> Just $ ordinal 7
-        "setimos" -> Just $ ordinal 7
-        "setima" -> 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
-        "oitavos" -> Just $ ordinal 8
-        "nonos" -> Just $ ordinal 9
-        "nona" -> Just $ ordinal 9
-        "nono" -> Just $ ordinal 9
-        "nonas" -> Just $ ordinal 9
-        "décimos" -> Just $ ordinal 10
-        "decimo" -> Just $ ordinal 10
-        "decimos" -> Just $ ordinal 10
-        "décimo" -> Just $ ordinal 10
-        "decimas" -> Just $ ordinal 10
-        "décima" -> Just $ ordinal 10
-        "decima" -> Just $ ordinal 10
-        "décimas" -> Just $ ordinal 10
-        _ -> Nothing
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
       _ -> Nothing
   }
 
+cardinalsMap :: HashMap Text Int
+cardinalsMap = HashMap.fromList
+  [ ( "vi", 20 )
+  , ( "tri", 30 )
+  , ( "quadra", 40 )
+  , ( "qüinqua", 50 )
+  , ( "quinqua", 50 )
+  , ( "sexa", 60 )
+  , ( "septua", 70 )
+  , ( "octo", 80 )
+  , ( "nona", 90 )
+  ]
+
+ruleCardinals :: Rule
+ruleCardinals = Rule
+  { name = "cardinals (20 .. 90)"
+  , pattern =
+    [ regex "(vi|tri|quadra|q[üu]inqua|sexa|septua|octo|nona)g[ée]sim[ao]s?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) cardinalsMap
+      _ -> Nothing
+  }
+
+ruleCompositeOrdinals :: Rule
+ruleCompositeOrdinals = Rule
+  { name = "ordinals (11..19)"
+  , pattern =
+    [ oneOf [10, 20 .. 90]
+    , oneOf [1..9]
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = t}:
+       Token Ordinal OrdinalData{TOrdinal.value = u}:
+       _) -> Just $ ordinal $ t + u
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
-  [ ruleOrdinalsPrimeiro
+  [ ruleOrdinals
+  , ruleCardinals
+  , ruleCompositeOrdinals
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/TA/Corpus.hs b/Duckling/Ordinal/TA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/TA/Corpus.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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Ordinal.TA.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 TA Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "முதல்"
+             , "1."
+             ]
+  , examples (OrdinalData 2)
+             [ "இரண்டாம்"
+             , "2."
+             ]
+  , examples (OrdinalData 3)
+             [ "மூன்றாம்"
+             , "3."
+             ]
+  , examples (OrdinalData 4)
+             [ "நான்காம்"
+             , "4."
+             ]
+  , examples (OrdinalData 5)
+             [ "ஐந்தாம்"
+             , "5."
+             ]
+  , examples (OrdinalData 6)
+             [ "ஆறாம்"
+             , "6."
+             ]
+  , examples (OrdinalData 7)
+             [ "ஏழாம்"
+             , "7."
+             ]
+  , examples (OrdinalData 8)
+             [ "எட்டாம்"
+             , "8."
+             ]
+  , examples (OrdinalData 9)
+             [ "ஒன்பதாம்"
+             , "9."
+             ]
+  , examples (OrdinalData 10)
+             [ "பத்தாம்"
+             , "10."
+             ]
+  , examples (OrdinalData 11)
+             [ "பதினொன்றாம்"
+             , "11."
+             ]
+  , examples (OrdinalData 12)
+             [ "பன்னிரண்டாம்"
+             , "12."
+             ]
+  , examples (OrdinalData 20)
+             [ "இருபதாம்"
+             , "20."
+             ]
+  , examples (OrdinalData 21)
+             [ "இருபத்திஒன்றாம்"
+             , "21."
+             ]
+  , examples (OrdinalData 22)
+             [ "இருபத்திஇரண்டாம்"
+             , "22."
+             ]
+  , examples (OrdinalData 26)
+             [ "இருபத்திஆறாம்"
+             , "26."
+             ]
+  , examples (OrdinalData 30)
+             [ "முப்பதாம்"
+             , "30."
+             ]
+   , examples (OrdinalData 33)
+             [ "முப்பத்துமூன்றாம்"
+             , "33."
+             ]
+  , examples (OrdinalData 50)
+             [ "ஐம்பதாம்"
+             , "50."
+             ]
+   , examples (OrdinalData 54)
+              [ "ஐம்பத்திநான்காம்"
+              , "54."
+              ]
+   , examples (OrdinalData 65)
+              [ "அறுபத்ஐந்தாம்"
+              , "65."
+              ]
+   , examples (OrdinalData 76)
+              [ "எழுபத்திஆறாம்"
+              , "76."
+              ]
+   , examples (OrdinalData 87)
+              [ "எண்பத்திஏழாம்"
+              , "87."
+              ]
+  ]
diff --git a/Duckling/Ordinal/TA/Rules.hs b/Duckling/Ordinal/TA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/TA/Rules.hs
@@ -0,0 +1,161 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Ordinal.TA.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
+
+oneToNineMap :: HashMap Text Int
+oneToNineMap = HashMap.fromList
+  [ ( "முதல்", 1 )
+  , ( "இரண்டாம்", 2 )
+  , ( "மூன்றாம்", 3 )
+  , ( "நான்காம்", 4 )
+  , ( "ஐந்தாம்", 5 )
+  , ( "ஆறாம்", 6 )
+  , ( "ஏழாம்", 7 )
+  , ( "எட்டாம்", 8 )
+  , ( "ஒன்பதாம்", 9 )
+  ]
+
+
+ruleOneToNine :: Rule
+ruleOneToNine = Rule
+  { name = "integer (1..9)"
+  , pattern =
+    [ regex "(முதல்|இரண்டாம்|மூன்றாம்|நான்காம்|ஐந்தாம்|ஆறாம்|ஏழாம்|எட்டாம்|ஒன்பதாம்)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) oneToNineMap
+      _ -> Nothing
+  }
+
+tenToNineteenMap :: HashMap Text Int
+tenToNineteenMap = HashMap.fromList
+  [ ( "பத்தாம்", 10 )
+  , ( "பதினொன்றாம்", 11 )
+  , ( "பன்னிரண்டாம்", 12 )
+  , ( "பதின்மூன்றாம்", 13 )
+  , ( "பதினான்காம்", 14 )
+  , ( "பதினைந்தாம்", 15 )
+  , ( "பதினாறாம்", 16 )
+  , ( "பதினேழாம்", 17 )
+  , ( "பதினெட்டாம்", 18 )
+  , ( "பத்தொன்பதாம்", 19 )
+  ]
+
+ruleTenToNineteen :: Rule
+ruleTenToNineteen = Rule
+  { name = "integer (10..19)"
+  , pattern =
+    [ regex "(பத்தாம்|பதினொன்றாம்|பன்னிரண்டாம்|பதின்மூன்றாம்|பதினான்காம்|பதினைந்தாம்|பதினாறாம்|பதினேழாம்|பதினெட்டாம்|பத்தொன்பதாம்)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) tenToNineteenMap
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Int
+tensMap = HashMap.fromList
+  [ ( "இருபதாம்", 20 )
+  , ( "முப்பதாம்", 30 )
+  , ( "நாற்பதாம்", 40 )
+  , ( "ஐம்பதாம்", 50 )
+  , ( "அறுபதாம்", 60 )
+  , ( "எழுபதாம்", 70 )
+  , ( "எண்பதாம்", 80 )
+  , ( "தொண்ணூறாம்", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(இருபதாம்|முப்பதாம்|நாற்பதாம்|ஐம்பதாம்|அறுபதாம்|எழுபதாம்|எண்பதாம்|தொண்ணூறாம்)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) tensMap
+      _ -> Nothing
+  }
+tensOrdinalMap :: HashMap Text Int
+tensOrdinalMap = HashMap.fromList
+  [ ( "இருபத்தி", 20 )
+  , ( "முப்பத்து", 30 )
+  , ( "நாற்பத்து", 40 )
+  , ( "ஐம்பத்தி", 50 )
+  , ( "அறுபத்", 60 )
+  , ( "எழுபத்தி", 70 )
+  , ( "எண்பத்தி", 80 )
+  , ( "தொண்ணுற்று", 90 )
+  ]
+
+oneToNineOrdinalMap :: HashMap Text Int
+oneToNineOrdinalMap = HashMap.fromList
+  [ ( "ஒன்றாம்", 1 )
+  , ( "இரண்டாம்", 2 )
+  , ( "மூன்றாம்", 3 )
+  , ( "நான்காம்", 4 )
+  , ( "ஐந்தாம்", 5 )
+  , ( "ஆறாம்", 6 )
+  , ( "ஏழாம்", 7 )
+  , ( "எட்டாம்", 8 )
+  , ( "ஒன்பதாம்", 9 )
+  ]
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([2-9][1-9])"
+  , pattern =
+    [ regex "(இருபத்தி|முப்பத்து|நாற்பத்து|ஐம்பத்தி|அறுபத்|எழுபத்தி|எண்பத்தி|தொண்ணுற்று)(ஒன்றாம்|இரண்டாம்|மூன்றாம்|நான்காம்|ஐந்தாம்|ஆறாம்|ஏழாம்|எட்டாம்|ஒன்பதாம்)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) tensOrdinalMap
+        v2 <- HashMap.lookup (Text.toLower m2) oneToNineOrdinalMap
+        Just $ ordinal $ (v1 + v2)
+      _ -> Nothing
+  }
+
+ruleOrdinalDigits :: Rule
+ruleOrdinalDigits = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "0*(\\d+)\\."
+    ]
+  , prod = \case
+    (   Token RegexMatch (GroupMatch (match :_)) : _) -> ordinal <$> parseInt match
+    _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinalDigits
+  , ruleOneToNine
+  , ruleTenToNineteen
+  , ruleTens
+  , ruleCompositeTens
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ordinal/Types.hs b/Duckling/Ordinal/Types.hs
--- a/Duckling/Ordinal/Types.hs
+++ b/Duckling/Ordinal/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/PhoneNumber/AR/Corpus.hs b/Duckling/PhoneNumber/AR/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/PhoneNumber/AR/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.PhoneNumber.AR.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Locale
+import Duckling.PhoneNumber.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus =
+  (testContext { locale = makeLocale AR Nothing }, testOptions, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext, testOptions, xs)
+  where
+    xs =
+      [ "١٢٣٤٥"
+      , "١٢٣٤٥٦٧٨٩٠١٢٣٤٥٦٧٧٧٧٧٧"
+      , "١٢٣٤٥٦٧٨٩٠١٢٣٤٥٦"
+      ]
+
+-- Tests include both unicode characters and equivalent unicode decimal code
+-- representation because the Arabic phone number regex is constructed with
+-- unicode decimal form.
+allExamples :: [Example]
+allExamples =
+  concat
+    [ examples (PhoneNumberValue "6507018887")
+               [ "٦٥٠٧٠١٨٨٨٧"
+               , "\1638\1637\1632\1639\1632\1633\1640\1640\1640\1639"
+               , "٦٥٠ ٧٠١ ٨٨٨٧"
+               , "\1638\1637\1632 \1639\1632\1633 \1640\1640\1640\1639"
+               , "٦٥٠-٧٠١-٨٨٨٧"
+               , "\1638\1637\1632-\1639\1632\1633-\1640\1640\1640\1639"
+               ]
+    , examples (PhoneNumberValue "(+1) 6507018887")
+               [ "+١ ٦٥٠٧٠١٨٨٨٧"
+               , "+\1633 \1638\1637\1632\1639\1632\1633\1640\1640\1640\1639"
+               , "(+١)٦٥٠٧٠١٨٨٨٧"
+               , "(+\1633)\1638\1637\1632\1639\1632\1633\1640\1640\1640\1639"
+               , "(+١)   ٦٥٠ - ٧٠١  ٨٨٨٧"
+               , "(+\1633)    \1638\1637\1632 - \1639\1632\1633  \1640\1640\1640\1639"
+               ]
+    , examples (PhoneNumberValue "(+33) 146647998")
+               [ "+٣٣ ١ ٤٦٦٤٧٩٩٨"
+               , "+\1635\1635 \1633 \1636\1638\1638\1636\1639\1641\1641\1640"
+               ]
+    , examples (PhoneNumberValue "0620702220")
+               [ "٠٦ ٢٠٧٠ ٢٢٢٠"
+               ]
+    , examples (PhoneNumberValue "6507018887 ext 897")
+               [ "٦٥٠٧٠١٨٨٨٧ ext ٨٩٧"
+               , "٦٥٠٧٠١٨٨٨٧ x ٨٩٧"
+               , "٦٥٠٧٠١٨٨٨٧ ext. ٨٩٧"
+               ]
+    , examples (PhoneNumberValue "6507018887 ext 897")
+               [ "٦٥٠٧٠١٨٨٨٧ فرعي ٨٩٧"
+               ]
+    , examples (PhoneNumberValue "(+1) 2025550121")
+               [ "+١-٢٠٢-٥٥٥-٠١٢١"
+               , "+١ ٢٠٢.٥٥٥.٠١٢١"
+               ]
+    , examples (PhoneNumberValue "4866827")
+               [ "٤.٨.٦.٦.٨.٢.٧"
+               ]
+    , examples (PhoneNumberValue "(+55) 19992842606")
+               [ "(+٥٥) ١٩٩٩٢٨٤٢٦٠٦"
+               ]
+    ]
diff --git a/Duckling/PhoneNumber/AR/Rules.hs b/Duckling/PhoneNumber/AR/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/PhoneNumber/AR/Rules.hs
@@ -0,0 +1,55 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Duckling.PhoneNumber.AR.Rules (rules) where
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.AR.Helpers
+  ( parseArabicIntAsText
+  , parseArabicIntegerFromText
+  )
+import Duckling.PhoneNumber.Types (PhoneNumberData(..))
+import Duckling.Regex.Types
+import Duckling.Types
+import Prelude
+
+import qualified Data.Text as Text
+import qualified Duckling.PhoneNumber.Types as TPhoneNumber
+
+rulePhoneNumber :: Rule
+rulePhoneNumber = Rule
+  { name = "phone number"
+  , pattern =
+    -- Arabic is a right to left langauge except for numbers, which are read
+    -- left to right. This regex uses the unicode range for Arabic numbers
+    -- [\1632-\1641] to make the code easier to read and maintain. The unicode
+    -- sequence \1601\1585\1593\1610, corresponding to فرعي, is a popular
+    -- Arabic equivalent for "extension" and is used in this regex.
+    [ regex $
+        "(?:\\(?\\+([\1632-\1641]{1,2})\\)?[\\s-\\.]*)?" ++ -- area code
+        "((?=[-\1632-\1641()\\s\\.]{6,16}(?:\\s*(?:e?xt?|\1601\1585\1593\1610)?\\.?\\s*(?:[\1632-\1641]{1,20}))?(?:[^\1632-\1641]+|$))(?:[\1632-\1641(]{1,20}(?:[-)\\s\\.]*[\1632-\1641]{1,20}){0,20}){1,20})" ++ -- nums
+        "(?:\\s*(?:e?xt?|\1601\1585\1593\1610)\\.?\\s*([\1632-\1641]{1,20}))?" -- extension
+    ]
+  , prod = \xs -> case xs of
+      (Token RegexMatch (GroupMatch (code:nums:ext:_)):_) ->
+        let
+            mnums = parseArabicIntAsText $ cleanup nums
+            cleanup = Text.filter (not . isWhitespace)
+            isWhitespace x = elem x ['.', ' ', '-', '\t', '(', ')']
+        in Just $ Token PhoneNumber $ PhoneNumberData
+          { TPhoneNumber.prefix = parseArabicIntegerFromText code
+          , TPhoneNumber.number = mnums
+          , TPhoneNumber.extension = parseArabicIntegerFromText ext
+          }
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules = [rulePhoneNumber]
diff --git a/Duckling/PhoneNumber/Corpus.hs b/Duckling/PhoneNumber/Corpus.hs
--- a/Duckling/PhoneNumber/Corpus.hs
+++ b/Duckling/PhoneNumber/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/PhoneNumber/PT/Rules.hs b/Duckling/PhoneNumber/PT/Rules.hs
--- a/Duckling/PhoneNumber/PT/Rules.hs
+++ b/Duckling/PhoneNumber/PT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/PhoneNumber/Rules.hs b/Duckling/PhoneNumber/Rules.hs
--- a/Duckling/PhoneNumber/Rules.hs
+++ b/Duckling/PhoneNumber/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/PhoneNumber/Types.hs b/Duckling/PhoneNumber/Types.hs
--- a/Duckling/PhoneNumber/Types.hs
+++ b/Duckling/PhoneNumber/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -51,4 +50,7 @@
   deriving (Eq, Ord, Show)
 
 instance ToJSON PhoneNumberValue where
-  toJSON (PhoneNumberValue value) = object [ "value" .= value ]
+  toJSON (PhoneNumberValue value) = object
+    [ "value" .= value
+    , "type"  .= ("value" :: Text)
+    ]
diff --git a/Duckling/Quantity/AR/Corpus.hs b/Duckling/Quantity/AR/Corpus.hs
--- a/Duckling/Quantity/AR/Corpus.hs
+++ b/Duckling/Quantity/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Quantity/AR/Rules.hs b/Duckling/Quantity/AR/Rules.hs
--- a/Duckling/Quantity/AR/Rules.hs
+++ b/Duckling/Quantity/AR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -98,9 +97,6 @@
   , ( "كيلو جرامين", (* 2000))
   ]
 
-getValue :: Text -> Double -> Double
-getValue match = HashMap.lookupDefault id (Text.toLower match) opsMap
-
 ruleNumeralQuantities :: [Rule]
 ruleNumeralQuantities = map go quantities
   where
@@ -112,7 +108,7 @@
         (Token Numeral nd:
          Token RegexMatch (GroupMatch (match:_)):
          _) -> Just . Token Quantity $ quantity u value
-          where value = getValue match $ TNumeral.value nd
+          where value = getValue opsMap match $ TNumeral.value nd
         _ -> Nothing
       }
 
@@ -125,7 +121,7 @@
       , pattern = [ regex regexPattern ]
       , prod = \tokens -> case tokens of
         (Token RegexMatch (GroupMatch (match:_)):
-         _) -> Just . Token Quantity $ quantity u $ getValue match 1
+         _) -> Just . Token Quantity $ quantity u $ getValue opsMap match 1
         _ -> Nothing
       }
 
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
@@ -2,24 +2,43 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Quantity.EN.Corpus
-  ( corpus ) where
+  ( corpus
+  , latentCorpus
+  ) where
 
 import Prelude
 import Data.String
 
 import Duckling.Quantity.Types
+import Duckling.Resolve (Options(..))
 import Duckling.Testing.Types
 
 corpus :: Corpus
 corpus = (testContext, testOptions, allExamples)
 
+
+latentCorpus :: Corpus
+latentCorpus = (testContext, testOptions {withLatent = True}, latentExamples)
+  where
+    latentExamples = concat
+      [
+      examples (simple Unnamed 4 Nothing)
+                [ "around 4"
+                , "four"
+                , "~ four"
+                ]
+      ,
+      examples (simple Unnamed 38.5 Nothing)
+                [ "about 38.5"
+                ]
+      ]
+
 allExamples :: [Example]
 allExamples = concat
   [ examples (simple Pound 2 (Just "meat"))
@@ -28,12 +47,18 @@
   , examples (simple Gram 2 Nothing)
              [ "2 grams"
              , "0.002 kg"
+             , "2 g."
+             , "2 gs"
              , "2/1000 kilograms"
              , "2000 milligrams"
+             , "2,000 milligrams"
              ]
   , examples (simple Gram 1000 Nothing)
              [ "a kilogram"
              , "a kg"
+             , "1 k.g."
+             , "1 k.gs"
+             , "1000 gs"
              ]
   , examples (simple Pound 1 Nothing)
              [ "a Pound"
@@ -46,6 +71,7 @@
              ]
   , examples (simple Cup 3 (Just "sugar"))
              [ "3 Cups of sugar"
+             , "3 Cups of SugAr"
              ]
   , examples (simple Cup 0.75 Nothing)
              [ "3/4 cup"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,9 +23,9 @@
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers
 import Duckling.Quantity.Helpers
-import Duckling.Regex.Types
+import Duckling.Regex.Types (GroupMatch(..))
 import Duckling.Types
-import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Quantity.Types (QuantityData(..))
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Quantity.Types as TQuantity
@@ -34,7 +33,7 @@
 quantities :: [(Text, String, TQuantity.Unit)]
 quantities =
   [ ("<quantity> cups", "(cups?)", TQuantity.Cup)
-  , ("<quantity> grams", "(((m(illi)?)|(k(ilo)?))?g(ram)?s?)", TQuantity.Gram)
+  , ("<quantity> grams", "(((m(illi)?[.]?)|(k(ilo)?)[.]?)?g(ram)?s?[.]?)[.]?", TQuantity.Gram)
   , ("<quantity> lb", "((lb|pound)s?)", TQuantity.Pound)
   , ("<quantity> oz", "((ounces?)|oz)", TQuantity.Ounce)
   ]
@@ -45,15 +44,20 @@
   , ( "milligrams", (/ 1000))
   , ( "mg"        , (/ 1000))
   , ( "mgs"       , (/ 1000))
+  , ( "m.g"       , (/ 1000))
+  , ( "m.gs"      , (/ 1000))
+  , ( "m.g."      , (/ 1000))
+  , ( "m.g.s"     , (/ 1000))
   , ( "kilogram"  , (* 1000))
   , ( "kilograms" , (* 1000))
   , ( "kg"        , (* 1000))
   , ( "kgs"       , (* 1000))
+  , ( "k.g"       , (* 1000))
+  , ( "k.gs"      , (* 1000))
+  , ( "k.g."      , (* 1000))
+  , ( "k.g.s"     , (* 1000))
   ]
 
-getValue :: Text -> Double -> Double
-getValue match = HashMap.lookupDefault id (Text.toLower match) opsMap
-
 ruleNumeralQuantities :: [Rule]
 ruleNumeralQuantities = map go quantities
   where
@@ -65,7 +69,7 @@
         (Token Numeral nd:
          Token RegexMatch (GroupMatch (match:_)):
          _) -> Just . Token Quantity $ quantity u value
-          where value = getValue match $ TNumeral.value nd
+          where value = getValue opsMap match $ TNumeral.value nd
         _ -> Nothing
       }
 
@@ -78,7 +82,7 @@
       , pattern = [ regex ("an? " ++ regexPattern) ]
       , prod = \case
         (Token RegexMatch (GroupMatch (match:_)):
-         _) -> Just . Token Quantity $ quantity u $ getValue match 1
+         _) -> Just . Token Quantity $ quantity u $ getValue opsMap match 1
         _ -> Nothing
       }
 
@@ -91,7 +95,7 @@
     ]
   , prod = \case
     (Token Quantity qd:Token RegexMatch (GroupMatch (product:_)):_) ->
-      Just . Token Quantity $ withProduct product qd
+      Just . Token Quantity $ withProduct (Text.toLower product) qd
     _ -> Nothing
   }
 
@@ -191,8 +195,6 @@
         _ -> Nothing
     }
 
-
-
 ruleIntervalMax :: Rule
 ruleIntervalMax = Rule
     { name = "under/below/less/lower/at most/no more than <dist>"
@@ -224,6 +226,20 @@
          _) -> Just . Token Quantity . withMin from $ unitOnly u
         _ -> Nothing
     }
+
+ruleQuantityLatent :: Rule
+ruleQuantityLatent = Rule
+  { name = "<quantity> (latent)"
+  , pattern =
+    [ Predicate isPositive
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}: _) ->
+        Just $ (Token Quantity . mkLatent) $ valueOnly v
+      _ -> Nothing
+  }
+
+
 rules :: [Rule]
 rules =
   [ ruleQuantityOfProduct
@@ -234,6 +250,7 @@
   , ruleIntervalNumeralDash
   , ruleIntervalDash
   , rulePrecision
+  , ruleQuantityLatent
   ]
   ++ ruleNumeralQuantities
   ++ ruleAQuantity
diff --git a/Duckling/Quantity/ES/Corpus.hs b/Duckling/Quantity/ES/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/ES/Corpus.hs
@@ -0,0 +1,86 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Quantity.ES.Corpus
+  ( corpus
+  ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Locale
+import Duckling.Quantity.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext { locale = makeLocale ES Nothing }
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Pound 2 (Just "carne"))
+             [ "dos libras de carne"
+             ]
+  , examples (simple Gram 2 Nothing)
+             [ "dos gramos"
+             , "0,002 kg"
+             , "2/1000 kilogramos"
+             , "2000 miligramos"
+             ]
+  , examples (simple Gram 1000 Nothing)
+             [ "un kilogramo"
+             , "un kg"
+             ]
+  , examples (simple Pound 1 Nothing)
+             [ "una libra"
+             , "1 lb"
+             , "una lb"
+             ]
+  , examples (simple Ounce 2 Nothing)
+             [ "2 onzas"
+             , "2oz"
+             ]
+  , examples (simple Cup 3 (Just "azucar"))
+             [ "tres tazas de azucar"
+             , "3 tazas de AzUcAr"
+             ]
+  , examples (simple Cup 0.75 Nothing)
+             [ "3/4 taza"
+             , "0,75 taza"
+             , ",75 tazas"
+             ]
+  , examples (simple Gram 500 (Just "fresas"))
+             [ "500 gramos de fresas"
+             , "500g de fresas"
+             , "0,5 kilogramos de fresas"
+             , "0,5 kg de fresas"
+             , "500000mg de fresas"
+             ]
+  , examples (under Pound 6 (Just "carne"))
+              [ "menos que seis libras de carne"
+              , "no más que 6 lbs de carne"
+              , "por debajo de 6,0 libras de carne"
+              , "a lo sumo seis libras de carne"
+              ]
+  , examples (above Cup 2 Nothing)
+              [ "excesivo 2 tazas"
+              , "como mínimo dos tazas"
+              , "mayor de 2 tazas"
+              , "más de 2 tazas"
+              ]
+  , examples (above Ounce 4 (Just "chocolate"))
+              [ "excesivo 4 oz de chocolate"
+              , "al menos 4,0 oz de chocolate"
+              , "mayor de cuatro onzas de chocolate"
+              , "más de cuatro onzas de chocolate"
+              ]
+  ]
diff --git a/Duckling/Quantity/ES/Rules.hs b/Duckling/Quantity/ES/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/ES/Rules.hs
@@ -0,0 +1,258 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Quantity.ES.Rules
+  ( rules
+  ) where
+
+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
+import Duckling.Quantity.Helpers
+import Duckling.Regex.Types (GroupMatch(..))
+import Duckling.Types
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Quantity.Types (QuantityData(..))
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.Quantity.Types as TQuantity
+
+-- Our quantities: (name, regex, quantityType). Please make sure to wrap
+-- each regex in parentheses, because we extend these regexes later with
+-- articles (un/una).
+quantities :: [(Text, String, TQuantity.Unit)]
+quantities =
+  [ ("<quantity> bowls", "(bol(es)?|tazón(es)?|cuencos?|platos? (soperos?)|(hondos?))", TQuantity.Bowl)
+  , ("<quantity> cups", "(tazas?)", TQuantity.Cup)
+  , ("<quantity> dishes", "(platos?|fuentes?)", TQuantity.Dish)
+  , ("<quantity> grams", "(((m(ili)?)|(k(ilo)?))?g(ramo)?s?)", TQuantity.Gram)
+  , ("<quantity> ounces", "((onzas?)|oz)", TQuantity.Ounce)
+  , ("<quantity> pints", "(pintas?)", TQuantity.Pint)
+  , ("<quantity> pounds", "((lb|libra)s?)", TQuantity.Pound)
+  , ("<quantity> quarts", "(cuartos? de galón)", TQuantity.Quart)
+  , ("<quantity> tablespoons", "(cucharadas? (grande)?)", TQuantity.Tablespoon)
+  , ("<quantity> teaspoons", "(cucharaditas?)", TQuantity.Teaspoon)
+  ]
+
+opsMap :: HashMap Text (Double -> Double)
+opsMap = HashMap.fromList
+  [ ( "miligram"   , (/ 1000))
+  , ( "miligramos" , (/ 1000))
+  , ( "mg"         , (/ 1000))
+  , ( "mgs"        , (/ 1000))
+  , ( "kilogramo"  , (* 1000))
+  , ( "kilogramos" , (* 1000))
+  , ( "kg"         , (* 1000))
+  , ( "kgs"        , (* 1000))
+  ]
+
+ruleNumeralQuantities :: [Rule]
+ruleNumeralQuantities = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit) -> Rule
+    go (nm, regexPattern, u) = Rule
+      { name = nm
+      , pattern = [Predicate isPositive, regex regexPattern]
+      , prod = \case
+        (Token Numeral nd:
+         Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just $ Token Quantity $ quantity u val
+          where val = getValue opsMap match $ TNumeral.value nd
+        _ -> Nothing
+      }
+
+-- Quantities prefixed by "un" or "una"
+ruleAQuantity :: [Rule]
+ruleAQuantity = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit) -> Rule
+    go (nm, regexPattern, u) = Rule
+      { name = nm
+      , pattern = [ regex ("una? " ++ regexPattern) ]
+      , prod = \case
+        (Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just $ Token Quantity $ quantity u $ getValue opsMap match 1
+        _ -> Nothing
+      }
+
+ruleQuantityOfProduct :: Rule
+ruleQuantityOfProduct = Rule
+  { name = "<quantity> de producto"
+  , pattern =
+    [ dimension Quantity
+    , regex "de (\\w+)"
+    ]
+  , prod = \case
+    (Token Quantity qd:Token RegexMatch (GroupMatch (prdct:_)):_) ->
+      Just $ Token Quantity $ withProduct (Text.toLower prdct) qd
+    _ -> Nothing
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+    { name = "about|exactly <quantity>"
+    , pattern =
+      [ regex "exactamente|precisamente|a?cerca( de)?|aproximadamente|casi"
+      , dimension Quantity
+      ]
+      , prod = \case
+        (_:tkn:_) -> Just tkn
+        _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+    { name = "between|from <numeral> and|to <quantity>"
+    , pattern =
+      [ regex "entre|de"
+      , Predicate isPositive
+      , regex "a|y"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Numeral NumeralData{TNumeral.value = from}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to ->
+          Just $ Token Quantity $ withInterval (from, to) $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+    { name = "between|from <quantity> to|and <quantity>"
+    , pattern =
+      [ regex "entre/de"
+      , Predicate isSimpleQuantity
+      , regex "a/y"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u1
+                                    , TQuantity.aproduct = Nothing}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u2
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to && u1 == u2 ->
+          Just $ Token Quantity $ withInterval (from, to) $ unitOnly u1
+        _ -> Nothing
+    }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+    { name = "<numeral> - <quantity>"
+    , pattern =
+      [ Predicate isPositive
+      , regex "\\-"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (Token Numeral NumeralData{TNumeral.value = from}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to ->
+           Just $ Token Quantity $ withInterval (from, to) $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+    { name = "<quantity> - <quantity>"
+    , pattern =
+      [ Predicate isSimpleQuantity
+      , regex "\\-"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u1
+                                    , TQuantity.aproduct = Nothing}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u2
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to && u1 == u2 ->
+          Just $ Token Quantity $ withInterval (from, to) $ unitOnly u1
+        _ -> Nothing
+    }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+    { name = "under/below/less/lower/at most/no more than <dist>"
+    , pattern =
+      [ regex "no m(á|a)s que|menos de|por debajo de|como mucho|como m(á|a)xim(o|a)|a lo sumo|menos (que|de)"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) -> Just $ Token Quantity $ withMax to $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "over/above/exceeding/beyond/at least/more than <quantity>"
+  , pattern =
+      [ regex "(?<!no )m(á|a)s( grande| pesado)? (de|que)|mayor de|por encima de|excesivo|fuera de|por lo menos|como m(í|i)nim(o|a)|al menos"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) -> Just $ Token Quantity $ withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleQuantityLatent :: Rule
+ruleQuantityLatent = Rule
+  { name = "<quantity> (latent)"
+  , pattern =
+    [ Predicate isPositive
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}: _) ->
+        Just $ Token Quantity $ mkLatent $ valueOnly v
+      _ -> Nothing
+  }
+
+
+rules :: [Rule]
+rules =
+  [ ruleQuantityOfProduct
+  , ruleIntervalMin
+  , ruleIntervalMax
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePrecision
+  , ruleQuantityLatent
+  ]
+  ++ 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,27 +2,28 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Quantity.FR.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
-import qualified Data.Text as Text
-import Prelude
 import Data.String
+import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Quantity.Helpers
-import qualified Duckling.Quantity.Types as TQuantity
 import Duckling.Numeral.Types (NumeralData (..))
-import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.Quantity.Types as TQuantity
 
 ruleNumeralUnits :: Rule
 ruleNumeralUnits = Rule
@@ -31,7 +32,7 @@
     [ dimension Numeral
     , regex "(tasses?|cuill?(e|è)res? (a|à) soupe?)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData {TNumeral.value = v}:
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case Text.toLower match of
@@ -48,7 +49,7 @@
     [ dimension Quantity
     , regex "de (caf(e|é)|sucre)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Quantity qd:
        Token RegexMatch (GroupMatch (match:_)):
        _) -> Just . Token Quantity $ withProduct match 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Quantity/HR/Rules.hs b/Duckling/Quantity/HR/Rules.hs
--- a/Duckling/Quantity/HR/Rules.hs
+++ b/Duckling/Quantity/HR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Quantity/Helpers.hs b/Duckling/Quantity/Helpers.hs
--- a/Duckling/Quantity/Helpers.hs
+++ b/Duckling/Quantity/Helpers.hs
@@ -2,40 +2,49 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 
 
 module Duckling.Quantity.Helpers
-  ( isSimpleQuantity
+  ( getValue
+  , isSimpleQuantity
   , quantity
   , unitOnly
+  , valueOnly
   , withProduct
   , withUnit
   , withValue
   , withInterval
   , withMin
   , withMax
+  , mkLatent
   ) where
 
+import Data.HashMap.Strict (HashMap)
 import Data.Text (Text)
 import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Quantity.Types (QuantityData(..))
 import Duckling.Types
 import qualified Duckling.Quantity.Types as TQuantity
 
+getValue :: HashMap Text (Double -> Double) -> Text -> Double -> Double
+getValue opsMap match = HashMap.lookupDefault id (Text.toLower match) opsMap
 
 -- -----------------------------------------------------------------
 -- Patterns
+
 isSimpleQuantity :: Predicate
 isSimpleQuantity (Token Quantity QuantityData {TQuantity.unit = Just _
                                               , TQuantity.value = Just _})
  = True
 isSimpleQuantity _ = False
+
 -- -----------------------------------------------------------------
 -- Production
 
@@ -44,15 +53,25 @@
                             , TQuantity.value = Just v
                             , TQuantity.aproduct = Nothing
                             , TQuantity.minValue = Nothing
-                            , TQuantity.maxValue = Nothing}
+                            , TQuantity.maxValue = Nothing
+                            , TQuantity.latent = False}
 
 unitOnly :: TQuantity.Unit -> QuantityData
 unitOnly u = QuantityData {TQuantity.unit = Just u
                           , TQuantity.value = Nothing
                           , TQuantity.aproduct = Nothing
                           , TQuantity.minValue = Nothing
-                          , TQuantity.maxValue = Nothing}
+                          , TQuantity.maxValue = Nothing
+                          , TQuantity.latent = False}
 
+valueOnly :: Double -> QuantityData
+valueOnly v = QuantityData {TQuantity.unit = Nothing
+                          , TQuantity.value = Just v
+                          , TQuantity.aproduct = Nothing
+                          , TQuantity.minValue = Nothing
+                          , TQuantity.maxValue = Nothing
+                          , TQuantity.latent = False}
+
 withProduct :: Text -> QuantityData -> QuantityData
 withProduct p qd = qd {TQuantity.aproduct = Just p}
 
@@ -70,3 +89,6 @@
 
 withMax :: Double -> QuantityData -> QuantityData
 withMax to qd = qd {maxValue = Just to}
+
+mkLatent :: QuantityData -> QuantityData
+mkLatent qd = qd {TQuantity.latent = True}
diff --git a/Duckling/Quantity/KM/Corpus.hs b/Duckling/Quantity/KM/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/KM/Corpus.hs
@@ -0,0 +1,71 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Quantity.KM.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Quantity.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext{locale = makeLocale KM Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Cup 3 Nothing)
+             [ "បីកែវ"
+             ]
+  , examples (simple Bowl 1 Nothing)
+             [ "១ចាន"
+             ]
+  , examples (simple Pint 15 Nothing)
+             [ "ដប់ប្រាំថូ"
+             ]
+  , examples (simple (Custom "For Persons") 2 (Just "មនុស្ស"))
+             [ "មនុស្ស២នាក់"
+             , "មនុស្សពីរនាក់"
+             ]
+  , examples (simple (Custom "For Buildings") 8 (Just "ផ្ទះ"))
+             [ "ផ្ទះ៨ខ្នង"
+             , "ផ្ទះប្រាំបីខ្នង"
+             ]
+  , examples (simple Gram 1000 Nothing)
+             [ "មួយពាន់ក្រាម"
+             , "មួយគីឡូក្រាម"
+             , "មួយលានមីលីក្រាម"
+             ]
+  , examples (between Gram (2,7) Nothing)
+             [ "ចាប់ពី 2 ដល់ 7 ក្រាម"
+             , "ចន្លោះពី ២ ដល់ ៧ក្រាម"
+             , "ចន្លោះ ២ក្រាម និង ៧ក្រាម"
+             , "ប្រហែល ២-៧ ក្រាម"
+             , "~2-7ក្រាម"
+             ]
+  , examples (under Tablespoon 4 Nothing)
+             [ "តិចជាងបួនស្លាបព្រា"
+             , "មិនលើស៤ស្លាបព្រា"
+             , "ក្រោម៤ស្លាបព្រា"
+             , "យ៉ាងច្រើន៤ស្លាបព្រា"
+             ]
+  , examples (above Bowl 10 Nothing)
+             [ "ច្រើនជាងដប់ចាន"
+             , "មិនតិចជាងដប់ចាន"
+             , "លើសពីដប់ចាន"
+             , "យ៉ាងតិចដប់ចាន"
+             ]
+  ]
diff --git a/Duckling/Quantity/KM/Rules.hs b/Duckling/Quantity/KM/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/KM/Rules.hs
@@ -0,0 +1,248 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Quantity.KM.Rules
+  ( rules
+  ) where
+
+import Data.HashMap.Strict (HashMap)
+import Data.Text (Text, toLower)
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
+import Duckling.Quantity.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Quantity.Types (QuantityData(..))
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.Quantity.Types as TQuantity
+
+ruleQuantityOfProduct :: Rule
+ruleQuantityOfProduct = Rule
+  { name = "<quantity> of product"
+  , pattern =
+    [ regex "(មនុស្ស|បងប្អូន|សត្វ|ឆ្កែ|ឆ្មា|ដើមឈើ|ផ្កា|កុលាប|ផ្ទះ)"
+    , dimension Quantity
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       Token Quantity qd:
+       _) -> Just . Token Quantity $ withProduct match qd
+      _ -> Nothing
+  }
+
+unitsMap :: HashMap Text TQuantity.Unit
+unitsMap = HashMap.fromList
+  [ ("ចាន", TQuantity.Bowl)
+  , ("ពែង", TQuantity.Cup)
+  , ("កែវ", TQuantity.Cup)
+  , ("ថូ", TQuantity.Pint)
+  , ("ស្លាបព្រា", TQuantity.Tablespoon)
+  , ("ស្លាបព្រាបាយ", TQuantity.Tablespoon)
+  , ("ស្លាបព្រាកាហ្វេ", TQuantity.Teaspoon)
+  , ("នាក់", TQuantity.Custom "For Persons")
+  , ("ក្បាល", TQuantity.Custom "For Animals")
+  , ("ដើម", TQuantity.Custom "For Trees")
+  , ("ទង", TQuantity.Custom "For Flowers")
+  , ("ខ្នង", TQuantity.Custom "For Buildings")
+  , ("គ្រឿង", TQuantity.Custom "For Vehicles/Devices")
+  , ("កញ្ចប់", TQuantity.Custom "For Packages")
+  , ("ឈុត", TQuantity.Custom "Sets")
+  ]
+
+ruleNumeralUnits :: Rule
+ruleNumeralUnits = Rule
+  { name = "<number><units>"
+  , pattern =
+    [ dimension Numeral
+    , regex "(ចាន|ពែង|កែវ|ថូ|ស្លាបព្រា|ស្លាបព្រាបាយ|ស្លាបព្រាកាហ្វេ|នាក់|ក្បាល|ដើម|ទង|ខ្នង|គ្រឿង|កញ្ចប់|ឈុត)"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+         unit <- HashMap.lookup match unitsMap
+         Just . Token Quantity $ quantity unit v
+      _ -> Nothing
+  }
+
+quantities :: [(Text, String, TQuantity.Unit)]
+quantities =
+  [ ("<quantity> grams", "((មីលី|គីឡូ)?ក្រាម)", TQuantity.Gram)
+  ]
+
+opsMap :: HashMap Text (Double -> Double)
+opsMap = HashMap.fromList
+  [ ( "មីលីក្រាម" , (/ 1000))
+  , ( "គីឡូក្រាម" , (* 1000))
+  ]
+
+ruleNumeralUnits2 :: [Rule]
+ruleNumeralUnits2 = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [dimension Numeral, regex regexPattern]
+      , prod = \case
+        (Token Numeral nd:
+         Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just . Token Quantity $ quantity u value
+          where value = getValue opsMap match $ TNumeral.value nd
+        _ -> Nothing
+      }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+    { name = "about|exactly <quantity>"
+    , pattern =
+      [ regex "\\~|ប្រហែល"
+      , dimension Quantity
+      ]
+      , prod = \case
+        (_:token:_) -> Just token
+        _ -> Nothing
+    }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+    { name = "between|from <numeral> and|to <quantity>"
+    , pattern =
+      [ regex "ចន្លោះ(ពី)?|ចាប់ពី"
+      , Predicate isPositive
+      , regex "និង|ដល់"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Numeral NumeralData{TNumeral.value = from}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to ->
+          Just . Token Quantity . withInterval (from, to) $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+    { name = "between|from <quantity> to|and <quantity>"
+    , pattern =
+      [ regex "ចន្លោះ(ពី)?|ចាប់ពី"
+      , Predicate isSimpleQuantity
+      , regex "និង|ដល់"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u1
+                                    , TQuantity.aproduct = Nothing}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u2
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to && u1 == u2 ->
+          Just . Token Quantity . withInterval (from, to) $ unitOnly u1
+        _ -> Nothing
+    }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+    { name = "<numeral> - <quantity>"
+    , pattern =
+      [ Predicate isPositive
+      , regex "\\-"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (Token Numeral NumeralData{TNumeral.value = from}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to ->
+           Just . Token Quantity . withInterval (from, to) $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+    { name = "<quantity> - <quantity>"
+    , pattern =
+      [ Predicate isSimpleQuantity
+      , regex "\\-"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u1
+                                    , TQuantity.aproduct = Nothing}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u2
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to && u1 == u2 ->
+          Just . Token Quantity . withInterval (from, to) $ unitOnly u1
+        _ -> Nothing
+    }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+    { name = "Max Rule"
+    , pattern =
+      [ regex "ក្រោម|តិចជាង|មិនដល់|យ៉ាងច្រើន|មិនលើស"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) -> Just . Token Quantity . withMax to $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "Min Rule"
+  , pattern =
+      [ regex "លើស(ពី)?|មិនតិចជាង|លើ|ច្រើនជាង|យ៉ាងតិច|យ៉ាងហោច"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) -> Just . Token Quantity . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+rules :: [Rule]
+rules =
+  [ ruleNumeralUnits
+  , ruleQuantityOfProduct
+  , rulePrecision
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , ruleIntervalMax
+  , ruleIntervalMin
+  ]
+  ++ruleNumeralUnits2
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Quantity/MN/Corpus.hs b/Duckling/Quantity/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/MN/Corpus.hs
@@ -0,0 +1,58 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Quantity.MN.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Quantity.Types
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Pound 2 Nothing)
+             [ "2 фунт"
+             ]
+  , examples (simple Gram 2 Nothing)
+             [ "2 грамм"
+             , "хоёр грамм"
+             , "2000 миллиграмм"
+             , "2000 мг"
+             ]
+  , examples (simple Gram 1000 Nothing)
+             [ "килограмм"
+             , "кг"
+             ]
+  , examples (simple Gram 2000 Nothing)
+             [ "2 килограмм"
+             , "2 кг"
+             , "2000 грамм"
+             ]
+  , examples (simple Pound 1 Nothing)
+             [ "фунт"
+             , "1 фунт"
+             ]
+  , examples (simple Ounce 2 Nothing)
+             [ "2 унц"
+             ]
+  , examples (simple Gram 500 Nothing)
+             [ "500 грамм"
+             , "500г"
+             , "500 г"
+             , "0.5 кг"
+             ]
+  ]
diff --git a/Duckling/Quantity/MN/Rules.hs b/Duckling/Quantity/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/MN/Rules.hs
@@ -0,0 +1,62 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Quantity.MN.Rules
+  ( 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
+
+quantities :: [(Text, String, TQuantity.Unit, Double -> Double)]
+quantities =
+  [ ("<quantity> milligrams", "(мг|миллиграмм)", TQuantity.Gram, (/ 1000))
+  , ("<quantity> grams", "г(рамм?)?", TQuantity.Gram, id)
+  , ("<quantity> kilograms", "(кг|килограмм?)", TQuantity.Gram, (* 1000))
+  , ("<quantity> lb", "фунт", TQuantity.Pound, id)
+  , ("<quantity> oz", "унц", TQuantity.Ounce, id)
+  ]
+
+ruleNumeralQuantities :: [Rule]
+ruleNumeralQuantities = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit, Double -> Double) -> Rule
+    go (name, regexPattern, u, convert) = Rule
+      { name = name
+      , pattern =
+        [ numberWith TNumeral.value (> 0), regex regexPattern ]
+      , prod = \tokens -> case tokens of
+        (Token Numeral nd:_) ->
+          Just . Token Quantity . quantity u . convert $ TNumeral.value nd
+        _ -> Nothing
+      }
+
+ruleAQuantity :: [Rule]
+ruleAQuantity = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit, Double -> Double) -> Rule
+    go (name, regexPattern, u, convert) = Rule
+      { name = name
+      , pattern = [ regex regexPattern ]
+      , prod = \_ -> Just . Token Quantity . quantity u $ convert 1
+      }
+
+rules :: [Rule]
+rules = ruleNumeralQuantities ++ ruleAQuantity
diff --git a/Duckling/Quantity/NL/Corpus.hs b/Duckling/Quantity/NL/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/NL/Corpus.hs
@@ -0,0 +1,86 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Quantity.NL.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Quantity.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale NL Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Gram 2 Nothing)
+             [ "2 gram"
+             , "0,002 kg"
+             , "0,002 kilo"
+             , "2/1000 kilogram"
+             , "2000 milligram"
+             ]
+  , examples (simple Gram 1000 Nothing)
+             [ "1 kg"
+             , "1,0 kg"
+             , "1 kilogram"
+             , "1 kilo"
+             , "1000 gram"
+             , "1000 g"
+             , "1000 gr"
+             , "duizend gram"
+             , "duizend gr"
+             , "2,0 pond"
+             , "10 ons"
+             , "1000000 mg"
+             , "1000000 milligram"
+             ]
+  , examples (simple Cup 1 (Just "suiker"))
+             [ "1 kopje suiker"
+             ]
+  , examples (simple Cup 3 (Just "suiker"))
+             [ "3 kopjes suiker"
+             ]
+  , examples (simple Cup 0.75 Nothing)
+             [ "3/4 kopje"
+             , "0,75 kopje"
+             , ",75 kopje"
+             ]
+  , examples (simple Gram 500 (Just "aardbeien"))
+             [ "500 gram aardbeien"
+             , "500g aardbeien"
+             , "0,5 kilogram aardbeien"
+             , "0,5 kg aardbeien"
+             , "5 ons aardbeien"
+             , "1 pond aardbeien"
+             , "500000mg aardbeien"
+             ]
+  , examples (between Gram (100,1000) (Just "aardbeien"))
+              [ "100-1000 gram aardbeien"
+              , "tussen 100 en 1000 gram aardbeien"
+              , "van 100 tot 1000 g aardbeien"
+              , "tussen 1 ons en 10 ons aardbeien"
+              , "100 - 1000 g aardbeien"
+              ]
+  , examples (between Gram (2,7) Nothing)
+              [ "~2-7 gram"
+              , "van 2 tot 7 g"
+              , "tussen 2,0 g en ongeveer 7,0 g"
+              , "tussen 0,002 kg en ongeveer 0,007 kg"
+              , "2 - ~7 gram"
+              ]
+  ]
diff --git a/Duckling/Quantity/NL/Rules.hs b/Duckling/Quantity/NL/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Quantity/NL/Rules.hs
@@ -0,0 +1,235 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Quantity.NL.Rules
+  ( rules
+  ) where
+
+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
+import Duckling.Quantity.Helpers
+import Duckling.Regex.Types (GroupMatch (..))
+import Duckling.Types
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Quantity.Types (QuantityData(..))
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.Quantity.Types as TQuantity
+
+quantities :: [(Text, String, TQuantity.Unit)]
+quantities =
+  [ ("<quantity> kopje",        "(kopjes?)", TQuantity.Cup)
+  , ("<quantity> grams",        "(g((r)?(am)?)?)", TQuantity.Gram)
+  , ("<quantity> milligrams",   "((m(illi)?)(g(ram)?))", TQuantity.Gram)
+  , ("<quantity> kilograms",    "((k(ilo)?)(g(ram)?)?)", TQuantity.Gram)
+  , ("<quantity> pond",         "(pond(je(s)?)?)", TQuantity.Gram)
+  , ("<quantity> ons",          "(ons(je(s)?)?)", TQuantity.Gram)
+  ]
+
+opsMap :: HashMap Text (Double -> Double)
+opsMap = HashMap.fromList
+  [ ( "milligram"   , (/ 1000))
+  , ( "mg"          , (/ 1000))
+  , ( "kilo"        , (* 1000))
+  , ( "kilogram"    , (* 1000))
+  , ( "kg"          , (* 1000))
+  , ( "pond"        , (* 500))
+  , ( "ons"         , (* 100))
+  ]
+
+ruleNumeralQuantities :: [Rule]
+ruleNumeralQuantities = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [Predicate isPositive, regex regexPattern]
+      , prod = \case
+        (Token Numeral nd:
+         Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just . Token Quantity $ quantity u value
+          where value = getValue opsMap 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 ("een? " ++ regexPattern) ]
+      , prod = \case
+        (Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just . Token Quantity $ quantity u $ getValue opsMap match 1
+        _ -> Nothing
+      }
+
+ruleQuantityOfProduct :: Rule
+ruleQuantityOfProduct = Rule
+  { name = "<quantity> product"
+  , pattern =
+    [ dimension Quantity
+    , regex "(\\w+)"
+    ]
+  , prod = \case
+    (Token Quantity qd:Token RegexMatch (GroupMatch (product:_)):_) ->
+      Just . Token Quantity $ withProduct (Text.toLower product) qd
+    _ -> Nothing
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+    { name = "ongeveer|plm|plusminus <quantity>"
+    , pattern =
+      [ regex "\\~|precies|exact|ongeveer|bijna|ongeveer"
+      , dimension Quantity
+      ]
+      , prod = \case
+        (_:token:_) -> Just token
+        _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+    { name = "tussen|van <numeral> en|tot <quantity>"
+    , pattern =
+      [ regex "tussen|van"
+      , Predicate isPositive
+      , regex "tot|en"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Numeral NumeralData{TNumeral.value = from}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to ->
+          Just . Token Quantity . withInterval (from, to) $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+    { name = "rond|tussen|van <quantity> tot|en <quantity>"
+    , pattern =
+      [ regex "tussen|van"
+      , Predicate isSimpleQuantity
+      , regex "en|tot"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u1
+                                    , TQuantity.aproduct = Nothing}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u2
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to && u1 == u2 ->
+          Just . Token Quantity . withInterval (from, to) $ unitOnly u1
+        _ -> Nothing
+    }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+    { name = "<numeral> - <quantity>"
+    , pattern =
+      [ Predicate isPositive
+      , regex "\\-"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (Token Numeral NumeralData{TNumeral.value = from}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to ->
+           Just . Token Quantity . withInterval (from, to) $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+    { name = "<quantity> - <quantity>"
+    , pattern =
+      [ Predicate isSimpleQuantity
+      , regex "\\-"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u1
+                                    , TQuantity.aproduct = Nothing}:
+         _:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u2
+                                    , TQuantity.aproduct = Nothing}:
+         _) | from < to && u1 == u2 ->
+          Just . Token Quantity . withInterval (from, to) $ unitOnly u1
+        _ -> Nothing
+    }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+    { name = "minder dan/hoogstens/op zijn hoogst/maximaal/hooguit <quantity>"
+    , pattern =
+      [ regex "minder dan|hoogstens|hooguit|maximaal|op zijn hoogst"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just to
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) -> Just . Token Quantity . withMax to $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "meer dan/minstens/op zijn minst <quantity>"
+  , pattern =
+      [ regex "meer dan|minstens|minimaal|op zijn minst|minder dan"
+      , Predicate isSimpleQuantity
+      ]
+    , prod = \case
+        (_:
+         Token Quantity QuantityData{TQuantity.value = Just from
+                                    , TQuantity.unit = Just u
+                                    , TQuantity.aproduct = Nothing}:
+         _) -> Just . Token Quantity . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+rules :: [Rule]
+rules =
+  [ ruleQuantityOfProduct
+  , ruleIntervalMin
+  , ruleIntervalMax
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePrecision
+  ]
+  ++ ruleNumeralQuantities
+  ++ ruleAQuantity
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Quantity/RU/Corpus.hs b/Duckling/Quantity/RU/Corpus.hs
--- a/Duckling/Quantity/RU/Corpus.hs
+++ b/Duckling/Quantity/RU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Quantity/RU/Rules.hs b/Duckling/Quantity/RU/Rules.hs
--- a/Duckling/Quantity/RU/Rules.hs
+++ b/Duckling/Quantity/RU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Quantity/Types.hs b/Duckling/Quantity/Types.hs
--- a/Duckling/Quantity/Types.hs
+++ b/Duckling/Quantity/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -11,18 +10,20 @@
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeFamilies #-}
-
 module Duckling.Quantity.Types where
 
 import Control.DeepSeq
 import Data.Aeson
+import qualified Data.HashMap.Strict as H
 import Data.Hashable
 import Data.Text (Text)
+import qualified Data.Text as Text
+import Duckling.Resolve
+  ( Resolve(..)
+  , Options(..)
+  )
 import GHC.Generics
 import Prelude
-import Duckling.Resolve (Resolve(..))
-import qualified Data.HashMap.Strict as H
-import qualified Data.Text as Text
 
 data Unit
   = Bowl
@@ -49,48 +50,57 @@
   , aproduct :: Maybe Text
   , minValue :: Maybe Double
   , maxValue :: Maybe Double
+  , latent :: Bool
   } deriving (Eq, Generic, Hashable, Ord, Show, NFData)
 
-
 instance Resolve QuantityData where
   type ResolvedValue QuantityData = QuantityValue
+  resolve _ Options {withLatent = False} QuantityData {latent = True}
+   = Nothing
 
   resolve _ _ QuantityData {value = Just value
+                         , unit = Nothing
+                         , aproduct = aproduct
+                         , latent = latent}
+   = Just (simple Unnamed value aproduct, latent)
+
+  resolve _ _ QuantityData {value = Just value
                          , unit = Just unit
-                         , aproduct = aproduct}
-   = Just (simple unit value aproduct, False)
+                         , aproduct = aproduct
+                         , latent = latent}
+   = Just (simple unit value aproduct, latent)
 
   resolve _ _ QuantityData {value = Nothing
                          , unit = Just unit
                          , aproduct = aproduct
                          , minValue = Just from
-                         , maxValue = Just to}
-   = Just (between unit (from, to) aproduct, False)
+                         , maxValue = Just to
+                         , latent = latent}
+   = Just (between unit (from, to) aproduct, latent)
 
   resolve _ _ QuantityData {value = Nothing
                          , unit = Just unit
                          , aproduct = aproduct
                          , minValue = Just from
-                         , maxValue = Nothing}
-   = Just (above unit from aproduct, False)
+                         , maxValue = Nothing
+                         , latent = latent}
+   = Just (above unit from aproduct, latent)
 
   resolve _ _ QuantityData {value = Nothing
                          , unit = Just unit
                          , aproduct = aproduct
                          , minValue = Nothing
-                         , maxValue = Just to}
-   = Just (under unit to aproduct, False)
+                         , maxValue = Just to
+                         , latent = latent}
+   = Just (under unit to aproduct, latent)
 
   resolve _ _ _ = Nothing
 
 data IntervalDirection = Above | Under
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
 
-data SingleValue = SingleValue
-    { vUnit :: Unit
-    , vValue :: Double
-    , vProduct :: Maybe Text
-    }
+data SingleValue =
+  SingleValue { vUnit :: Unit, vValue :: Double, vProduct :: Maybe Text }
     deriving (Eq, Generic, Hashable, Ord, Show, NFData)
 
 instance ToJSON SingleValue where
@@ -100,7 +110,6 @@
       ]
       ++ [ "product" .= p | Just p <- [aproduct] ]
 
-
 data QuantityValue
   = SimpleValue SingleValue
   | IntervalValue (SingleValue, SingleValue)
@@ -124,6 +133,7 @@
     [ "type" .= ("interval" :: Text)
     , "to" .= toJSON to
     ]
+
 -- -----------------------------------------------------------------
 -- Value helpers
 
@@ -131,7 +141,7 @@
 simple u v p = SimpleValue $ single u v p
 
 between :: Unit -> (Double, Double) -> Maybe Text -> QuantityValue
-between u (from,to) p = IntervalValue (single u from p, single u to p)
+between u (from, to) p = IntervalValue (single u from p, single u to p)
 
 above :: Unit -> Double -> Maybe Text -> QuantityValue
 above = openInterval Above
@@ -139,11 +149,8 @@
 under :: Unit -> Double -> Maybe Text -> QuantityValue
 under = openInterval Under
 
-openInterval :: IntervalDirection
-                     -> Unit
-                     -> Double
-                     -> Maybe Text
-                     -> QuantityValue
+openInterval
+  :: IntervalDirection -> Unit -> Double -> Maybe Text -> QuantityValue
 openInterval direction u v p = OpenIntervalValue (single u v p, direction)
 
 single :: Unit -> Double -> Maybe Text -> SingleValue
diff --git a/Duckling/Quantity/ZH/Corpus.hs b/Duckling/Quantity/ZH/Corpus.hs
--- a/Duckling/Quantity/ZH/Corpus.hs
+++ b/Duckling/Quantity/ZH/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Quantity/ZH/Rules.hs b/Duckling/Quantity/ZH/Rules.hs
--- a/Duckling/Quantity/ZH/Rules.hs
+++ b/Duckling/Quantity/ZH/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ranking/Classifiers.hs b/Duckling/Ranking/Classifiers.hs
--- a/Duckling/Ranking/Classifiers.hs
+++ b/Duckling/Ranking/Classifiers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ranking.Classifiers
@@ -14,8 +13,11 @@
 
 import Duckling.Locale
 import Duckling.Ranking.Types
+import qualified Duckling.Ranking.Classifiers.AF_XX as AF_XXClassifiers
 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.BN_XX as BN_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.CA_XX as CA_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
@@ -25,6 +27,8 @@
 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.FI_XX as FI_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.FA_XX as FA_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
@@ -32,10 +36,16 @@
 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.IS_XX as IS_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.KM_XX as KM_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.KN_XX as KN_XXClassifiers
 import qualified Duckling.Ranking.Classifiers.KO_XX as KO_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.LO_XX as LO_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.ML_XX as ML_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.MN_XX as MN_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.NE_XX as NE_XXClassifiers
@@ -44,16 +54,23 @@
 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.SK_XX as SK_XXClassifiers
 import qualified Duckling.Ranking.Classifiers.SV_XX as SV_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.SW_XX as SW_XXClassifiers
 import qualified Duckling.Ranking.Classifiers.TA_XX as TA_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.TE_XX as TE_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.TH_XX as TH_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 :: Locale -> Classifiers
+classifiers (Locale AF _) = AF_XXClassifiers.classifiers
 classifiers (Locale AR _) = AR_XXClassifiers.classifiers
 classifiers (Locale BG _) = BG_XXClassifiers.classifiers
+classifiers (Locale BN _) = BN_XXClassifiers.classifiers
+classifiers (Locale CA _) = CA_XXClassifiers.classifiers
 classifiers (Locale CS _) = CS_XXClassifiers.classifiers
 classifiers (Locale DA _) = DA_XXClassifiers.classifiers
 classifiers (Locale DE _) = DE_XXClassifiers.classifiers
@@ -63,6 +80,8 @@
 classifiers (Locale EN _) = EN_XXClassifiers.classifiers
 classifiers (Locale ES _) = ES_XXClassifiers.classifiers
 classifiers (Locale ET _) = ET_XXClassifiers.classifiers
+classifiers (Locale FI _) = FI_XXClassifiers.classifiers
+classifiers (Locale FA _) = FA_XXClassifiers.classifiers
 classifiers (Locale FR _) = FR_XXClassifiers.classifiers
 classifiers (Locale GA _) = GA_XXClassifiers.classifiers
 classifiers (Locale HE _) = HE_XXClassifiers.classifiers
@@ -70,10 +89,16 @@
 classifiers (Locale HR _) = HR_XXClassifiers.classifiers
 classifiers (Locale HU _) = HU_XXClassifiers.classifiers
 classifiers (Locale ID _) = ID_XXClassifiers.classifiers
+classifiers (Locale IS _) = IS_XXClassifiers.classifiers
 classifiers (Locale IT _) = IT_XXClassifiers.classifiers
 classifiers (Locale JA _) = JA_XXClassifiers.classifiers
 classifiers (Locale KA _) = KA_XXClassifiers.classifiers
+classifiers (Locale KM _) = KM_XXClassifiers.classifiers
+classifiers (Locale KN _) = KN_XXClassifiers.classifiers
 classifiers (Locale KO _) = KO_XXClassifiers.classifiers
+classifiers (Locale LO _) = LO_XXClassifiers.classifiers
+classifiers (Locale ML _) = ML_XXClassifiers.classifiers
+classifiers (Locale MN _) = MN_XXClassifiers.classifiers
 classifiers (Locale MY _) = MY_XXClassifiers.classifiers
 classifiers (Locale NB _) = NB_XXClassifiers.classifiers
 classifiers (Locale NE _) = NE_XXClassifiers.classifiers
@@ -82,8 +107,12 @@
 classifiers (Locale PT _) = PT_XXClassifiers.classifiers
 classifiers (Locale RO _) = RO_XXClassifiers.classifiers
 classifiers (Locale RU _) = RU_XXClassifiers.classifiers
+classifiers (Locale SK _) = SK_XXClassifiers.classifiers
 classifiers (Locale SV _) = SV_XXClassifiers.classifiers
+classifiers (Locale SW _) = SW_XXClassifiers.classifiers
 classifiers (Locale TA _) = TA_XXClassifiers.classifiers
+classifiers (Locale TE _) = TE_XXClassifiers.classifiers
+classifiers (Locale TH _) = TH_XXClassifiers.classifiers
 classifiers (Locale TR _) = TR_XXClassifiers.classifiers
 classifiers (Locale UK _) = UK_XXClassifiers.classifiers
 classifiers (Locale VI _) = VI_XXClassifiers.classifiers
diff --git a/Duckling/Ranking/Classifiers/AF_XX.hs b/Duckling/Ranking/Classifiers/AF_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/AF_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.AF_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/AR_EG.hs b/Duckling/Ranking/Classifiers/AR_EG.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/AR_EG.hs
@@ -0,0 +1,2014 @@
+-- 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_EG (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.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346, unseen = -4.189654742026425,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 64},
+                   koData =
+                     ClassData{prior = -1.2992829841302609, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24}}),
+       ("ordinals (twelveth)",
+        Classifier{okData =
+                     ClassData{prior = 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> next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.8109302162163288),
+                                    ("about|exactly <time-of-day>", -1.5040773967762742),
+                                    ("Tuesday", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("noon|midnight|EOD|end of day",
+        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}}),
+       ("<hour-of-day> third",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.252762968495368),
+                                    ("hour", -0.8472978603872037),
+                                    ("time-of-day integer (latent)", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.5040773967762742),
+                                    ("dayday", -1.0986122886681098),
+                                    ("day (grain)yesterday", -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minute (grain)part of days", -1.252762968495368),
+                                    ("minutehour", -1.252762968495368)],
+                               n = 1}}),
+       ("integer (20..90)",
+        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}}),
+       ("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}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..tenth)February", -2.70805020110221),
+                                    ("integer (numeric)in <named-month>", -2.70805020110221),
+                                    ("integer (numeric)April", -2.70805020110221),
+                                    ("integer (numeric)August", -2.70805020110221),
+                                    ("integer (numeric)February", -1.791759469228055),
+                                    ("month", -0.916290731874155),
+                                    ("integer (numeric)July", -2.3025850929940455),
+                                    ("integer (numeric)March", -2.70805020110221)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.3217558399823195, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)in <named-month>", -2.0794415416798357),
+                                    ("integer (numeric)August", -2.0794415416798357),
+                                    ("month", -1.1631508098056809),
+                                    ("integer (numeric)July", -1.6739764335716716)],
+                               n = 4}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.41616039722491244,
+                               unseen = -5.488937726156687,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect by \",\", \"of\", \"from\", \"'s\"part of days",
+                                     -4.386184644822546),
+                                    ("<hour-of-day> till thirdafter part of days",
+                                     -4.386184644822546),
+                                    ("time-of-day integer (latent)after part of days",
+                                     -4.386184644822546),
+                                    ("at <time-of-day>before part of days", -4.098502572370764),
+                                    ("hh:mmbefore part of days", -4.791649752930709),
+                                    ("<datetime> - <datetime> (interval)part of days",
+                                     -4.098502572370764),
+                                    ("<time-of-day> - <time-of-day> (interval)part of days",
+                                     -4.386184644822546),
+                                    ("time-of-day ordinal (latent)part of days",
+                                     -4.098502572370764),
+                                    ("<hour-of-day> halfpart of days", -4.386184644822546),
+                                    ("time-of-day integer (latent)part of days",
+                                     -3.5388867844353418),
+                                    ("<hour-of-day> till quarterthis <part-of-day>",
+                                     -4.386184644822546),
+                                    ("hourhour", -1.8738790208464304),
+                                    ("hh:mmpart of days", -3.8753590210565547),
+                                    ("<hour-of-day> and integer minutespart of days",
+                                     -2.651583589434439),
+                                    ("<hour-of-day> quarterafter part of days", -4.791649752930709),
+                                    ("minutehour", -1.4243539229442357),
+                                    ("at <time-of-day>part of days", -2.393754480132339),
+                                    ("intersectpart of days", -4.791649752930709),
+                                    ("from <datetime> - <datetime> (interval)part of days",
+                                     -4.386184644822546),
+                                    ("<hour-of-day> and integer minutesafter part of days",
+                                     -4.386184644822546),
+                                    ("at <time-of-day>after part of days", -3.6930374642626003),
+                                    ("<hour-of-day> quarterpart of days", -4.386184644822546),
+                                    ("<hour-of-day> thirdpart of days", -4.386184644822546),
+                                    ("from <datetime> - <datetime> (interval)after part of days",
+                                     -4.791649752930709),
+                                    ("time-of-day ordinal (latent)tonight", -4.791649752930709),
+                                    ("<datetime> - <datetime> (interval)after part of days",
+                                     -4.791649752930709),
+                                    ("<hour-of-day> till quarterbefore part of days",
+                                     -4.386184644822546),
+                                    ("<time-of-day> - <time-of-day> (interval)after part of days",
+                                     -4.791649752930709),
+                                    ("at <time-of-day>this <part-of-day>", -4.791649752930709),
+                                    ("<hour-of-day> till thirdbefore part of days",
+                                     -4.386184644822546)],
+                               n = 93},
+                   koData =
+                     ClassData{prior = -1.0775588794702773,
+                               unseen = -5.0238805208462765,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)part of days", -3.2255203675868693),
+                                    ("time-of-day integer (latent)after part of days",
+                                     -4.324132656254979),
+                                    ("dayhour", -3.2255203675868693),
+                                    ("<hour-of-day> till thirdafter <time-of-day>",
+                                     -3.9186675481468147),
+                                    ("time-of-day integer (latent)after <time-of-day>",
+                                     -3.9186675481468147),
+                                    ("yearhour", -3.2255203675868693),
+                                    ("at <time-of-day>until <time-of-day>", -3.9186675481468147),
+                                    ("hh:mmafter part of days", -4.324132656254979),
+                                    ("past year (latent)part of days", -4.324132656254979),
+                                    ("nograinhour", -4.324132656254979),
+                                    ("hh:mmuntil <time-of-day>", -4.324132656254979),
+                                    ("<time-of-day> - <time-of-day> (interval)part of days",
+                                     -4.324132656254979),
+                                    ("until <time-of-day>after part of days", -4.324132656254979),
+                                    ("time-of-day ordinal (latent)part of days",
+                                     -3.9186675481468147),
+                                    ("<time-of-day> - <time-of-day> (interval)after <time-of-day>",
+                                     -4.324132656254979),
+                                    ("by <time>part of days", -4.324132656254979),
+                                    ("<datetime> - <datetime> (interval)after <time-of-day>",
+                                     -4.324132656254979),
+                                    ("time-of-day integer (latent)part of days",
+                                     -4.324132656254979),
+                                    ("<hour-of-day> till quarterthis <part-of-day>",
+                                     -4.324132656254979),
+                                    ("hourhour", -2.0215475632609334),
+                                    ("past year (latent)after part of days", -4.324132656254979),
+                                    ("<hour-of-day> and integer minutespart of days",
+                                     -3.6309854756950335),
+                                    ("until <time-of-day>after <time-of-day>", -4.324132656254979),
+                                    ("minutehour", -2.072840857648484),
+                                    ("at <time-of-day>part of days", -3.9186675481468147),
+                                    ("until <time-of-day>part of days", -3.9186675481468147),
+                                    ("hh:mmafter <time-of-day>", -4.324132656254979),
+                                    ("at <time-of-day>after part of days", -4.324132656254979),
+                                    ("past year (latent)after <time-of-day>", -4.324132656254979),
+                                    ("from <datetime> - <datetime> (interval)after <time-of-day>",
+                                     -4.324132656254979),
+                                    ("<hour-of-day> till quarteruntil <time-of-day>",
+                                     -3.9186675481468147),
+                                    ("past year (latent)until <time-of-day>", -4.324132656254979),
+                                    ("past year (latent)before part of days", -4.324132656254979),
+                                    ("at <time-of-day>after <time-of-day>", -3.2255203675868693),
+                                    ("<hour-of-day> and integer minutesafter <time-of-day>",
+                                     -3.9186675481468147)],
+                               n = 48}}),
+       ("dd/mm",
+        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}}),
+       ("numbers prefix with -, minus",
+        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}}),
+       ("today",
+        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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.269171584511341e-2,
+                               unseen = -4.852030263919617,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> third", -4.151039905898646),
+                                    ("<hour-of-day> and integer minutes", -2.5416019934645457),
+                                    ("<hour-of-day> quarter", -4.151039905898646),
+                                    ("<hour-of-day> till quarter", -3.7455747977904816),
+                                    ("time-of-day ordinal (latent)", -1.8997481072921507),
+                                    ("<hour-of-day> half", -4.151039905898646),
+                                    ("hh:mm", -3.2347491740244907), ("hour", -1.180625440328945),
+                                    ("minute", -1.7996646487351682),
+                                    ("<hour-of-day> till third", -3.7455747977904816),
+                                    ("time-of-day integer (latent)", -1.7996646487351682)],
+                               n = 58},
+                   koData =
+                     ClassData{prior = -2.5336968139574325,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day ordinal (latent)", -1.9459101490553135),
+                                    ("hour", -1.252762968495368),
+                                    ("time-of-day integer (latent)", -1.6582280766035324)],
+                               n = 5}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -0.6931471805599453),
+                                    ("day", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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.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 = -0.6931471805599453, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal or number) <named-month>",
+                                     -2.5902671654458267),
+                                    ("September", -2.995732273553991),
+                                    ("<day-of-month> (ordinal or number) of <named-month>",
+                                     -2.995732273553991),
+                                    ("day", -1.3862943611198906), ("year", -2.5902671654458267),
+                                    ("part of <named-month>", -2.0794415416798357),
+                                    ("month", -2.995732273553991),
+                                    ("year (integer)", -2.5902671654458267),
+                                    ("this|last the <cycle>", -2.995732273553991),
+                                    ("day of <named-month>", -2.995732273553991)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("September", -2.995732273553991),
+                                    ("October", -2.995732273553991),
+                                    ("intersect", -2.0794415416798357),
+                                    ("Saturday", -2.995732273553991),
+                                    ("<time> for <duration>", -2.5902671654458267),
+                                    ("day", -2.995732273553991),
+                                    ("month (ordinal)", -2.995732273553991),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.5902671654458267),
+                                    ("month", -1.2039728043259361)],
+                               n = 12}}),
+       ("<hour-of-day> and integer minutes",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (13..19)", -2.505525936990736),
+                                    ("at <time-of-day>integer 21..99", -2.793208009442517),
+                                    ("time-of-day integer (latent)integer (numeric)",
+                                     -2.793208009442517),
+                                    ("at <time-of-day>integer (20..90)", -3.1986731175506815),
+                                    ("time-of-day integer (latent)integer (13..19)",
+                                     -3.1986731175506815),
+                                    ("hour", -0.9473813189441862),
+                                    ("time-of-day ordinal (latent)integer (20..90)",
+                                     -3.1986731175506815),
+                                    ("time-of-day ordinal (latent)integer (numeric)",
+                                     -3.1986731175506815),
+                                    ("at <time-of-day>integer (numeric)", -2.505525936990736),
+                                    ("time-of-day ordinal (latent)integer 21..99",
+                                     -2.793208009442517),
+                                    ("time-of-day ordinal (latent)integer (13..19)",
+                                     -2.793208009442517)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day integer (latent)integer 21..99",
+                                     -2.2512917986064953),
+                                    ("time-of-day integer (latent)integer (20..90)",
+                                     -1.845826690498331),
+                                    ("hour", -1.55814461804655)],
+                               n = 3}}),
+       ("this|last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("week (grain)", -1.791759469228055),
+                                    ("day", -1.791759469228055), ("month", -1.791759469228055),
+                                    ("day (grain)", -1.791759469228055)],
+                               n = 3}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 26}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.0986122886681098),
+                                    ("dual <unit-of-duration>", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003), ("year", -1.2039728043259361),
+                                    ("single <unit-of-duration>", -0.916290731874155)],
+                               n = 3}}),
+       ("Wednesday",
+        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}}),
+       ("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 = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.713572066704308,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 39}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.569352963213281, unseen = -5.529429087511423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tuesdayon <date>", -4.832305758571839),
+                                    ("in <named-month>year", -4.832305758571839),
+                                    ("<hour-of-day> till thirdafter part of days",
+                                     -4.426840650463674),
+                                    ("dayhour", -3.9160150266976834),
+                                    ("daymonth", -4.832305758571839),
+                                    ("in <named-month>on <date>", -4.832305758571839),
+                                    ("monthyear", -3.3282283617955644),
+                                    ("Mondayon <date>", -4.832305758571839),
+                                    ("Christmasyear", -4.832305758571839),
+                                    ("Monday<day-of-month> (ordinal or number) <named-month>",
+                                     -4.832305758571839),
+                                    ("month (integer)year (integer)", -4.426840650463674),
+                                    ("\1593\1610\1583 \1575\1604\1605\1610\1604\1575\1583year",
+                                     -4.832305758571839),
+                                    ("<day-of-week> the last of <time><cycle> this|last|next",
+                                     -4.832305758571839),
+                                    ("at <time-of-day>before part of days", -4.139158578011894),
+                                    ("hh:mmbefore part of days", -4.832305758571839),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -4.832305758571839),
+                                    ("intersect<time> <part-of-day>", -4.426840650463674),
+                                    ("month (ordinal)year (integer)", -4.832305758571839),
+                                    ("\1593\1610\1583 \1575\1604\1601\1589\1581year",
+                                     -4.832305758571839),
+                                    ("dd/mm<time> <part-of-day>", -4.832305758571839),
+                                    ("Thursday<time> timezone", -4.426840650463674),
+                                    ("<hour-of-day> till quarterthis <part-of-day>",
+                                     -4.426840650463674),
+                                    ("dayday", -3.0405462893437836),
+                                    ("absorption of , after named day<day-of-month> (ordinal or number) <named-month>",
+                                     -4.832305758571839),
+                                    ("hourhour", -3.733693469903729),
+                                    ("month (integer)year", -4.832305758571839),
+                                    ("\1593\1610\1583 \1575\1604\1601\1591\1585year",
+                                     -4.832305758571839),
+                                    ("Thursday<day-of-month> (ordinal or number) <named-month>",
+                                     -4.832305758571839),
+                                    ("dayyear", -2.960503581670247),
+                                    ("Thursday<time> <part-of-day>", -4.832305758571839),
+                                    ("<cycle> last of <time>year (integer)", -4.426840650463674),
+                                    ("last <cycle> of <time>year (integer)", -4.832305758571839),
+                                    ("<hour-of-day> quarterafter part of days", -4.832305758571839),
+                                    ("minutehour", -2.529720665577793),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.832305758571839),
+                                    ("\1585\1571\1587 \1575\1604\1587\1606\1577 \1575\1604\1607\1580\1585\1610\1577year",
+                                     -4.832305758571839),
+                                    ("Monday<cycle> this|last|next", -4.832305758571839),
+                                    ("<day-of-month> (ordinal or number) of <named-month>year",
+                                     -4.832305758571839),
+                                    ("<cycle> <ordinal> day? of <time>year", -4.832305758571839),
+                                    ("\1593\1610\1583 \1575\1604\1571\1590\1581\1609year",
+                                     -4.832305758571839),
+                                    ("on a <named-day>dd/mm", -4.832305758571839),
+                                    ("on a <named-day>on <date>", -4.832305758571839),
+                                    ("on a <named-day><day-of-month> (ordinal or number) <named-month>",
+                                     -4.832305758571839),
+                                    ("Tuesday<cycle> this|last|next", -4.832305758571839),
+                                    ("dayminute", -3.5795427900764705),
+                                    ("dd/mmintersect", -4.832305758571839),
+                                    ("in <named-month><cycle> this|last|next", -4.832305758571839),
+                                    ("<hour-of-day> and integer minutesafter part of days",
+                                     -4.426840650463674),
+                                    ("Saturdaydd/mm", -4.832305758571839),
+                                    ("\1585\1605\1590\1575\1606year", -4.832305758571839),
+                                    ("the <cycle> the <ordinal> of <time>year", -4.832305758571839),
+                                    ("at <time-of-day>after part of days", -3.733693469903729),
+                                    ("<ordinal> <cycle> of <time>year", -4.832305758571839),
+                                    ("Sunday<cycle> this|last|next", -4.832305758571839),
+                                    ("Tuesday<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.426840650463674),
+                                    ("Septemberon <date>", -4.832305758571839),
+                                    ("from <datetime> - <datetime> (interval)after part of days",
+                                     -4.832305758571839),
+                                    ("intersectintersect", -4.426840650463674),
+                                    ("dayweek", -4.139158578011894),
+                                    ("weekyear", -3.9160150266976834),
+                                    ("<datetime> - <datetime> (interval)after part of days",
+                                     -4.832305758571839),
+                                    ("Friday<day-of-month> (ordinal or number) <named-month>",
+                                     -4.832305758571839),
+                                    ("<hour-of-day> till quarterbefore part of days",
+                                     -4.426840650463674),
+                                    ("<time-of-day> - <time-of-day> (interval)after part of days",
+                                     -4.832305758571839),
+                                    ("at <time-of-day>this <part-of-day>", -4.832305758571839),
+                                    ("<hour-of-day> till thirdbefore part of days",
+                                     -4.426840650463674)],
+                               n = 73},
+                   koData =
+                     ClassData{prior = -0.8344607136265229, unseen = -5.384495062789089,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tuesdayon <date>", -4.686750172980514),
+                                    ("dayhour", -3.18267277620424),
+                                    ("daymonth", -3.5881378843124043),
+                                    ("monthday", -4.686750172980514),
+                                    ("monthyear", -2.814947996078923),
+                                    ("hh:mmafter part of days", -4.686750172980514),
+                                    ("houryear", -4.28128506487235),
+                                    ("intersectat <time-of-day>", -3.770459441106359),
+                                    ("intersect<time> <part-of-day>", -4.28128506487235),
+                                    ("Octoberon <date>", -4.686750172980514),
+                                    ("until <time-of-day>after part of days", -4.686750172980514),
+                                    ("this|last <cycle>on <date>", -4.686750172980514),
+                                    ("Tuesdayafter <time-of-day>", -4.686750172980514),
+                                    ("Wednesdayon <date>", -4.28128506487235),
+                                    ("dd/mm<time> <part-of-day>", -4.686750172980514),
+                                    ("yearyear", -4.28128506487235),
+                                    ("<hour-of-day> till quarterthis <part-of-day>",
+                                     -4.686750172980514),
+                                    ("dayday", -3.993602992420569),
+                                    ("dd/mmat <time-of-day>", -4.28128506487235),
+                                    ("hourhour", -4.28128506487235),
+                                    ("dayyear", -3.4339872044851463),
+                                    ("Thursdayat <time-of-day>", -4.28128506487235),
+                                    ("Februaryyear", -4.686750172980514),
+                                    ("minutemonth", -4.686750172980514),
+                                    ("minutehour", -4.28128506487235),
+                                    ("for <duration> from <time>on <date>", -4.686750172980514),
+                                    ("<day-of-month> (ordinal or number) of <named-month>year",
+                                     -4.28128506487235),
+                                    ("March<cycle> this|last|next", -4.686750172980514),
+                                    ("nth <time> of <time>year", -4.686750172980514),
+                                    ("Wednesday<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.686750172980514),
+                                    ("secondyear", -4.28128506487235),
+                                    ("Wednesdayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.686750172980514),
+                                    ("on <date>year (integer)", -4.686750172980514),
+                                    ("<time> for <duration>year", -3.5881378843124043),
+                                    ("<duration> after|before|from <time>on <date>",
+                                     -4.686750172980514),
+                                    ("dayminute", -3.18267277620424),
+                                    ("Julyuntil <time-of-day>", -4.686750172980514),
+                                    ("intersecton <date>", -4.686750172980514),
+                                    ("at <time-of-day>after part of days", -4.686750172980514),
+                                    ("Octoberyear", -4.686750172980514),
+                                    ("in|within|after <duration>year", -4.28128506487235),
+                                    ("Tuesday<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.686750172980514),
+                                    ("on a <named-day>intersect", -4.28128506487235),
+                                    ("Saturdayintersect", -4.28128506487235),
+                                    ("at <time-of-day>year", -4.686750172980514),
+                                    ("on <date>year", -4.28128506487235),
+                                    ("on <date>on <date>", -4.686750172980514),
+                                    ("weekday", -4.686750172980514),
+                                    ("Tuesdaynth <time> of <time>", -4.686750172980514),
+                                    ("weekyear", -4.686750172980514),
+                                    ("Tuesdayintersect", -4.686750172980514),
+                                    ("after <time-of-day>year", -4.686750172980514),
+                                    ("in <number> (implicit minutes)February", -4.686750172980514),
+                                    ("last <cycle> of <time>year", -4.686750172980514),
+                                    ("<day-of-month> (ordinal or number) of <named-month>on <date>",
+                                     -4.686750172980514)],
+                               n = 56}}),
+       ("\1585\1605\1590\1575\1606",
+        Classifier{okData =
+                     ClassData{prior = 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> the <ordinal> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)ordinals (first..tenth)October",
+                                     -2.0794415416798357),
+                                    ("daymonth", -1.3862943611198906),
+                                    ("week (grain)ordinals (first..tenth)month (integer)",
+                                     -2.0794415416798357),
+                                    ("weekmonth", -1.6739764335716716),
+                                    ("week (grain)ordinals (first..tenth)intersect",
+                                     -2.0794415416798357),
+                                    ("day (grain)ordinals (first..tenth)month (integer)",
+                                     -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        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}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7047480922384253),
+                                    ("ordinals (first..tenth)week (grain)in <named-month>",
+                                     -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609),
+                                    ("ordinals (first..tenth)week (grain)intersect",
+                                     -1.7047480922384253),
+                                    ("ordinals (first..tenth)day (grain)month (integer)",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.2237754316221157,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.791759469228055),
+                                    ("at <time-of-day>at <time-of-day>", -1.0986122886681098),
+                                    ("hourhour", -1.0986122886681098),
+                                    ("<day-of-month> (ordinal or number) <named-month><day-of-month> (ordinal or number) <named-month>",
+                                     -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.8754687373538999), ("Sunday", -1.791759469228055),
+                                    ("on a <named-day>", -1.791759469228055),
+                                    ("Tuesday", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Saturday",
+        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 21..99",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer 5integer (20..90)", -0.6931471805599453),
+                                    ("integer 3integer (20..90)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (13..19)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer 5integer 10", -0.916290731874155),
+                                    ("integer 8integer 10", -0.5108256237659907)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectsingle <unit-of-duration>", -2.4423470353692043),
+                                    ("monthyear", -1.5260563034950494),
+                                    ("nth <time> of <time>single <unit-of-duration>",
+                                     -2.4423470353692043),
+                                    ("dayyear", -2.03688192726104),
+                                    ("last <cycle> of <time>single <unit-of-duration>",
+                                     -2.4423470353692043),
+                                    ("weekyear", -2.4423470353692043),
+                                    ("Octobersingle <unit-of-duration>", -2.4423470353692043),
+                                    ("Septembersingle <unit-of-duration>", -2.4423470353692043),
+                                    ("on <date>single <unit-of-duration>", -2.03688192726104)],
+                               n = 7}}),
+       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) in <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)month (ordinal)",
+                                     -1.252762968495368),
+                                    ("month", -0.8472978603872037),
+                                    ("ordinals (composite, e.g., eighty-seven)ordinals (composite, e.g., eighty-seven)in <named-month>",
+                                     -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..tenth)",
+        Classifier{okData =
+                     ClassData{prior = -0.21825356602001794,
+                               unseen = -3.7612001156935624,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
+                   koData =
+                     ClassData{prior = -1.62924053973028, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("Monday",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("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}}),
+       ("\1593\1610\1583 \1575\1604\1571\1590\1581\1609",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (twenty, thirty..ninety)",
+        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}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer 10", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("<time> nth of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0296194171811581),
+                                    ("Wednesdayordinals (first..tenth)intersect",
+                                     -1.9459101490553135),
+                                    ("Tuesdayordinals (first..tenth)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.9459101490553135),
+                                    ("Tuesdayordinals (first..tenth)in <named-month>",
+                                     -1.9459101490553135),
+                                    ("Tuesdayordinals (first..tenth)October", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.2039728043259361),
+                                    ("Tuesdayordinals (first..tenth)in <named-month>",
+                                     -1.6094379124341003),
+                                    ("Wednesdayordinals (first..tenth)in <named-month>",
+                                     -1.6094379124341003)],
+                               n = 2}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.6739764335716716),
+                                    ("ordinals (first..tenth)intersect by \",\", \"of\", \"from\", \"'s\"year (integer)",
+                                     -2.367123614131617),
+                                    ("ordinals (first..tenth)on a <named-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.772588722239781),
+                                    ("dayyear", -2.0794415416798357),
+                                    ("ordinals (first..tenth)Tuesdaymonth (integer)",
+                                     -2.772588722239781),
+                                    ("ordinals (first..tenth)Wednesdayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.367123614131617),
+                                    ("ordinals (first..tenth)intersectyear (integer)",
+                                     -2.772588722239781),
+                                    ("ordinals (first..tenth)Tuesdayintersect",
+                                     -2.772588722239781)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..tenth)TuesdaySeptember", -2.772588722239781),
+                                    ("ordinals (first..tenth)time-of-day integer (latent)intersect",
+                                     -2.772588722239781),
+                                    ("daymonth", -1.8562979903656263),
+                                    ("ordinals (first..tenth)time-of-day integer (latent)February",
+                                     -2.367123614131617),
+                                    ("hourmonth", -1.8562979903656263),
+                                    ("ordinals (first..tenth)WednesdayOctober", -2.772588722239781),
+                                    ("ordinals (first..tenth)on a <named-day>September",
+                                     -2.772588722239781),
+                                    ("ordinals (first..tenth)time-of-day integer (latent)this|last the <cycle>",
+                                     -2.772588722239781),
+                                    ("ordinals (first..tenth)Wednesdayin <named-month>",
+                                     -2.772588722239781)],
+                               n = 8}}),
+       ("<hour-of-day> quarter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.5040773967762742),
+                                    ("time-of-day ordinal (latent)", -1.0986122886681098),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1585\1571\1587 \1575\1604\1587\1606\1577 \1575\1604\1607\1580\1585\1610\1577",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("<hour-of-day> till quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.3862943611198906),
+                                    ("time-of-day ordinal (latent)", -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("time-of-day integer (latent)", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.0986122886681098),
+                                    ("time-of-day integer (latent)", -1.0986122886681098)],
+                               n = 1}}),
+       ("week (grain)",
+        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}}),
+       ("past 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}}),
+       ("integer 8",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.6131044728864089,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (thirtieth..nineteenth)February",
+                                     -2.6149597780361984),
+                                    ("ordinals (first..tenth)October", -2.6149597780361984),
+                                    ("ordinals (first..tenth)April", -2.6149597780361984),
+                                    ("ordinals (first..tenth)February", -3.0204248861443626),
+                                    ("ordinals (first..tenth)month (integer)", -2.6149597780361984),
+                                    ("ordinals (first..tenth)March", -2.6149597780361984),
+                                    ("month", -1.074514737089049),
+                                    ("ordinals (first..tenth)in <named-month>",
+                                     -2.6149597780361984)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.7801585575495751,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer 2in <named-month>", -2.917770732084279),
+                                    ("integer 10February", -2.512305623976115),
+                                    ("integer (numeric)month (ordinal)", -2.917770732084279),
+                                    ("ordinals (first..tenth)month (integer)", -2.917770732084279),
+                                    ("integer (20..90)in <named-month>", -2.917770732084279),
+                                    ("ordinals (composite, e.g., eighty-seven)in <named-month>",
+                                     -2.917770732084279),
+                                    ("ordinals (twenty, thirty..ninety)in <named-month>",
+                                     -2.917770732084279),
+                                    ("month", -1.126011262856224),
+                                    ("ordinals (first..tenth)in <named-month>", -2.512305623976115),
+                                    ("ordinals (first..tenth)August", -2.917770732084279)],
+                               n = 11}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 2}}),
+       ("<cycle> <ordinal> day? of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)ordinals (first..tenth)October",
+                                     -2.0794415416798357),
+                                    ("daymonth", -1.3862943611198906),
+                                    ("week (grain)ordinals (first..tenth)month (integer)",
+                                     -2.0794415416798357),
+                                    ("weekmonth", -1.6739764335716716),
+                                    ("week (grain)ordinals (first..tenth)intersect",
+                                     -2.0794415416798357),
+                                    ("day (grain)ordinals (first..tenth)month (integer)",
+                                     -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("powers of tens",
+        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}}),
+       ("Friday",
+        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 = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> this|last|next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -2.5649493574615367),
+                                    ("year (grain)", -2.341805806147327),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("day", -2.5649493574615367), ("year", -2.341805806147327),
+                                    ("month", -2.5649493574615367),
+                                    ("day (grain)", -2.5649493574615367)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("time-of-day ordinal (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.13976194237515874,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (twelveth)", -2.03688192726104),
+                                    ("ordinals (first..tenth)", -0.3022808718729337),
+                                    ("ordinals (eleventh)", -2.03688192726104)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..tenth)", -0.40546510810816444)],
+                               n = 3}}),
+       ("ordinals (eleventh)",
+        Classifier{okData =
+                     ClassData{prior = 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 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.2992829841302609),
+                                    ("hour", -1.7047480922384253), ("minute", -1.7047480922384253)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.1400661634962708),
+                                    ("<day-of-month> (ordinal or number) of <named-month>",
+                                     -2.1400661634962708),
+                                    ("time-of-day ordinal (latent)", -2.1400661634962708),
+                                    ("day", -1.4469189829363254),
+                                    ("<day-of-month> (ordinal)", -1.7346010553881064),
+                                    ("hour", -1.7346010553881064)],
+                               n = 5}}),
+       ("fractional number",
+        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}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1593\1610\1583 \1575\1604\1601\1591\1585",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<hour-of-day> half",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.3862943611198906),
+                                    ("time-of-day ordinal (latent)", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.0986122886681098),
+                                    ("time-of-day integer (latent)", -1.0986122886681098)],
+                               n = 1}}),
+       ("month (integer)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.8718021769015913),
+                                    ("integer 10", -0.6190392084062235),
+                                    ("integer 3", -1.1786549963416462)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.9932517730102834,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -8.701137698962981e-2)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.46262352194811296,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4595323293784402),
+                                    ("powers of tens", -0.9985288301111273)],
+                               n = 17}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8472978603872037),
+                                    ("Monday<cycle> this|last|next", -1.252762968495368),
+                                    ("Mondayin <named-month>", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer 10minute (grain)", -2.4423470353692043),
+                                    ("year", -2.7300291078209855),
+                                    ("integer 10year (grain)", -2.7300291078209855),
+                                    ("integer (20..90)minute (grain)", -2.4423470353692043),
+                                    ("month", -2.7300291078209855),
+                                    ("integer (numeric)minute (grain)", -2.4423470353692043),
+                                    ("integer (numeric)month (grain)", -2.7300291078209855),
+                                    ("minute", -1.120591195386885),
+                                    ("integer 21..99minute (grain)", -2.7300291078209855),
+                                    ("integer (13..19)minute (grain)", -2.4423470353692043)],
+                               n = 18}}),
+       ("dual <unit-of-duration>",
+        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}}),
+       ("integer 10",
+        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}}),
+       ("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
+                                   [("integer (numeric)integer (numeric)July", -1.252762968495368),
+                                    ("month", -0.8472978603872037),
+                                    ("integer (numeric)integer (numeric)in <named-month>",
+                                     -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -1.2992829841302609), ("month", -0.7884573603642702),
+                                    ("in <named-month>", -1.2992829841302609)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        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}}),
+       ("<hour-of-day> and integer",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (13..19)", -2.1400661634962708),
+                                    ("at <time-of-day>integer 21..99", -1.7346010553881064),
+                                    ("hour", -1.2237754316221157),
+                                    ("at <time-of-day>integer (numeric)", -2.1400661634962708)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer 5", -2.3353749158170367),
+                                    ("at <time-of-day>integer (13..19)", -2.3353749158170367),
+                                    ("at <time-of-day>integer 3", -2.740840023925201),
+                                    ("at <time-of-day>integer 4", -2.740840023925201),
+                                    ("at <time-of-day>integer (20..90)", -2.740840023925201),
+                                    ("at <time-of-day>integer 8", -2.3353749158170367),
+                                    ("hour", -0.9490805546971459),
+                                    ("at <time-of-day>integer (numeric)", -2.3353749158170367)],
+                               n = 11}}),
+       ("month (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("ordinals (first..tenth)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer 4",
+        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}}),
+       ("second (grain) ",
+        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}}),
+       ("\1593\1610\1583 \1575\1604\1601\1589\1581",
+        Classifier{okData =
+                     ClassData{prior = 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 <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.2992829841302609),
+                                    ("dayday", -0.7884573603642702),
+                                    ("day (grain)yesterday", -1.2992829841302609)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-week> next", -1.8718021769015913),
+                                    ("at <time-of-day>", -1.466337068793427),
+                                    ("day", -1.466337068793427), ("hour", -1.466337068793427),
+                                    ("Tuesday", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("before <duration>",
+        Classifier{okData =
+                     ClassData{prior = -2.2512917986064953,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.9808292530117262),
+                                    ("single <unit-of-duration>", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.11122563511022437,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -2.538973871058276), ("month", -0.8649974374866046),
+                                    ("single <unit-of-duration>", -0.7472144018302211)],
+                               n = 17}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.5533852381847867, unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.627081138568543),
+                                    ("daymonth", -2.472930458741285),
+                                    ("monthyear", -2.627081138568543),
+                                    ("Wednesdayintersect", -3.7256934272366524),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)October",
+                                     -3.7256934272366524),
+                                    ("Wednesday<day-of-month> (ordinal or number) <named-month>",
+                                     -3.7256934272366524),
+                                    ("dayday", -2.8094026953624978),
+                                    ("Thursday<day-of-month> (ordinal or number) <named-month>",
+                                     -3.7256934272366524),
+                                    ("in <named-month>year (integer)", -3.3202283191284883),
+                                    ("Thursdayat <time-of-day>", -3.7256934272366524),
+                                    ("Thursday<time> <part-of-day>", -3.3202283191284883),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)this|last the <cycle>",
+                                     -3.7256934272366524),
+                                    ("last <cycle> of <time>year (integer)", -3.7256934272366524),
+                                    ("Tuesdaymonth (integer)", -3.7256934272366524),
+                                    ("Wednesday<day-of-month> (ordinal or number) of <named-month>",
+                                     -3.7256934272366524),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -3.7256934272366524),
+                                    ("Septemberyear (integer)", -3.3202283191284883),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.7256934272366524),
+                                    ("on a <named-day>September", -3.7256934272366524),
+                                    ("Octoberyear (integer)", -3.7256934272366524),
+                                    ("Sunday<cycle> this|last|next", -3.7256934272366524),
+                                    ("dayweek", -3.3202283191284883),
+                                    ("weekyear", -3.7256934272366524),
+                                    ("Mondaythis|last the <cycle>", -3.7256934272366524),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)in <named-month>",
+                                     -3.7256934272366524),
+                                    ("Wednesdayin <named-month>", -3.7256934272366524)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -0.8556661100577202, unseen = -4.276666119016055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.065455299705096),
+                                    ("TuesdaySeptember", -3.56953269648137),
+                                    ("monthyear", -2.653241964607215),
+                                    ("on a <named-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.56953269648137),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (integer)",
+                                     -2.8763855159214247),
+                                    ("dayyear", -2.4709204078132605),
+                                    ("Monday<cycle> this|last|next", -3.56953269648137),
+                                    ("Wednesdayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.56953269648137),
+                                    ("Septemberyear (integer)", -3.56953269648137),
+                                    ("on <date>year (integer)", -3.164067588373206),
+                                    ("Octoberyear (integer)", -3.56953269648137),
+                                    ("intersectyear (integer)", -3.56953269648137),
+                                    ("Mondayin <named-month>", -3.56953269648137),
+                                    ("<day-of-month> (ordinal or number) of <named-month>year (integer)",
+                                     -3.56953269648137),
+                                    ("Tuesdayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.56953269648137),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)in <named-month>",
+                                     -3.164067588373206)],
+                               n = 17}}),
+       ("integer 3",
+        Classifier{okData =
+                     ClassData{prior = -1.0560526742493137,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -0.4274440148269396, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.466337068793427), ("day", -1.466337068793427),
+                                    ("March", -1.8718021769015913), ("month", -1.466337068793427),
+                                    ("in <named-month>", -1.8718021769015913)],
+                               n = 4}}),
+       ("March",
+        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}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sundayordinals (thirtieth..nineteenth)", -2.1972245773362196),
+                                    ("Tuesdayordinals (first..tenth)", -1.791759469228055),
+                                    ("Tuesdayordinals (thirtieth..nineteenth)",
+                                     -2.1972245773362196),
+                                    ("day", -1.0986122886681098),
+                                    ("Saturdayordinals (thirtieth..nineteenth)",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesdayordinals (first..tenth)", -2.1972245773362196),
+                                    ("Tuesdayordinals (first..tenth)", -1.791759469228055),
+                                    ("Sundayordinals (first..tenth)", -2.1972245773362196),
+                                    ("day", -1.0986122886681098),
+                                    ("Saturdayordinals (first..tenth)", -2.1972245773362196)],
+                               n = 5}}),
+       ("after part of days",
+        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}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..tenth)", -0.5108256237659907),
+                                    ("ordinals (eleventh)", -1.6094379124341003),
+                                    ("ordinals (composite, e.g., eighty-seven)",
+                                     -1.6094379124341003)],
+                               n = 7}}),
+       ("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}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal or number) <named-month>",
+                                     -2.5455312716044354),
+                                    ("<time> <part-of-day>", -2.322387720290225),
+                                    ("at <time-of-day>", -2.1400661634962708),
+                                    ("intersect", -3.2386784521643803),
+                                    ("yesterday", -2.5455312716044354),
+                                    ("<day-of-month> (ordinal or number) of <named-month>",
+                                     -3.2386784521643803),
+                                    ("day", -1.8523840910444898), ("hour", -1.3668762752627892),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -3.2386784521643803),
+                                    ("minute", -3.2386784521643803),
+                                    ("part of days", -2.833213344056216)],
+                               n = 20}}),
+       ("on a <named-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Saturday", -2.0149030205422647),
+                                    ("Monday", -2.0149030205422647),
+                                    ("Friday", -2.0149030205422647), ("day", -0.916290731874155),
+                                    ("Tuesday", -1.6094379124341003)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.6094379124341003),
+                                    ("single <unit-of-duration>yesterday", -2.0149030205422647),
+                                    ("single <unit-of-duration>tomorrow", -2.0149030205422647)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("single <unit-of-duration>intersect", -2.3513752571634776),
+                                    ("daymonth", -2.3513752571634776),
+                                    ("single <unit-of-duration>in <named-month>",
+                                     -2.3513752571634776),
+                                    ("single <unit-of-duration>part of days", -2.3513752571634776),
+                                    ("minutehour", -1.9459101490553135),
+                                    ("single <unit-of-duration>month (integer)",
+                                     -2.3513752571634776),
+                                    ("secondmonth", -1.9459101490553135),
+                                    ("<integer> <unit-of-duration>part of days",
+                                     -2.3513752571634776)],
+                               n = 5}}),
+       ("\1593\1610\1583 \1575\1604\1605\1610\1604\1575\1583",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("before part of days",
+        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 (thirtieth..nineteenth)",
+        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 (integer)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> n next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("week (grain)integer 3", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer 5",
+        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 = -0.1823215567939546, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -2.1400661634962708),
+                                    ("at <time-of-day>at <time-of-day>", -1.4469189829363254),
+                                    ("hourhour", -1.2237754316221157),
+                                    ("<day-of-month> (ordinal or number) <named-month><day-of-month> (ordinal or number) <named-month>",
+                                     -2.1400661634962708),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"at <time-of-day>",
+                                     -2.1400661634962708)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.5040773967762742),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -1.5040773967762742)],
+                               n = 1}}),
+       ("Tuesday",
+        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}}),
+       ("New Year's Day",
+        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}}),
+       ("this|last the <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("month (grain)", -2.1972245773362196),
+                                    ("year (grain)", -2.1972245773362196),
+                                    ("week (grain)", -1.791759469228055),
+                                    ("day", -2.1972245773362196), ("year", -2.1972245773362196),
+                                    ("month", -2.1972245773362196),
+                                    ("day (grain)", -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("September", -2.3978952727983707),
+                                    ("October", -1.7047480922384253),
+                                    ("February", -2.3978952727983707),
+                                    ("March", -1.7047480922384253), ("month", -0.7884573603642702)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>at <time-of-day>", -0.916290731874155),
+                                    ("hourhour", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -0.916290731874155),
+                                    ("at <time-of-day>time-of-day integer (latent)",
+                                     -1.2039728043259361),
+                                    ("until <time-of-day>time-of-day integer (latent)",
+                                     -1.6094379124341003)],
+                               n = 3}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..tenth)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..tenth)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -1.5040773967762742),
+                                    ("month", -0.8109302162163288),
+                                    ("Julyinteger (numeric)", -1.0986122886681098)],
+                               n = 3}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("week (grain)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.1972245773362196),
+                                    ("day (grain)intersect", -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("week (grain)September", -2.1972245773362196),
+                                    ("day (grain)month (integer)", -2.1972245773362196)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<time> for <duration>", -2.0794415416798357),
+                                    ("weekmonth", -1.6739764335716716),
+                                    ("weekday", -2.0794415416798357),
+                                    ("week (grain)intersect", -2.0794415416798357),
+                                    ("week (grain)Saturday", -2.0794415416798357)],
+                               n = 3}}),
+       ("ordinals (composite, e.g., eighty-seven)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> last of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)month (ordinal)", -1.9459101490553135),
+                                    ("daymonth", -1.540445040947149),
+                                    ("day (grain)intersect", -1.9459101490553135),
+                                    ("weekmonth", -1.540445040947149),
+                                    ("week (grain)intersect", -1.9459101490553135),
+                                    ("day (grain)month (integer)", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.5649493574615367),
+                                    ("tomorrow", -1.8718021769015913), ("day", -1.466337068793427),
+                                    ("Christmas", -2.5649493574615367),
+                                    ("hour", -1.466337068793427),
+                                    ("part of days", -1.466337068793427)],
+                               n = 10}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.3629054936893685, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.1895840668738362,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("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 = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("single <unit-of-duration>intersect", -1.252762968495368),
+                                    ("single <unit-of-duration>in <named-month>",
+                                     -1.252762968495368),
+                                    ("secondmonth", -0.8472978603872037)],
+                               n = 2}}),
+       ("<day-of-week> the last of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("Tuesdayin <named-month>", -1.6094379124341003),
+                                    ("Mondaymonth (integer)", -1.6094379124341003),
+                                    ("Tuesdayintersect", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month (integer)", -1.3862943611198906),
+                                    ("March", -1.791759469228055), ("month", -0.8754687373538999),
+                                    ("in <named-month>", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -1.3862943611198906), ("month", -0.9808292530117262),
+                                    ("in <named-month>", -1.3862943611198906)],
+                               n = 2}}),
+       ("<day-of-week> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.8754687373538999), ("Sunday", -1.791759469228055),
+                                    ("on a <named-day>", -1.791759469228055),
+                                    ("Tuesday", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("compose by multiplication",
+        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)powers of tens", 0.0)],
+                               n = 1}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.0986122886681098),
+                                    ("month", -0.8109302162163288),
+                                    ("Augustinteger (numeric)integer (numeric)",
+                                     -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -3.367295829986474,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 27},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<hour-of-day> till third",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.3862943611198906),
+                                    ("time-of-day ordinal (latent)", -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("time-of-day integer (latent)", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("time-of-day integer (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3448404862917295),
+                                    ("integer 3", -1.791759469228055),
+                                    ("integer 5", -2.4849066497880004)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.8873031950009028,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("integer 10", -0.8109302162163288),
+                                    ("integer 3", -2.1972245773362196),
+                                    ("integer 5", -2.1972245773362196)],
+                               n = 14}}),
+       ("single <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -3.58351893845611, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9924301646902063),
+                                    ("week (grain)", -1.9924301646902063),
+                                    ("day", -1.9924301646902063),
+                                    ("day (grain)", -1.9924301646902063)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -2.8170876966696335e-2,
+                               unseen = -5.68697535633982,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.639057329615259),
+                                    ("month (grain)", -2.249592562853535),
+                                    ("hour (grain)", -1.9947003132247452),
+                                    ("year (grain)", -2.793208009442517),
+                                    ("second", -4.074141854904581),
+                                    ("week (grain)", -2.639057329615259),
+                                    ("day", -2.592537313980366),
+                                    ("minute (grain)", -3.380994674344636),
+                                    ("year", -2.793208009442517),
+                                    ("second (grain) ", -4.074141854904581),
+                                    ("hour", -1.9947003132247452), ("month", -2.249592562853535),
+                                    ("minute", -3.380994674344636),
+                                    ("day (grain)", -2.592537313980366)],
+                               n = 140}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)July", -1.0986122886681098),
+                                    ("month", -0.8109302162163288),
+                                    ("integer (numeric)integer (numeric)in <named-month>",
+                                     -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        Classifier{okData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}})]
diff --git a/Duckling/Ranking/Classifiers/AR_XX.hs b/Duckling/Ranking/Classifiers/AR_XX.hs
--- a/Duckling/Ranking/Classifiers/AR_XX.hs
+++ b/Duckling/Ranking/Classifiers/AR_XX.hs
@@ -41,10 +41,10 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.3462762367178338, unseen = -4.0943445622221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
+                     ClassData{prior = -0.3184537311185346, unseen = -4.189654742026425,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 64},
                    koData =
-                     ClassData{prior = -1.2286654169163076, unseen = -3.258096538021482,
+                     ClassData{prior = -1.2992829841302609, unseen = -3.258096538021482,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 24}}),
        ("ordinals (twelveth)",
         Classifier{okData =
@@ -211,6 +211,7 @@
                                     ("at <time-of-day>until <time-of-day>", -3.9186675481468147),
                                     ("hh:mmafter part of days", -4.324132656254979),
                                     ("past year (latent)part of days", -4.324132656254979),
+                                    ("nograinhour", -4.324132656254979),
                                     ("hh:mmuntil <time-of-day>", -4.324132656254979),
                                     ("<time-of-day> - <time-of-day> (interval)part of days",
                                      -4.324132656254979),
@@ -237,7 +238,6 @@
                                     ("hh:mmafter <time-of-day>", -4.324132656254979),
                                     ("at <time-of-day>after part of days", -4.324132656254979),
                                     ("past year (latent)after <time-of-day>", -4.324132656254979),
-                                    ("secondhour", -4.324132656254979),
                                     ("from <datetime> - <datetime> (interval)after <time-of-day>",
                                      -4.324132656254979),
                                     ("<hour-of-day> till quarteruntil <time-of-day>",
@@ -327,37 +327,35 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("on <date>",
         Classifier{okData =
-                     ClassData{prior = -0.6539264674066639, unseen = -3.784189633918261,
+                     ClassData{prior = -0.6931471805599453, unseen = -3.713572066704308,
                                likelihoods =
                                  HashMap.fromList
                                    [("<day-of-month> (ordinal or number) <named-month>",
-                                     -2.662587827025453),
-                                    ("September", -3.068052935133617),
+                                     -2.5902671654458267),
+                                    ("September", -2.995732273553991),
                                     ("<day-of-month> (ordinal or number) of <named-month>",
-                                     -3.068052935133617),
-                                    ("day", -1.363304842895192), ("year", -2.662587827025453),
-                                    ("part of <named-month>", -2.151762203259462),
-                                    ("month", -3.068052935133617),
-                                    ("year (integer)", -2.662587827025453),
-                                    ("this|last the <cycle>", -3.068052935133617),
-                                    ("day of <named-month>", -3.068052935133617),
-                                    ("this <time>", -3.068052935133617)],
-                               n = 13},
+                                     -2.995732273553991),
+                                    ("day", -1.3862943611198906), ("year", -2.5902671654458267),
+                                    ("part of <named-month>", -2.0794415416798357),
+                                    ("month", -2.995732273553991),
+                                    ("year (integer)", -2.5902671654458267),
+                                    ("this|last the <cycle>", -2.995732273553991),
+                                    ("day of <named-month>", -2.995732273553991)],
+                               n = 12},
                    koData =
-                     ClassData{prior = -0.7339691750802004,
-                               unseen = -3.7376696182833684,
+                     ClassData{prior = -0.6931471805599453, unseen = -3.713572066704308,
                                likelihoods =
                                  HashMap.fromList
-                                   [("September", -3.0204248861443626),
-                                    ("October", -3.0204248861443626),
-                                    ("intersect", -2.1041341542702074),
-                                    ("Saturday", -3.0204248861443626),
-                                    ("<time> for <duration>", -2.6149597780361984),
-                                    ("day", -3.0204248861443626),
-                                    ("month (ordinal)", -3.0204248861443626),
+                                   [("September", -2.995732273553991),
+                                    ("October", -2.995732273553991),
+                                    ("intersect", -2.0794415416798357),
+                                    ("Saturday", -2.995732273553991),
+                                    ("<time> for <duration>", -2.5902671654458267),
+                                    ("day", -2.995732273553991),
+                                    ("month (ordinal)", -2.995732273553991),
                                     ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.6149597780361984),
-                                    ("month", -1.2286654169163076)],
+                                     -2.5902671654458267),
+                                    ("month", -1.2039728043259361)],
                                n = 12}}),
        ("<hour-of-day> and integer minutes",
         Classifier{okData =
@@ -461,153 +459,173 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 39}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.6074917359814515, unseen = -5.455321115357702,
+                     ClassData{prior = -0.569352963213281, unseen = -5.529429087511423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Tuesdayon <date>", -4.757891273005756),
-                                    ("in <named-month>year", -4.757891273005756),
+                                   [("Tuesdayon <date>", -4.832305758571839),
+                                    ("in <named-month>year", -4.832305758571839),
                                     ("<hour-of-day> till thirdafter part of days",
-                                     -4.352426164897591),
-                                    ("dayhour", -3.8416005411316), ("daymonth", -4.757891273005756),
-                                    ("in <named-month>on <date>", -4.757891273005756),
-                                    ("monthyear", -3.253813876229481),
-                                    ("Mondayon <date>", -4.757891273005756),
-                                    ("Christmasyear", -4.757891273005756),
+                                     -4.426840650463674),
+                                    ("dayhour", -3.9160150266976834),
+                                    ("daymonth", -4.832305758571839),
+                                    ("in <named-month>on <date>", -4.832305758571839),
+                                    ("monthyear", -3.3282283617955644),
+                                    ("Mondayon <date>", -4.832305758571839),
+                                    ("Christmasyear", -4.832305758571839),
                                     ("Monday<day-of-month> (ordinal or number) <named-month>",
-                                     -4.757891273005756),
-                                    ("month (integer)year (integer)", -4.352426164897591),
+                                     -4.832305758571839),
+                                    ("month (integer)year (integer)", -4.426840650463674),
+                                    ("\1593\1610\1583 \1575\1604\1605\1610\1604\1575\1583year",
+                                     -4.832305758571839),
                                     ("<day-of-week> the last of <time><cycle> this|last|next",
-                                     -4.757891273005756),
-                                    ("at <time-of-day>before part of days", -4.06474409244581),
-                                    ("hh:mmbefore part of days", -4.757891273005756),
+                                     -4.832305758571839),
+                                    ("at <time-of-day>before part of days", -4.139158578011894),
+                                    ("hh:mmbefore part of days", -4.832305758571839),
                                     ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.757891273005756),
-                                    ("intersect<time> <part-of-day>", -4.352426164897591),
-                                    ("month (ordinal)year (integer)", -4.757891273005756),
-                                    ("dd/mm<time> <part-of-day>", -4.757891273005756),
-                                    ("Thursday<time> timezone", -4.352426164897591),
+                                     -4.832305758571839),
+                                    ("intersect<time> <part-of-day>", -4.426840650463674),
+                                    ("month (ordinal)year (integer)", -4.832305758571839),
+                                    ("\1593\1610\1583 \1575\1604\1601\1589\1581year",
+                                     -4.832305758571839),
+                                    ("dd/mm<time> <part-of-day>", -4.832305758571839),
+                                    ("Thursday<time> timezone", -4.426840650463674),
                                     ("<hour-of-day> till quarterthis <part-of-day>",
-                                     -4.352426164897591),
-                                    ("dayday", -2.9661318037777002),
+                                     -4.426840650463674),
+                                    ("dayday", -3.0405462893437836),
                                     ("absorption of , after named day<day-of-month> (ordinal or number) <named-month>",
-                                     -4.757891273005756),
-                                    ("hourhour", -3.6592789843376456),
-                                    ("month (integer)year", -4.757891273005756),
+                                     -4.832305758571839),
+                                    ("hourhour", -3.733693469903729),
+                                    ("month (integer)year", -4.832305758571839),
+                                    ("\1593\1610\1583 \1575\1604\1601\1591\1585year",
+                                     -4.832305758571839),
                                     ("Thursday<day-of-month> (ordinal or number) <named-month>",
-                                     -4.757891273005756),
-                                    ("dayyear", -3.505128304510387),
-                                    ("Thursday<time> <part-of-day>", -4.757891273005756),
-                                    ("<cycle> last of <time>year (integer)", -4.352426164897591),
-                                    ("last <cycle> of <time>year (integer)", -4.757891273005756),
-                                    ("<hour-of-day> quarterafter part of days", -4.757891273005756),
-                                    ("minutehour", -2.4553061800117097),
+                                     -4.832305758571839),
+                                    ("dayyear", -2.960503581670247),
+                                    ("Thursday<time> <part-of-day>", -4.832305758571839),
+                                    ("<cycle> last of <time>year (integer)", -4.426840650463674),
+                                    ("last <cycle> of <time>year (integer)", -4.832305758571839),
+                                    ("<hour-of-day> quarterafter part of days", -4.832305758571839),
+                                    ("minutehour", -2.529720665577793),
                                     ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.757891273005756),
-                                    ("Monday<cycle> this|last|next", -4.757891273005756),
+                                     -4.832305758571839),
+                                    ("\1585\1571\1587 \1575\1604\1587\1606\1577 \1575\1604\1607\1580\1585\1610\1577year",
+                                     -4.832305758571839),
+                                    ("Monday<cycle> this|last|next", -4.832305758571839),
                                     ("<day-of-month> (ordinal or number) of <named-month>year",
-                                     -4.757891273005756),
-                                    ("<cycle> <ordinal> day? of <time>year", -4.757891273005756),
-                                    ("on a <named-day>dd/mm", -4.757891273005756),
-                                    ("on a <named-day>on <date>", -4.757891273005756),
+                                     -4.832305758571839),
+                                    ("<cycle> <ordinal> day? of <time>year", -4.832305758571839),
+                                    ("\1593\1610\1583 \1575\1604\1571\1590\1581\1609year",
+                                     -4.832305758571839),
+                                    ("on a <named-day>dd/mm", -4.832305758571839),
+                                    ("on a <named-day>on <date>", -4.832305758571839),
                                     ("on a <named-day><day-of-month> (ordinal or number) <named-month>",
-                                     -4.757891273005756),
-                                    ("Tuesday<cycle> this|last|next", -4.757891273005756),
-                                    ("dayminute", -3.505128304510387),
-                                    ("dd/mmintersect", -4.757891273005756),
-                                    ("in <named-month><cycle> this|last|next", -4.757891273005756),
+                                     -4.832305758571839),
+                                    ("Tuesday<cycle> this|last|next", -4.832305758571839),
+                                    ("dayminute", -3.5795427900764705),
+                                    ("dd/mmintersect", -4.832305758571839),
+                                    ("in <named-month><cycle> this|last|next", -4.832305758571839),
                                     ("<hour-of-day> and integer minutesafter part of days",
-                                     -4.352426164897591),
-                                    ("Saturdaydd/mm", -4.757891273005756),
-                                    ("the <cycle> the <ordinal> of <time>year", -4.757891273005756),
-                                    ("at <time-of-day>after part of days", -3.6592789843376456),
-                                    ("<ordinal> <cycle> of <time>year", -4.757891273005756),
-                                    ("Sunday<cycle> this|last|next", -4.757891273005756),
+                                     -4.426840650463674),
+                                    ("Saturdaydd/mm", -4.832305758571839),
+                                    ("\1585\1605\1590\1575\1606year", -4.832305758571839),
+                                    ("the <cycle> the <ordinal> of <time>year", -4.832305758571839),
+                                    ("at <time-of-day>after part of days", -3.733693469903729),
+                                    ("<ordinal> <cycle> of <time>year", -4.832305758571839),
+                                    ("Sunday<cycle> this|last|next", -4.832305758571839),
                                     ("Tuesday<day-of-month> (ordinal or number) of <named-month>",
-                                     -4.352426164897591),
-                                    ("Septemberon <date>", -4.757891273005756),
+                                     -4.426840650463674),
+                                    ("Septemberon <date>", -4.832305758571839),
                                     ("from <datetime> - <datetime> (interval)after part of days",
-                                     -4.757891273005756),
-                                    ("intersectintersect", -4.352426164897591),
-                                    ("dayweek", -4.06474409244581), ("weekyear", -3.8416005411316),
+                                     -4.832305758571839),
+                                    ("intersectintersect", -4.426840650463674),
+                                    ("dayweek", -4.139158578011894),
+                                    ("weekyear", -3.9160150266976834),
                                     ("<datetime> - <datetime> (interval)after part of days",
-                                     -4.757891273005756),
+                                     -4.832305758571839),
                                     ("Friday<day-of-month> (ordinal or number) <named-month>",
-                                     -4.757891273005756),
+                                     -4.832305758571839),
                                     ("<hour-of-day> till quarterbefore part of days",
-                                     -4.352426164897591),
+                                     -4.426840650463674),
                                     ("<time-of-day> - <time-of-day> (interval)after part of days",
-                                     -4.757891273005756),
-                                    ("at <time-of-day>this <part-of-day>", -4.757891273005756),
+                                     -4.832305758571839),
+                                    ("at <time-of-day>this <part-of-day>", -4.832305758571839),
                                     ("<hour-of-day> till thirdbefore part of days",
-                                     -4.352426164897591)],
-                               n = 67},
+                                     -4.426840650463674)],
+                               n = 73},
                    koData =
-                     ClassData{prior = -0.7868326646372683, unseen = -5.356586274672012,
+                     ClassData{prior = -0.8344607136265229, unseen = -5.384495062789089,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Tuesdayon <date>", -4.658710952916121),
-                                    ("dayhour", -3.154633556139847),
-                                    ("daymonth", -3.5600986642480117),
-                                    ("monthday", -4.658710952916121),
-                                    ("monthyear", -2.78690877601453),
-                                    ("hh:mmafter part of days", -4.658710952916121),
-                                    ("houryear", -4.253245844807957),
-                                    ("intersectat <time-of-day>", -3.742420221041966),
-                                    ("intersect<time> <part-of-day>", -4.253245844807957),
-                                    ("Octoberon <date>", -4.658710952916121),
-                                    ("until <time-of-day>after part of days", -4.658710952916121),
-                                    ("this|last <cycle>on <date>", -4.658710952916121),
-                                    ("Tuesdayafter <time-of-day>", -4.658710952916121),
-                                    ("Wednesdayon <date>", -4.253245844807957),
-                                    ("dd/mm<time> <part-of-day>", -4.658710952916121),
-                                    ("yearyear", -4.253245844807957),
+                                   [("Tuesdayon <date>", -4.686750172980514),
+                                    ("dayhour", -3.18267277620424),
+                                    ("daymonth", -3.5881378843124043),
+                                    ("monthday", -4.686750172980514),
+                                    ("monthyear", -2.814947996078923),
+                                    ("hh:mmafter part of days", -4.686750172980514),
+                                    ("houryear", -4.28128506487235),
+                                    ("intersectat <time-of-day>", -3.770459441106359),
+                                    ("intersect<time> <part-of-day>", -4.28128506487235),
+                                    ("Octoberon <date>", -4.686750172980514),
+                                    ("until <time-of-day>after part of days", -4.686750172980514),
+                                    ("this|last <cycle>on <date>", -4.686750172980514),
+                                    ("Tuesdayafter <time-of-day>", -4.686750172980514),
+                                    ("Wednesdayon <date>", -4.28128506487235),
+                                    ("dd/mm<time> <part-of-day>", -4.686750172980514),
+                                    ("yearyear", -4.28128506487235),
                                     ("<hour-of-day> till quarterthis <part-of-day>",
-                                     -4.658710952916121),
-                                    ("dayday", -3.965563772356176),
-                                    ("dd/mmat <time-of-day>", -4.253245844807957),
-                                    ("hourhour", -4.253245844807957),
-                                    ("dayyear", -3.405947984420753),
-                                    ("Thursdayat <time-of-day>", -4.253245844807957),
-                                    ("Februaryyear", -4.658710952916121),
-                                    ("minutemonth", -4.658710952916121),
-                                    ("minutehour", -4.253245844807957),
-                                    ("for <duration> from <time>on <date>", -4.658710952916121),
+                                     -4.686750172980514),
+                                    ("dayday", -3.993602992420569),
+                                    ("dd/mmat <time-of-day>", -4.28128506487235),
+                                    ("hourhour", -4.28128506487235),
+                                    ("dayyear", -3.4339872044851463),
+                                    ("Thursdayat <time-of-day>", -4.28128506487235),
+                                    ("Februaryyear", -4.686750172980514),
+                                    ("minutemonth", -4.686750172980514),
+                                    ("minutehour", -4.28128506487235),
+                                    ("for <duration> from <time>on <date>", -4.686750172980514),
                                     ("<day-of-month> (ordinal or number) of <named-month>year",
-                                     -4.253245844807957),
-                                    ("March<cycle> this|last|next", -4.658710952916121),
-                                    ("nth <time> of <time>year", -4.658710952916121),
+                                     -4.28128506487235),
+                                    ("March<cycle> this|last|next", -4.686750172980514),
+                                    ("nth <time> of <time>year", -4.686750172980514),
                                     ("Wednesday<day-of-month> (ordinal or number) of <named-month>",
-                                     -4.658710952916121),
-                                    ("secondyear", -4.253245844807957),
+                                     -4.686750172980514),
+                                    ("secondyear", -4.28128506487235),
                                     ("Wednesdayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.658710952916121),
-                                    ("on <date>year (integer)", -4.658710952916121),
-                                    ("<time> for <duration>year", -3.5600986642480117),
+                                     -4.686750172980514),
+                                    ("on <date>year (integer)", -4.686750172980514),
+                                    ("<time> for <duration>year", -3.5881378843124043),
                                     ("<duration> after|before|from <time>on <date>",
-                                     -4.658710952916121),
-                                    ("dayminute", -3.154633556139847),
-                                    ("Julyuntil <time-of-day>", -4.658710952916121),
-                                    ("intersecton <date>", -4.658710952916121),
-                                    ("at <time-of-day>after part of days", -4.658710952916121),
-                                    ("Octoberyear", -4.658710952916121),
-                                    ("in|within|after <duration>year", -4.253245844807957),
+                                     -4.686750172980514),
+                                    ("dayminute", -3.18267277620424),
+                                    ("Julyuntil <time-of-day>", -4.686750172980514),
+                                    ("intersecton <date>", -4.686750172980514),
+                                    ("at <time-of-day>after part of days", -4.686750172980514),
+                                    ("Octoberyear", -4.686750172980514),
+                                    ("in|within|after <duration>year", -4.28128506487235),
                                     ("Tuesday<day-of-month> (ordinal or number) of <named-month>",
-                                     -4.658710952916121),
-                                    ("on a <named-day>intersect", -4.253245844807957),
-                                    ("Saturdayintersect", -4.253245844807957),
-                                    ("at <time-of-day>year", -4.658710952916121),
-                                    ("on <date>year", -4.253245844807957),
-                                    ("on <date>on <date>", -4.658710952916121),
-                                    ("weekday", -4.658710952916121),
-                                    ("Tuesdaynth <time> of <time>", -4.658710952916121),
-                                    ("weekyear", -4.658710952916121),
-                                    ("Tuesdayintersect", -4.658710952916121),
-                                    ("after <time-of-day>year", -4.658710952916121),
-                                    ("in <number> (implicit minutes)February", -4.658710952916121),
-                                    ("last <cycle> of <time>year", -4.658710952916121),
+                                     -4.686750172980514),
+                                    ("on a <named-day>intersect", -4.28128506487235),
+                                    ("Saturdayintersect", -4.28128506487235),
+                                    ("at <time-of-day>year", -4.686750172980514),
+                                    ("on <date>year", -4.28128506487235),
+                                    ("on <date>on <date>", -4.686750172980514),
+                                    ("weekday", -4.686750172980514),
+                                    ("Tuesdaynth <time> of <time>", -4.686750172980514),
+                                    ("weekyear", -4.686750172980514),
+                                    ("Tuesdayintersect", -4.686750172980514),
+                                    ("after <time-of-day>year", -4.686750172980514),
+                                    ("in <number> (implicit minutes)February", -4.686750172980514),
+                                    ("last <cycle> of <time>year", -4.686750172980514),
                                     ("<day-of-month> (ordinal or number) of <named-month>on <date>",
-                                     -4.658710952916121)],
+                                     -4.686750172980514)],
                                n = 56}}),
+       ("\1585\1605\1590\1575\1606",
+        Classifier{okData =
+                     ClassData{prior = 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> the <ordinal> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.833213344056216,
@@ -654,13 +672,12 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("year (grain)",
         Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
+                     ClassData{prior = -1.2237754316221157,
                                unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 5},
                    koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
@@ -792,6 +809,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1593\1610\1583 \1575\1604\1571\1590\1581\1609",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinals (twenty, thirty..ninety)",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
@@ -888,6 +912,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1585\1571\1587 \1575\1604\1587\1606\1577 \1575\1604\1607\1580\1585\1610\1577",
+        Classifier{okData =
+                     ClassData{prior = 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,
@@ -916,8 +947,8 @@
                                n = 1}}),
        ("week (grain)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                     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}}),
@@ -1019,8 +1050,8 @@
                      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}}),
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
        ("Friday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -1122,6 +1153,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1593\1610\1583 \1575\1604\1601\1591\1585",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("minute (grain)",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
@@ -1161,18 +1199,19 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -1.4469189829363254,
-                               unseen = -1.9459101490553135,
+                     ClassData{prior = -0.9932517730102834,
+                               unseen = -2.5649493574615367,
                                likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -0.1823215567939546)],
-                               n = 4},
+                                 HashMap.fromList [("integer (numeric)", -8.701137698962981e-2)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.2682639865946794, unseen = -2.772588722239781,
+                     ClassData{prior = -0.46262352194811296,
+                               unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.2231435513142097),
-                                    ("powers of tens", -1.6094379124341003)],
-                               n = 13}}),
+                                   [("integer (numeric)", -0.4595323293784402),
+                                    ("powers of tens", -0.9985288301111273)],
+                               n = 17}}),
        ("last <day-of-week> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -1302,6 +1341,13 @@
                    koData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("\1593\1610\1583 \1575\1604\1601\1589\1581",
+        Classifier{okData =
+                     ClassData{prior = 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 <cycle> after|before <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -1327,6 +1373,23 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("before <duration>",
+        Classifier{okData =
+                     ClassData{prior = -2.2512917986064953,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.9808292530117262),
+                                    ("single <unit-of-duration>", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.11122563511022437,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -2.538973871058276), ("month", -0.8649974374866046),
+                                    ("single <unit-of-duration>", -0.7472144018302211)],
+                               n = 17}}),
        ("intersect by \",\", \"of\", \"from\", \"'s\"",
         Classifier{okData =
                      ClassData{prior = -0.5533852381847867, unseen = -4.430816798843313,
@@ -1404,21 +1467,16 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 15}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Monday", -1.845826690498331),
-                                    ("<day-of-month> (ordinal or number) of <named-month>",
-                                     -2.2512917986064953),
-                                    ("day", -1.3350010667323402),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.2512917986064953),
-                                    ("March", -2.2512917986064953), ("month", -1.845826690498331),
-                                    ("in <named-month>", -2.2512917986064953)],
-                               n = 6}}),
+                                   [("Monday", -1.466337068793427), ("day", -1.466337068793427),
+                                    ("March", -1.8718021769015913), ("month", -1.466337068793427),
+                                    ("in <named-month>", -1.8718021769015913)],
+                               n = 4}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
@@ -1539,6 +1597,13 @@
                                     ("<integer> <unit-of-duration>part of days",
                                      -2.3513752571634776)],
                                n = 5}}),
+       ("\1593\1610\1583 \1575\1604\1605\1610\1604\1575\1583",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("before part of days",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -1607,6 +1672,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Day",
+        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}}),
        ("this|last the <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.9444389791664407,
@@ -1881,31 +1953,33 @@
                                n = 14}}),
        ("single <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -4.248495242049359, unseen = -2.9444389791664407,
+                     ClassData{prior = -3.58351893845611, unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -1.791759469228055),
-                                    ("day (grain)", -1.791759469228055)],
-                               n = 2},
+                                   [("week", -1.9924301646902063),
+                                    ("week (grain)", -1.9924301646902063),
+                                    ("day", -1.9924301646902063),
+                                    ("day (grain)", -1.9924301646902063)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -1.4388737452099556e-2,
-                               unseen = -5.673323267171493,
+                     ClassData{prior = -2.8170876966696335e-2,
+                               unseen = -5.68697535633982,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.6253584852570966),
-                                    ("month (grain)", -2.2358937184953733),
-                                    ("hour (grain)", -1.9810014688665833),
-                                    ("year (grain)", -2.8972922007407385),
-                                    ("second", -4.060443010546419),
-                                    ("week (grain)", -2.6253584852570966),
-                                    ("day", -2.578838469622204),
-                                    ("minute (grain)", -3.367295829986474),
-                                    ("year", -2.8972922007407385),
-                                    ("second (grain) ", -4.060443010546419),
-                                    ("hour", -1.9810014688665833), ("month", -2.2358937184953733),
-                                    ("minute", -3.367295829986474),
-                                    ("day (grain)", -2.578838469622204)],
-                               n = 138}}),
+                                   [("week", -2.639057329615259),
+                                    ("month (grain)", -2.249592562853535),
+                                    ("hour (grain)", -1.9947003132247452),
+                                    ("year (grain)", -2.793208009442517),
+                                    ("second", -4.074141854904581),
+                                    ("week (grain)", -2.639057329615259),
+                                    ("day", -2.592537313980366),
+                                    ("minute (grain)", -3.380994674344636),
+                                    ("year", -2.793208009442517),
+                                    ("second (grain) ", -4.074141854904581),
+                                    ("hour", -1.9947003132247452), ("month", -2.249592562853535),
+                                    ("minute", -3.380994674344636),
+                                    ("day (grain)", -2.592537313980366)],
+                               n = 140}}),
        ("dd-dd <month> (interval)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -1921,14 +1995,13 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("today", -1.252762968495368), ("Monday", -1.252762968495368),
-                                    ("day", -0.8472978603872037)],
-                               n = 2},
+                                   [("Monday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("August",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/BG_XX.hs b/Duckling/Ranking/Classifiers/BG_XX.hs
--- a/Duckling/Ranking/Classifiers/BG_XX.hs
+++ b/Duckling/Ranking/Classifiers/BG_XX.hs
@@ -19,4 +19,640 @@
 import Duckling.Ranking.Types
 
 classifiers :: Classifiers
-classifiers = HashMap.fromList []
+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 = -0.7308875085427924, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -0.6567795363890705, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("noon|midnight|EOD|end of day",
+        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}}),
+       ("from|since|after <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -2.0149030205422647),
+                                    ("day", -1.6094379124341003),
+                                    ("the <day-of-month> (number)", -1.6094379124341003),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("hour", -1.3217558399823195)],
+                               n = 5}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)March", -2.0794415416798357),
+                                    ("integer (numeric)April", -2.0794415416798357),
+                                    ("integer (numeric)August", -2.0794415416798357),
+                                    ("integer (numeric)February", -2.0794415416798357),
+                                    ("month", -0.9808292530117262),
+                                    ("integer (numeric)March", -2.0794415416798357)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.0986122886681098),
+                                    ("at <time-of-day>part of days", -1.5040773967762742),
+                                    ("time-of-day (latent)part of days", -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1786549963416462),
+                                    ("the <day-of-month> (number)part of days",
+                                     -1.1786549963416462),
+                                    ("hourhour", -1.8718021769015913),
+                                    ("time-of-day (latent)part of days", -1.8718021769015913)],
+                               n = 4}}),
+       ("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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am", -2.0149030205422647),
+                                    ("time-of-day (latent)", -1.3217558399823195),
+                                    ("hh:mm", -2.0149030205422647), ("hour", -1.0986122886681098),
+                                    ("minute", -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -1.252762968495368)],
+                               n = 1}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
+                   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}}),
+       ("<time-of-day> pm",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm", -1.0986122886681098),
+                                    ("minute", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("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 = 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> 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}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.252762968495368), ("year", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        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}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.3978952727983707),
+                                    ("monthyear", -2.3978952727983707),
+                                    ("Octoberyear (latent)", -2.3978952727983707),
+                                    ("todayat <time-of-day>", -2.3978952727983707),
+                                    ("dayday", -2.3978952727983707),
+                                    ("absorption of , after named day<day-of-month> (ordinal or number) <named-month>",
+                                     -2.3978952727983707),
+                                    ("dayyear", -2.3978952727983707),
+                                    ("the <day-of-month> (ordinal)March", -2.3978952727983707),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -2.3978952727983707),
+                                    ("dayminute", -2.3978952727983707)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.0794415416798357),
+                                    ("monthyear", -2.0794415416798357),
+                                    ("todayat <time-of-day>", -2.0794415416798357),
+                                    ("Aprilyear (latent)", -2.0794415416798357)],
+                               n = 2}}),
+       ("after lunch/work/school",
+        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}}),
+       ("in <number> (implicit minutes)",
+        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}}),
+       ("year (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}}),
+       ("Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        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}}),
+       ("Monday",
+        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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 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> am",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("time-of-day (latent)", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253), ("hour", -1.2992829841302609),
+                                    ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -1.252762968495368)],
+                               n = 1}}),
+       ("week (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}}),
+       ("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}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight", -1.252762968495368), ("hour", -0.8472978603872037),
+                                    ("part of days", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = 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 = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("month (grain)", -2.3025850929940455),
+                                    ("year (grain)", -1.6094379124341003),
+                                    ("week (grain)", -1.6094379124341003),
+                                    ("year", -1.6094379124341003), ("month", -2.3025850929940455)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Friday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("ordinals (first..19th)", 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 = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 5}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 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 (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.8109302162163288,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.40546510810816444),
+                                    ("number (0..19)", -1.0986122886681098)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.587786664902119, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -0.15415067982725836)],
+                               n = 5}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)day (grain)", -1.6094379124341003),
+                                    ("integer (numeric)year (grain)", -1.6094379124341003),
+                                    ("day", -1.6094379124341003), ("year", -1.6094379124341003)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("integer (numeric)hour (grain)", -1.3862943611198906)],
+                               n = 1}}),
+       ("ordinals (first..19th)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("the <day-of-month> (ordinal)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0149030205422647),
+                                    ("month (grain)", -2.70805020110221),
+                                    ("hour (grain)", -2.70805020110221),
+                                    ("year (grain)", -1.791759469228055),
+                                    ("week (grain)", -2.0149030205422647),
+                                    ("day", -2.70805020110221), ("year", -1.791759469228055),
+                                    ("hour", -2.70805020110221), ("month", -2.70805020110221),
+                                    ("day (grain)", -2.70805020110221)],
+                               n = 10}}),
+       ("hh:mm",
+        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}}),
+       ("number (0..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}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday<day-of-month> (ordinal or number) <named-month>",
+                                     -0.6931471805599453),
+                                    ("dayday", -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}}),
+       ("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}}),
+       ("dd.mm.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<day-of-month>(ordinal or number)/<named-month>/year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.5040773967762742), ("March", -1.5040773967762742),
+                                    ("month", -1.5040773967762742),
+                                    ("Tuesday", -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Friday", -1.252762968495368), ("day", -1.252762968495368)],
+                               n = 1}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> year",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -0.916290731874155), ("month", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("April", -0.8472978603872037), ("month", -0.8472978603872037)],
+                               n = 2}}),
+       ("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}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Aprilinteger (numeric)", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.3862943611198906), ("day", -0.9808292530117262),
+                                    ("Tuesday", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Friday", -1.0986122886681098), ("day", -1.0986122886681098)],
+                               n = 1}}),
+       ("day (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}}),
+       ("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}}),
+       ("intersect by \",\", \"of\", \"from\" for year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -0.6931471805599453),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of days",
+        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}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 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.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.6094379124341003), ("day", -0.916290731874155),
+                                    ("winter", -1.6094379124341003),
+                                    ("summer", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        Classifier{okData =
+                     ClassData{prior = 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/BN_XX.hs b/Duckling/Ranking/Classifiers/BN_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/BN_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.BN_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/CA_XX.hs b/Duckling/Ranking/Classifiers/CA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/CA_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.CA_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_XX.hs b/Duckling/Ranking/Classifiers/DA_XX.hs
--- a/Duckling/Ranking/Classifiers/DA_XX.hs
+++ b/Duckling/Ranking/Classifiers/DA_XX.hs
@@ -23,30 +23,31 @@
   = HashMap.fromList
       [("<time> timezone",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                     ClassData{prior = 0.0, unseen = -3.6109179126442243,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.3217558399823195),
-                                    ("hh:mm", -1.455287232606842), ("hour", -2.0149030205422647),
-                                    ("minute", -1.0033021088637848)],
-                               n = 13},
+                                   [("at <time-of-day>", -1.2809338454620642),
+                                    ("hh:mm", -1.5040773967762742), ("hour", -1.9740810260220096),
+                                    ("minute", -1.0185695809945732)],
+                               n = 16},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Thursday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                     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}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.8013607652001781, unseen = -4.955827057601261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 140},
+                     ClassData{prior = -0.7872986116830517,
+                               unseen = -5.0689042022202315,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 157},
                    koData =
-                     ClassData{prior = -0.5955087109960292, unseen = -5.159055299214529,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 172}}),
+                     ClassData{prior = -0.6071024542014105, unseen = -5.247024072160486,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 188}}),
        ("the day before yesterday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -63,7 +64,7 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
+                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
                                    [("dayhour", -1.0986122886681098),
@@ -73,70 +74,68 @@
                                     ("Mondaymorning", -2.0149030205422647)],
                                n = 4},
                    koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
-                                   [("yearhour", -1.1786549963416462),
+                                   [("yearhour", -1.0986122886681098),
                                     ("year (latent)in|during the <part-of-day>",
-                                     -1.1786549963416462)],
-                               n = 3}}),
+                                     -1.0986122886681098)],
+                               n = 4}}),
        ("dd/mm",
         Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
+                     ClassData{prior = -0.40546510810816444,
                                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}}),
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
        ("today",
         Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
                    koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
+                     ClassData{prior = -1.791759469228055, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("at <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.2682639865946794, unseen = -4.718498871295094,
+                     ClassData{prior = -0.2674793651342615, unseen = -5.062595033026967,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<time> timezone", -3.100092288878234),
-                                    ("time-of-day (latent)", -1.2755429968271879),
+                                   [("<time> timezone", -3.264486336120253),
+                                    ("time-of-day (latent)", -1.2495833155779883),
                                     ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.6109179126442243),
-                                    ("hh:mm", -2.001480000210124),
-                                    ("<time-of-day> sharp", -3.6109179126442243),
-                                    ("hour", -1.213022639845854), ("minute", -1.6650077635889111)],
-                               n = 52},
+                                     -3.9576335166801986),
+                                    ("hh:mm", -1.9652033519899923),
+                                    ("<time-of-day> sharp", -3.6699514442284173),
+                                    ("hour", -1.1850447944404172), ("minute", -1.688949975361834)],
+                               n = 75},
                    koData =
-                     ClassData{prior = -1.4469189829363254,
-                               unseen = -3.6888794541139363,
+                     ClassData{prior = -1.4494732627414222,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("time-of-day (latent)", -0.8303483020734304),
-                                    ("hour", -0.8303483020734304)],
-                               n = 16}}),
+                                   [("time-of-day (latent)", -0.7922380832041762),
+                                    ("hour", -0.7922380832041762)],
+                               n = 23}}),
        ("absorption of , after named day",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -2.3025850929940455),
-                                    ("Saturday", -2.3025850929940455),
-                                    ("Monday", -1.8971199848858813),
-                                    ("Friday", -1.8971199848858813), ("day", -0.916290731874155),
-                                    ("Sunday", -2.3025850929940455)],
-                               n = 7},
+                                   [("Wednesday", -2.3978952727983707),
+                                    ("Saturday", -1.9924301646902063),
+                                    ("Monday", -1.9924301646902063),
+                                    ("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},
+                     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}}),
@@ -173,39 +172,43 @@
                                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,
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -0.9808292530117262),
-                                    ("hh:mmhh:mm", -0.9808292530117262)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.2039728043259361),
+                                    ("hh:mmhh:mm", -1.2039728043259361),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.9459101490553135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 2}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 1}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.7047480922384253),
+                                    ("minuteminute", -1.2992829841302609),
+                                    ("hh:mmhh:mm", -1.2992829841302609),
+                                    ("minutehour", -1.7047480922384253)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
-                                    ("minuteminute", -1.7047480922384253),
-                                    ("minutehour", -1.2992829841302609),
-                                    ("hh:mmintersect", -1.7047480922384253)],
-                               n = 3}}),
+                                   [("hh:mmtime-of-day (latent)", -1.5040773967762742),
+                                    ("minuteminute", -1.5040773967762742),
+                                    ("minutehour", -1.5040773967762742),
+                                    ("hh:mmintersect", -1.5040773967762742)],
+                               n = 2}}),
        ("October",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -274,7 +277,7 @@
                                  HashMap.fromList
                                    [("ordinal (digits)quarter (grain)", -1.252762968495368),
                                     ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
+                                    ("ordinals (first..19st)quarter (grain)", -1.252762968495368)],
                                n = 2},
                    koData =
                      ClassData{prior = -0.6931471805599453,
@@ -283,156 +286,146 @@
                                  HashMap.fromList
                                    [("ordinal (digits)quarter (grain)", -1.252762968495368),
                                     ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
+                                    ("ordinals (first..19st)quarter (grain)", -1.252762968495368)],
                                n = 2}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4402080565520373, unseen = -5.84354441703136,
+                     ClassData{prior = -0.3657247794586503, unseen = -5.955837369464831,
                                likelihoods =
                                  HashMap.fromList
                                    [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.048882188145344),
+                                     -4.161483865059729),
                                     ("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -5.147494476813453),
+                                     -5.260096153727839),
                                     ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.048882188145344),
-                                    ("hourday", -5.147494476813453),
-                                    ("dayhour", -2.896202678206958),
-                                    ("daymonth", -3.355735007585398),
-                                    ("monthyear", -3.068052935133617),
-                                    ("Mondayon <date>", -5.147494476813453),
-                                    ("intersecthh:mm", -5.147494476813453),
-                                    ("Wednesdaynext <cycle>", -5.147494476813453),
-                                    ("Marchyear", -4.742029368705289),
+                                     -4.161483865059729),
+                                    ("hourday", -5.260096153727839),
+                                    ("dayhour", -2.5520459526256287),
+                                    ("daymonth", -3.468336684499784),
+                                    ("monthyear", -3.180654612048003),
+                                    ("Mondayon <date>", -5.260096153727839),
+                                    ("intersecthh:mm", -5.260096153727839),
+                                    ("Wednesdaynext <cycle>", -5.260096153727839),
+                                    ("Marchyear", -4.854631045619675),
                                     ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -4.742029368705289),
-                                    ("Mondayintersect", -5.147494476813453),
-                                    ("last <day-of-week> of <time>year", -4.742029368705289),
-                                    ("todayat <time-of-day>", -4.742029368705289),
-                                    ("Thursday<time> timezone", -3.894731508318085),
-                                    ("dayday", -3.132591456271188),
-                                    ("dd/mmat <time-of-day>", -4.231203744939298),
-                                    ("the <day-of-month> (ordinal)February", -4.742029368705289),
-                                    ("intersect by \",\"hh:mm", -4.231203744939298),
-                                    ("Mondaythe <day-of-month> (non ordinal)", -5.147494476813453),
+                                     -4.854631045619675),
+                                    ("Mondayintersect", -5.260096153727839),
+                                    ("last <day-of-week> of <time>year", -4.854631045619675),
+                                    ("todayat <time-of-day>", -4.343805421853684),
+                                    ("Thursday<time> timezone", -3.8738017926079484),
+                                    ("dayday", -3.180654612048003),
+                                    ("dd/mmat <time-of-day>", -4.007333185232471),
+                                    ("the <day-of-month> (ordinal)February", -4.854631045619675),
+                                    ("intersect by \",\"hh:mm", -4.343805421853684),
+                                    ("Mondaythe <day-of-month> (non ordinal)", -5.260096153727839),
                                     ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.147494476813453),
-                                    ("dayyear", -3.275692299911862),
+                                     -4.854631045619675),
+                                    ("dayyear", -3.5553480614894135),
                                     ("Thursdaybetween <datetime> and <datetime> (interval)",
-                                     -5.147494476813453),
-                                    ("Thursdayat <time-of-day>", -4.231203744939298),
-                                    ("tomorrow<time-of-day> sharp", -4.742029368705289),
+                                     -4.854631045619675),
+                                    ("Thursdayat <time-of-day>", -4.161483865059729),
+                                    ("tomorrow<time-of-day> sharp", -4.566948973167894),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.742029368705289),
+                                     -4.854631045619675),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.231203744939298),
+                                     -4.343805421853684),
                                     ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.742029368705289),
+                                     -4.566948973167894),
                                     ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.742029368705289),
-                                    ("tomorrowuntil <time-of-day>", -4.742029368705289),
+                                     -4.566948973167894),
+                                    ("tomorrowuntil <time-of-day>", -4.566948973167894),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.454347296253507),
-                                    ("the <day-of-month> (ordinal)March", -4.231203744939298),
-                                    ("after <time-of-day>at <time-of-day>", -4.742029368705289),
+                                     -4.343805421853684),
+                                    ("the <day-of-month> (ordinal)March", -4.343805421853684),
+                                    ("after <time-of-day>at <time-of-day>", -4.566948973167894),
                                     ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -4.742029368705289),
-                                    ("Mondaythe <day-of-month> (ordinal)", -5.147494476813453),
-                                    ("tomorrowafter <time-of-day>", -4.742029368705289),
+                                     -4.343805421853684),
+                                    ("Mondaythe <day-of-month> (ordinal)", -5.260096153727839),
+                                    ("tomorrowafter <time-of-day>", -4.566948973167894),
                                     ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.231203744939298),
+                                     -4.343805421853684),
                                     ("Sunday<day-of-month> (non ordinal) <named-month>",
-                                     -5.147494476813453),
-                                    ("dayminute", -2.5825451193519164),
-                                    ("Tuesdaythis <time>", -4.454347296253507),
+                                     -5.260096153727839),
+                                    ("dayminute", -2.4268828096716226),
+                                    ("Tuesdaythis <time>", -4.566948973167894),
                                     ("from <datetime> - <datetime> (interval)on <date>",
-                                     -4.454347296253507),
-                                    ("<ordinal> <cycle> of <time>year", -4.742029368705289),
-                                    ("minuteday", -2.5448047913690695),
+                                     -4.566948973167894),
+                                    ("<ordinal> <cycle> of <time>year", -4.854631045619675),
+                                    ("minuteday", -2.519256129802638),
                                     ("absorption of , after named dayintersect",
-                                     -5.147494476813453),
-                                    ("Octoberyear", -3.5380565643793527),
-                                    ("yearhh:mm", -5.147494476813453),
+                                     -5.260096153727839),
+                                    ("Octoberyear", -3.6506582412937383),
+                                    ("yearhh:mm", -5.260096153727839),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -4.742029368705289),
-                                    ("dd/mmyear", -4.742029368705289),
-                                    ("Septemberyear", -4.231203744939298),
-                                    ("at <time-of-day>on <date>", -5.147494476813453),
+                                     -4.854631045619675),
+                                    ("Septemberyear", -4.343805421853684),
+                                    ("at <time-of-day>on <date>", -5.260096153727839),
                                     ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -5.147494476813453),
+                                     -5.260096153727839),
                                     ("between <datetime> and <datetime> (interval)on <date>",
-                                     -5.147494476813453),
-                                    ("dayweek", -4.048882188145344),
-                                    ("weekyear", -4.231203744939298),
-                                    ("hh:mmtomorrow", -4.454347296253507),
-                                    ("Wednesdaythis <time>", -4.231203744939298),
-                                    ("tomorrowat <time-of-day>", -3.894731508318085),
-                                    ("at <time-of-day>tomorrow", -4.742029368705289),
-                                    ("intersectFebruary", -5.147494476813453),
-                                    ("last <cycle> of <time>year", -4.231203744939298),
-                                    ("Mondaythis <time>", -5.147494476813453),
+                                     -5.260096153727839),
+                                    ("dayweek", -4.161483865059729),
+                                    ("weekyear", -4.343805421853684),
+                                    ("hh:mmtomorrow", -4.343805421853684),
+                                    ("this <cycle>at <time-of-day>", -4.854631045619675),
+                                    ("Wednesdaythis <time>", -4.343805421853684),
+                                    ("tomorrowat <time-of-day>", -3.6506582412937383),
+                                    ("at <time-of-day>tomorrow", -4.566948973167894),
+                                    ("intersectFebruary", -5.260096153727839),
+                                    ("last <cycle> of <time>year", -4.343805421853684),
+                                    ("Mondaythis <time>", -5.260096153727839),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.742029368705289),
-                                    ("yearminute", -5.147494476813453)],
-                               n = 132},
+                                     -4.854631045619675),
+                                    ("yearminute", -5.260096153727839)],
+                               n = 154},
                    koData =
-                     ClassData{prior = -1.032550537990017, unseen = -5.424950017481403,
+                     ClassData{prior = -1.1831696766961728, unseen = -5.365976015021851,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -3.1179499062782403),
-                                    ("daymonth", -2.1624384612508036),
-                                    ("monthday", -3.8110970868381857),
-                                    ("monthyear", -3.8110970868381857),
-                                    ("Marchyear", -4.034240638152395),
+                                   [("dayhour", -2.7963428082478883),
+                                    ("daymonth", -2.2702497123511094),
+                                    ("monthyear", -3.751854253275325),
+                                    ("Marchyear", -3.9749978045895347),
                                     ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -3.4746248502169728),
-                                    ("Sundaythis <time>", -3.8110970868381857),
-                                    ("absorption of , after named dayJuly", -4.321922710604176),
-                                    ("dd/mmat <time-of-day>", -3.8110970868381857),
-                                    ("hourhour", -3.4746248502169728),
-                                    ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.727387818712341),
-                                    ("dayyear", -3.34109345759245),
-                                    ("Thursdaybetween <datetime> and <datetime> (interval)",
-                                     -4.727387818712341),
-                                    ("Thursdayat <time-of-day>", -3.2233104219360666),
-                                    ("Thursdayhh:mm", -4.321922710604176),
-                                    ("WednesdayFebruary", -4.727387818712341),
+                                     -3.4153820166541116),
+                                    ("Sundaythis <time>", -3.751854253275325),
+                                    ("absorption of , after named dayJuly", -4.2626798770413155),
+                                    ("dd/mmat <time-of-day>", -3.4153820166541116),
+                                    ("hourhour", -3.0587070727153796),
+                                    ("dayyear", -3.2818506240295893),
+                                    ("Thursdayat <time-of-day>", -2.9633968929110543),
+                                    ("Thursdayhh:mm", -4.2626798770413155),
+                                    ("WednesdayFebruary", -4.66814498514948),
                                     ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.321922710604176),
+                                     -4.66814498514948),
                                     ("in|during the <part-of-day>until <time-of-day>",
-                                     -4.321922710604176),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.727387818712341),
-                                    ("Aprilyear", -4.727387818712341),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.8110970868381857),
-                                    ("until <time-of-day>on <date>", -4.727387818712341),
-                                    ("August<day-of-month> (non ordinal) <named-month>",
-                                     -3.8110970868381857),
-                                    ("dayminute", -3.0226397264739155),
-                                    ("Tuesdaythis <time>", -3.8110970868381857),
-                                    ("minuteday", -3.2233104219360666),
-                                    ("hh:mmon <date>", -3.34109345759245),
-                                    ("Wednesdaythis <time>", -3.4746248502169728),
-                                    ("absorption of , after named dayFebruary", -4.321922710604176),
-                                    ("this <part-of-day>until <time-of-day>", -4.321922710604176),
-                                    ("tomorrownoon", -4.727387818712341),
-                                    ("this <time>until <time-of-day>", -4.321922710604176),
-                                    ("Mondaythis <time>", -4.321922710604176)],
-                               n = 73}}),
+                                     -3.9749978045895347),
+                                    ("Aprilyear", -4.66814498514948),
+                                    ("until <time-of-day>on <date>", -4.66814498514948),
+                                    ("dayminute", -3.2818506240295893),
+                                    ("Tuesdaythis <time>", -3.751854253275325),
+                                    ("minuteday", -3.164067588373206),
+                                    ("hh:mmon <date>", -3.2818506240295893),
+                                    ("Wednesdaythis <time>", -3.4153820166541116),
+                                    ("absorption of , after named dayFebruary",
+                                     -4.2626798770413155),
+                                    ("this <part-of-day>until <time-of-day>", -3.9749978045895347),
+                                    ("tomorrownoon", -4.66814498514948),
+                                    ("this <time>until <time-of-day>", -3.9749978045895347),
+                                    ("Mondaythis <time>", -4.2626798770413155)],
+                               n = 68}}),
        ("<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",
+                                    ("ordinals (first..19st)week (grain)intersect",
                                      -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)intersect",
+                                    ("ordinals (first..19st)week (grain)October",
                                      -1.7346010553881064),
                                     ("weekmonth", -1.2237754316221157),
-                                    ("ordinals (first..31st)day (grain)October",
+                                    ("ordinals (first..19st)day (grain)October",
                                      -1.7346010553881064)],
                                n = 6},
                    koData =
@@ -454,34 +447,35 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.1780538303479458,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.4350845252893227),
+                                   [("hh:mmtime-of-day (latent)", -2.4423470353692043),
+                                    ("minuteminute", -1.5260563034950494),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.3513752571634776),
-                                    ("hh:mmhh:mm", -1.4350845252893227),
-                                    ("hourhour", -2.3513752571634776)],
-                               n = 5},
+                                     -2.4423470353692043),
+                                    ("hh:mmhh:mm", -1.5260563034950494),
+                                    ("hourhour", -2.4423470353692043),
+                                    ("minutehour", -2.4423470353692043)],
+                               n = 6},
                    koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
+                     ClassData{prior = -0.5596157879354228, unseen = -3.332204510175204,
                                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}}),
+                                   [("yearhour", -2.6026896854443837),
+                                    ("hh:mmtime-of-day (latent)", -1.9095425048844386),
+                                    ("minuteminute", -1.9095425048844386),
+                                    ("yearyear", -2.6026896854443837),
+                                    ("year (latent)year (latent)", -2.6026896854443837),
+                                    ("minutehour", -1.9095425048844386),
+                                    ("hh:mmintersect", -1.9095425048844386),
+                                    ("year (latent)time-of-day (latent)", -2.6026896854443837)],
+                               n = 8}}),
        ("Saturday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                     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}}),
@@ -510,23 +504,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6061358035703156,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
+                                   [("hh:mmtime-of-day (latent)", -2.3025850929940455),
+                                    ("minuteminute", -1.2039728043259361),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.2039728043259361),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -2.3025850929940455)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                     ClassData{prior = -1.0116009116784799, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0296194171811581),
+                                    ("minutehour", -1.0296194171811581)],
+                               n = 4}}),
        ("yyyy-mm-dd",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -539,12 +535,12 @@
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.4462871026284195),
-                                    ("integer (0..19)", -1.0216512475319814)],
-                               n = 23}}),
+                                   [("integer (numeric)", -0.42488319396526597),
+                                    ("integer (0..19)", -1.0608719606852628)],
+                               n = 24}}),
        ("Monday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -571,7 +567,7 @@
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)quarter (grain)year",
+                                   [("ordinals (first..19st)quarter (grain)year",
                                      -1.252762968495368),
                                     ("quarteryear", -0.8472978603872037),
                                     ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
@@ -629,9 +625,9 @@
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.8938178760220964),
-                                    ("ordinals (first..31st)TuesdayOctober", -1.9924301646902063),
-                                    ("ordinals (first..31st)Tuesdayintersect", -1.9924301646902063),
-                                    ("ordinals (first..31st)Wednesdayintersect",
+                                    ("ordinals (first..19st)Tuesdayintersect", -1.9924301646902063),
+                                    ("ordinals (first..19st)TuesdayOctober", -1.9924301646902063),
+                                    ("ordinals (first..19st)Wednesdayintersect",
                                      -1.4816045409242156)],
                                n = 8},
                    koData =
@@ -640,8 +636,8 @@
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.9444616088408514),
-                                    ("ordinals (first..31st)WednesdayOctober", -1.2809338454620642),
-                                    ("ordinals (first..31st)TuesdaySeptember", -1.791759469228055)],
+                                    ("ordinals (first..19st)WednesdayOctober", -1.2809338454620642),
+                                    ("ordinals (first..19st)TuesdaySeptember", -1.791759469228055)],
                                n = 6}}),
        ("the <day-of-month> (non ordinal)",
         Classifier{okData =
@@ -651,15 +647,6 @@
                    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,
@@ -685,7 +672,7 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
        ("this <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
+                     ClassData{prior = -2.1972245773362196,
                                unseen = -2.0794415416798357,
                                likelihoods =
                                  HashMap.fromList
@@ -693,13 +680,12 @@
                                     ("morning", -1.252762968495368)],
                                n = 2},
                    koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.332204510175204,
+                     ClassData{prior = -0.11778303565638351, unseen = -3.58351893845611,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hour", -0.7308875085427924),
-                                    ("morning", -0.7308875085427924)],
-                               n = 12}}),
+                                   [("hour", -0.7221347174331976),
+                                    ("morning", -0.7221347174331976)],
+                               n = 16}}),
        ("christmas eve",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -713,7 +699,7 @@
                                unseen = -3.258096538021482,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)March", -1.8325814637483102),
+                                   [("ordinals (first..19st)March", -1.8325814637483102),
                                     ("ordinal (digits)February", -1.8325814637483102),
                                     ("month", -0.8209805520698302),
                                     ("ordinal (digits)March", -1.6094379124341003)],
@@ -723,7 +709,7 @@
                                unseen = -2.0794415416798357,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)April", -1.252762968495368),
+                                   [("ordinals (first..19st)April", -1.252762968495368),
                                     ("month", -1.252762968495368)],
                                n = 1}}),
        ("numbers prefix with -, negative or minus",
@@ -731,9 +717,9 @@
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 28}}),
+                               n = 29}}),
        ("Friday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -743,7 +729,7 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("in|during the <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
+                     ClassData{prior = -2.1972245773362196,
                                unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
@@ -752,13 +738,12 @@
                                     ("evening", -1.3862943611198906)],
                                n = 2},
                    koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.367295829986474,
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.6109179126442243,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hour", -0.7672551527136672),
-                                    ("morning", -0.7672551527136672)],
-                               n = 12}}),
+                                   [("hour", -0.750305594399894), ("morning", -0.750305594399894)],
+                               n = 16}}),
        ("new year's eve",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -768,8 +753,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("tomorrow",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                     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}}),
@@ -809,7 +794,7 @@
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)", -1.2039728043259361),
+                                   [("ordinals (first..19st)", -1.2039728043259361),
                                     ("ordinal (digits)", -0.35667494393873245)],
                                n = 8},
                    koData =
@@ -820,8 +805,8 @@
                      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}}),
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
        ("Sunday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -858,20 +843,20 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("this <cycle>",
         Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.2188758248682006,
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.367295829986474,
                                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},
+                                   [("week", -1.7227665977411035),
+                                    ("year (grain)", -2.2335922215070942),
+                                    ("week (grain)", -1.7227665977411035),
+                                    ("day", -1.9459101490553135), ("quarter", -2.639057329615259),
+                                    ("year", -2.2335922215070942),
+                                    ("quarter (grain)", -2.639057329615259),
+                                    ("day (grain)", -1.9459101490553135)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -2.1972245773362196,
+                     ClassData{prior = -2.3978952727983707,
                                unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
@@ -885,17 +870,26 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..19st)",
+        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}}),
        ("about <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3978952727983707,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 3},
+                                   [("time-of-day (latent)", -0.8754687373538999),
+                                    ("hour", -0.8754687373538999)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -0.5596157879354228,
+                     ClassData{prior = -0.6931471805599453,
                                unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
@@ -907,27 +901,27 @@
                                n = 4}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.8903152454708944,
-                               unseen = -3.7376696182833684,
+                     ClassData{prior = -0.7105389232718146, unseen = -4.0943445622221,
                                likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -2.469261259037152e-2)],
-                               n = 39},
+                                 HashMap.fromList [("integer (numeric)", -1.7094433359300068e-2)],
+                               n = 57},
                    koData =
-                     ClassData{prior = -0.5285252008653917, unseen = -4.07753744390572,
+                     ClassData{prior = -0.6760527472006452, unseen = -4.127134385045092,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.27625337662815824),
-                                    ("integer (0..19)", -1.4213856809311607)],
-                               n = 56}}),
+                                   [("integer (numeric)", -0.2607262624632527),
+                                    ("integer (0..19)", -1.4718165345580525)],
+                               n = 59}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
+                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 26},
+                               n = 24},
                    koData =
-                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.0794415416798357,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
+                               n = 6}}),
        ("last <day-of-week> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.833213344056216,
@@ -1036,50 +1030,52 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \",\"",
         Classifier{okData =
-                     ClassData{prior = -0.13353139262452263, unseen = -4.48863636973214,
+                     ClassData{prior = -9.763846956391606e-2,
+                               unseen = -4.709530201312334,
                                likelihoods =
                                  HashMap.fromList
                                    [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -3.784189633918261),
+                                     -4.007333185232471),
                                     ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -3.784189633918261),
+                                     -4.007333185232471),
                                     ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.378724525810097),
-                                    ("at <time-of-day>Saturday", -3.784189633918261),
-                                    ("intersect by \",\"year", -3.784189633918261),
-                                    ("hh:mmintersect by \",\"", -3.784189633918261),
-                                    ("dayday", -2.174751721484161), ("dayyear", -2.867898902044106),
+                                     -3.6018680771243066),
+                                    ("at <time-of-day>Saturday", -3.6018680771243066),
+                                    ("intersect by \",\"year", -4.007333185232471),
+                                    ("hh:mmintersect by \",\"", -3.6018680771243066),
+                                    ("dayday", -2.3025850929940455),
+                                    ("dayyear", -3.0910424533583156),
                                     ("Saturday<day-of-month> (non ordinal) <named-month>",
-                                     -3.784189633918261),
+                                     -3.6018680771243066),
                                     ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -3.784189633918261),
+                                     -4.007333185232471),
                                     ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -3.378724525810097),
-                                    ("Fridayintersect", -3.784189633918261),
-                                    ("hh:mmintersect", -3.784189633918261),
-                                    ("intersect by \",\"intersect", -3.784189633918261),
-                                    ("hh:mmSaturday", -3.784189633918261),
-                                    ("at <time-of-day>intersect", -3.784189633918261),
+                                     -3.0910424533583156),
+                                    ("Fridayintersect", -4.007333185232471),
+                                    ("hh:mmintersect", -3.6018680771243066),
+                                    ("intersect by \",\"intersect", -4.007333185232471),
+                                    ("hh:mmSaturday", -3.6018680771243066),
+                                    ("at <time-of-day>intersect", -3.6018680771243066),
                                     ("Sunday<day-of-month> (non ordinal) <named-month>",
-                                     -3.784189633918261),
-                                    ("dayminute", -2.6855773452501515),
-                                    ("intersectyear", -3.784189633918261),
-                                    ("minuteday", -2.0794415416798357),
-                                    ("hh:mmabsorption of , after named day", -3.784189633918261),
-                                    ("at <time-of-day>intersect by \",\"", -3.784189633918261),
+                                     -4.007333185232471),
+                                    ("dayminute", -2.908720896564361),
+                                    ("intersectyear", -4.007333185232471),
+                                    ("minuteday", -1.6559579280689931),
+                                    ("hh:mmabsorption of , after named day", -3.6018680771243066),
+                                    ("at <time-of-day>intersect by \",\"", -3.6018680771243066),
                                     ("at <time-of-day>absorption of , after named day",
-                                     -3.784189633918261),
-                                    ("intersectintersect", -3.784189633918261),
-                                    ("Fridayintersect by \",\"", -3.378724525810097),
+                                     -3.6018680771243066),
+                                    ("intersectintersect", -4.007333185232471),
+                                    ("Fridayintersect by \",\"", -3.6018680771243066),
                                     ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -3.784189633918261),
+                                     -4.007333185232471),
                                     ("Monday<day-of-month> (non ordinal) <named-month>",
-                                     -3.784189633918261),
+                                     -4.007333185232471),
                                     ("<named-month> <day-of-month> (non ordinal)year",
-                                     -3.378724525810097)],
-                               n = 28},
+                                     -3.6018680771243066)],
+                               n = 39},
                    koData =
-                     ClassData{prior = -2.0794415416798357, unseen = -3.713572066704308,
+                     ClassData{prior = -2.374905754573672, unseen = -3.713572066704308,
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -2.0794415416798357),
@@ -1089,11 +1085,11 @@
                                n = 4}}),
        ("hh:mm",
         Classifier{okData =
-                     ClassData{prior = -1.7094433359300068e-2,
-                               unseen = -4.0943445622221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
+                     ClassData{prior = -1.526747213078842e-2,
+                               unseen = -4.204692619390966,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 65},
                    koData =
-                     ClassData{prior = -4.07753744390572, unseen = -1.0986122886681098,
+                     ClassData{prior = -4.189654742026425, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("quarter after|past <integer> (hour-of-day)",
         Classifier{okData =
@@ -1115,13 +1111,13 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> sharp",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.2992829841302609),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
+                                   [("at <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}}),
@@ -1213,16 +1209,14 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("until <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.995732273553991,
+                     ClassData{prior = -0.1823215567939546, unseen = -3.258096538021482,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -0.8649974374866046),
-                                    ("hour", -0.8649974374866046)],
-                               n = 7},
+                                   [("at <time-of-day>", -0.8209805520698302),
+                                    ("hour", -0.8209805520698302)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -2.3025850929940455,
+                     ClassData{prior = -1.791759469228055, unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
                                    [("intersect", -1.5040773967762742),
@@ -1401,23 +1395,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.7672551527136672,
-                               unseen = -3.4339872044851463,
+                     ClassData{prior = -0.6241543090729939,
+                               unseen = -3.5553480614894135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -0.7621400520468967),
-                                    ("hh:mmhh:mm", -0.7621400520468967)],
-                               n = 13},
+                                   [("hh:mmtime-of-day (latent)", -2.4277482359480516),
+                                    ("minuteminute", -0.8873031950009028),
+                                    ("hh:mmhh:mm", -0.8873031950009028),
+                                    ("minutehour", -2.4277482359480516)],
+                               n = 15},
                    koData =
-                     ClassData{prior = -0.6241543090729939,
-                               unseen = -3.5553480614894135,
+                     ClassData{prior = -0.7672551527136672,
+                               unseen = -3.4339872044851463,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.8183103235139514),
-                                    ("minuteminute", -2.833213344056216),
-                                    ("hh:mmhh:mm", -2.833213344056216),
-                                    ("minutehour", -0.8183103235139514)],
-                               n = 15}}),
+                                   [("hh:mmtime-of-day (latent)", -0.8362480242006186),
+                                    ("minuteminute", -2.70805020110221),
+                                    ("hh:mmhh:mm", -2.70805020110221),
+                                    ("minutehour", -0.8362480242006186)],
+                               n = 13}}),
        ("last n <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -4.04305126783455,
@@ -1447,39 +1443,38 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month> (non ordinal)",
         Classifier{okData =
-                     ClassData{prior = -0.48550781578170077,
-                               unseen = -3.0910424533583156,
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Aprilinteger (numeric)", -2.3513752571634776),
-                                    ("month", -0.8472978603872037),
-                                    ("Februaryinteger (numeric)", -1.4350845252893227),
-                                    ("Julyinteger (numeric)", -1.6582280766035324)],
+                                   [("Aprilinteger (numeric)", -2.3025850929940455),
+                                    ("month", -0.7985076962177716),
+                                    ("Februaryinteger (numeric)", -1.3862943611198906),
+                                    ("Julyinteger (numeric)", -1.6094379124341003)],
                                n = 8},
                    koData =
-                     ClassData{prior = -0.9555114450274363, unseen = -2.772588722239781,
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -1.9459101490553135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Augustinteger (numeric)", -1.0986122886681098),
-                                    ("Aprilinteger (numeric)", -2.0149030205422647),
-                                    ("month", -0.916290731874155)],
-                               n = 5}}),
+                                   [("Aprilinteger (numeric)", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.784189633918261,
+                     ClassData{prior = -0.1466034741918754, unseen = -3.828641396489095,
                                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},
+                                   [("integer (numeric)September", -2.70805020110221),
+                                    ("integer (numeric)April", -3.1135153092103742),
+                                    ("integer (numeric)August", -1.5040773967762742),
+                                    ("integer (numeric)February", -2.4203681286504293),
+                                    ("month", -0.8109302162163288),
+                                    ("integer (numeric)July", -2.70805020110221),
+                                    ("integer (numeric)March", -2.70805020110221)],
+                               n = 19},
                    koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
+                     ClassData{prior = -1.9924301646902063, unseen = -2.639057329615259,
                                likelihoods =
                                  HashMap.fromList
                                    [("month", -1.1786549963416462),
@@ -1550,8 +1545,8 @@
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)April", -1.6094379124341003),
-                                    ("ordinals (first..31st)March", -1.6094379124341003),
+                                   [("ordinals (first..19st)April", -1.6094379124341003),
+                                    ("ordinals (first..19st)March", -1.6094379124341003),
                                     ("month", -0.916290731874155),
                                     ("ordinal (digits)March", -1.6094379124341003)],
                                n = 3},
@@ -1560,13 +1555,13 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
+                     ClassData{prior = -2.1972245773362196,
                                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}}),
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16}}),
        ("week-end",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -1576,33 +1571,33 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("after <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.7537718023763802, unseen = -3.332204510175204,
+                     ClassData{prior = -0.6931471805599453, unseen = -3.58351893845611,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.6863989535702288),
-                                    ("intersect", -2.1972245773362196),
-                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
-                                    ("hour", -1.349926716949016)],
-                               n = 8},
+                                   [("at <time-of-day>", -1.6094379124341003),
+                                    ("intersect", -2.169053700369523),
+                                    ("tomorrow", -2.169053700369523), ("day", -2.169053700369523),
+                                    ("hour", -1.252762968495368)],
+                               n = 12},
                    koData =
-                     ClassData{prior = -0.6359887667199967,
-                               unseen = -3.4011973816621555,
+                     ClassData{prior = -0.6931471805599453, unseen = -3.58351893845611,
                                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}}),
+                                   [("this <part-of-day>", -2.169053700369523),
+                                    ("christmas eve", -2.456735772821304),
+                                    ("in|during the <part-of-day>", -2.169053700369523),
+                                    ("day", -2.456735772821304), ("hh:mm", -2.8622008809294686),
+                                    ("hour", -1.252762968495368), ("minute", -2.8622008809294686),
+                                    ("this <time>", -2.169053700369523)],
+                               n = 12}}),
        ("day (grain)",
         Classifier{okData =
-                     ClassData{prior = -4.8790164169432056e-2,
-                               unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                     ClassData{prior = -4.445176257083381e-2,
+                               unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
                    koData =
-                     ClassData{prior = -3.044522437723423, unseen = -1.0986122886681098,
+                     ClassData{prior = -3.1354942159291497,
+                               unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("<month> dd-dd (interval)",
         Classifier{okData =
@@ -1627,7 +1622,7 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = -1.3217558399823195, unseen = -3.871201010907891,
+                     ClassData{prior = -1.3862943611198906, unseen = -3.871201010907891,
                                likelihoods =
                                  HashMap.fromList
                                    [("week", -2.2407096892759584), ("October", -2.751535313041949),
@@ -1642,18 +1637,17 @@
                                     ("week-end", -2.751535313041949)],
                                n = 16},
                    koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -4.6443908991413725,
+                     ClassData{prior = -0.2876820724517809, unseen = -4.718498871295094,
                                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}}),
+                                   [("September", -3.100092288878234),
+                                    ("October", -2.3116349285139637),
+                                    ("intersect", -2.1445808438507976),
+                                    ("time-of-day (latent)", -3.6109179126442243),
+                                    ("March", -3.100092288878234), ("hour", -1.7650912221458936),
+                                    ("month", -1.2755429968271879),
+                                    ("morning", -1.8763168572561182)],
+                               n = 48}}),
        ("within <duration>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
diff --git a/Duckling/Ranking/Classifiers/DE_XX.hs b/Duckling/Ranking/Classifiers/DE_XX.hs
--- a/Duckling/Ranking/Classifiers/DE_XX.hs
+++ b/Duckling/Ranking/Classifiers/DE_XX.hs
@@ -21,1954 +21,2752 @@
 classifiers :: Classifiers
 classifiers
   = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.6094379124341003),
-                                    ("hh:mm", -1.2039728043259361), ("hour", -1.6094379124341003),
-                                    ("minute", -1.2039728043259361)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.921320080279157, unseen = -4.795790545596741,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 119},
-                   koData =
-                     ClassData{prior = -0.507486722500476, unseen = -5.204006687076795,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 180}}),
-       ("exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               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}}),
-       ("<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.12044615307586722,
-                               unseen = -5.700443573390687,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clockmorning", -4.598481197837295),
-                                    ("until <time-of-day>afternoon", -5.003946305945459),
-                                    ("dayhour", -3.299198213707034),
-                                    ("todayevening", -4.598481197837295),
-                                    ("half <integer> (german style hour-of-day)afternoon",
-                                     -5.003946305945459),
-                                    ("<time-of-day>  o'clockafter lunch", -4.310799125385514),
-                                    ("intersect by ','evening", -3.499868909169185),
-                                    ("<time-of-day>  o'clockon <date>", -3.9053340172773496),
-                                    ("intersectevening", -1.935893370811842),
-                                    ("time-of-day (latent)on <date>", -4.310799125385514),
-                                    ("about <time-of-day>on <date>", -4.598481197837295),
-                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
-                                     -4.598481197837295),
-                                    ("hourhour", -1.2084571167732645),
-                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
-                                     -3.9053340172773496),
-                                    ("Donnerstagmorning", -5.003946305945459),
-                                    ("<time-of-day>  o'clockafternoon", -4.310799125385514),
-                                    ("half <integer> (german style hour-of-day)after lunch",
-                                     -5.003946305945459),
-                                    ("until <time-of-day>morning", -5.003946305945459),
-                                    ("minutehour", -2.3648889763302003),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -4.087655574071304),
-                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
-                                     -5.003946305945459),
-                                    ("tomorrowevening", -5.003946305945459),
-                                    ("time-of-day (latent)morning", -5.003946305945459),
-                                    ("hh:mmmorning", -5.003946305945459),
-                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
-                                     -4.598481197837295),
-                                    ("until <time-of-day>on <date>", -5.003946305945459),
-                                    ("<day-of-month>(ordinal) <named-month>morning",
-                                     -5.003946305945459),
-                                    ("<time-of-day>  o'clockevening", -5.003946305945459),
-                                    ("hh:mmon <date>", -4.087655574071304),
-                                    ("<hour-of-day> <integer> (as relative minutes)afternoon",
-                                     -5.003946305945459),
-                                    ("tomorrowlunch", -4.598481197837295),
-                                    ("until <time-of-day>after lunch", -5.003946305945459),
-                                    ("Montagmorning", -5.003946305945459),
-                                    ("at <time-of-day>on <date>", -4.087655574071304),
-                                    ("yesterdayevening", -5.003946305945459),
-                                    ("intersectmorning", -5.003946305945459),
-                                    ("hh:mmin|during the <part-of-day>", -4.087655574071304),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -4.310799125385514),
-                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
-                                     -4.598481197837295),
-                                    ("about <time-of-day>in|during the <part-of-day>",
-                                     -4.598481197837295),
-                                    ("half <integer> (german style hour-of-day)on <date>",
-                                     -4.598481197837295),
-                                    ("at <time-of-day>morning", -5.003946305945459),
-                                    ("until <time-of-day>in|during the <part-of-day>",
-                                     -5.003946305945459)],
-                               n = 125},
-                   koData =
-                     ClassData{prior = -2.176171168138387, 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),
-                                    ("Februarmorning", -3.6888794541139363),
-                                    ("<time-of-day>  o'clockafternoon", -3.6888794541139363),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -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.137201121513485, unseen = -4.3694478524670215,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -2.0541237336955462),
-                                    ("half <integer> (german style hour-of-day)",
-                                     -3.6635616461296463),
-                                    ("about <time-of-day>", -2.7472709142554916),
-                                    ("time-of-day (latent)", -1.717651497074333),
-                                    ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.6635616461296463),
-                                    ("hh:mm", -2.7472709142554916),
-                                    ("quarter after|past <integer> (hour-of-day)",
-                                     -3.6635616461296463),
-                                    ("hour", -1.0608719606852628), ("minute", -2.159484249353372),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.6635616461296463)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -2.0541237336955462, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2039728043259361),
-                                    ("hour", -1.2039728043259361)],
-                               n = 5}}),
-       ("Neujahr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = -7.410797215372185e-2,
-                               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}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("between <datetime> and <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               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}}),
-       ("Valentinstag",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               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.1745489670397881, unseen = -6.88653164253051,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Samstag<time-of-day>  o'clock", -6.192362489474872),
-                                    ("hourday", -4.939599520979504),
-                                    ("<datetime> - <datetime> (interval)year", -4.939599520979504),
-                                    ("dayhour", -2.5288008433452256),
-                                    ("daymonth", -3.147840051751449),
-                                    ("<day-of-month>(ordinal) <named-month> year<time-of-day>  o'clock",
-                                     -6.192362489474872),
-                                    ("monthyear", -4.487614397236447),
-                                    ("yearhour", -6.192362489474872),
-                                    ("Juliintersect", -6.192362489474872),
-                                    ("intersect<time-of-day>  o'clock", -4.052296325978602),
-                                    ("after lunchat <time-of-day>", -6.192362489474872),
-                                    ("absorption of , after named daymm/dd/yyyy",
-                                     -6.192362489474872),
-                                    ("intersectJuli", -5.499215308914927),
-                                    ("<day-of-month> (ordinal)Dienstag", -6.192362489474872),
-                                    ("intersect by 'of', 'from', 'syear", -5.786897381366708),
-                                    ("<day-of-month> (ordinal)September", -5.786897381366708),
-                                    ("intersect<time> <part-of-day>", -4.112920947795036),
-                                    ("<time-of-day>  o'clockafter lunch", -5.499215308914927),
-                                    ("<day-of-month> (ordinal)Mittwoch", -6.192362489474872),
-                                    ("Montagthis <cycle>", -6.192362489474872),
-                                    ("<time> <part-of-day><time-of-day>  o'clock",
-                                     -6.192362489474872),
-                                    ("Oktoberyear", -5.093750200806762),
-                                    ("today<time-of-day>  o'clock", -6.192362489474872),
-                                    ("<time-of-day>  o'clockon <date>", -5.786897381366708),
-                                    ("intersect by ','year", -5.093750200806762),
-                                    ("on <date><time-of-day>  o'clock", -6.192362489474872),
-                                    ("exactly <time-of-day>tomorrow", -5.786897381366708),
-                                    ("mm/dd<time-of-day>  o'clock", -6.192362489474872),
-                                    ("monthhour", -5.786897381366708),
-                                    ("on <date>between <datetime> and <datetime> (interval)",
-                                     -6.192362489474872),
-                                    ("last <day-of-week> of <time>year", -6.192362489474872),
-                                    ("hourmonth", -5.786897381366708),
-                                    ("todayat <time-of-day>", -5.499215308914927),
-                                    ("mm/ddabout <time-of-day>", -5.786897381366708),
-                                    ("Donnerstagfrom <datetime> - <datetime> (interval)",
-                                     -5.786897381366708),
-                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -6.192362489474872),
-                                    ("on <date>at <time-of-day>", -5.786897381366708),
-                                    ("dayday", -3.0143086591269266),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.786897381366708),
-                                    ("about <time-of-day>on <date>", -6.192362489474872),
-                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
-                                     -5.786897381366708),
-                                    ("<day-of-month> (ordinal)intersect", -5.093750200806762),
-                                    ("hourhour", -3.6666338451666167),
-                                    ("hh:mmintersect by ','", -4.939599520979504),
-                                    ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.499215308914927),
-                                    ("Dienstagthis <cycle>", -6.192362489474872),
-                                    ("<part-of-day> of <time>Februar", -5.786897381366708),
-                                    ("dayyear", -3.274591757390593),
-                                    ("Mittwochthis <cycle>", -6.192362489474872),
-                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
-                                     -5.093750200806762),
-                                    ("tomorrow<time-of-day>  o'clock", -6.192362489474872),
-                                    ("<time-of-day>  o'clocktomorrow", -5.499215308914927),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.786897381366708),
-                                    ("half <integer> (german style hour-of-day)after lunch",
-                                     -6.192362489474872),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.939599520979504),
-                                    ("hourminute", -5.499215308914927),
-                                    ("the <day-of-month> (ordinal)Juli", -6.192362489474872),
-                                    ("on <date><day-of-month>(ordinal) <named-month>",
-                                     -5.786897381366708),
-                                    ("minutemonth", -3.6666338451666167),
-                                    ("minutehour", -3.941070690868377),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.276071757600717),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
-                                     -5.786897381366708),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -5.093750200806762),
-                                    ("<day-of-month>(ordinal) <named-month> year<time> <part-of-day>",
-                                     -6.192362489474872),
-                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
-                                     -6.192362489474872),
-                                    ("Donnerstag<time> timezone", -5.786897381366708),
-                                    ("Samstagat <time-of-day>", -5.786897381366708),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.939599520979504),
-                                    ("this <part-of-day><time-of-day>  o'clock",
-                                     -6.192362489474872),
-                                    ("<day-of-month>(ordinal) <named-month>intersect",
-                                     -6.192362489474872),
-                                    ("hh:mmintersect", -3.7500154541056676),
-                                    ("Donnerstaghh:mm", -6.192362489474872),
-                                    ("Weihnachtenyear", -6.192362489474872),
-                                    ("<day-of-month> (ordinal)Juli", -5.499215308914927),
-                                    ("intersect by ','intersect", -4.939599520979504),
-                                    ("intersect by 'of', 'from', 'sJuli", -6.192362489474872),
-                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
-                                     -5.786897381366708),
-                                    ("from <datetime> - <datetime> (interval)year",
-                                     -5.499215308914927),
-                                    ("at <time-of-day>intersect", -4.400603020246817),
-                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.786897381366708),
-                                    ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
-                                     -6.192362489474872),
-                                    ("absorption of , after named day<day-of-month> (ordinal)",
-                                     -4.939599520979504),
-                                    ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -6.192362489474872),
-                                    ("dayminute", -3.941070690868377),
-                                    ("on <date>from <datetime> - <datetime> (interval)",
-                                     -6.192362489474872),
-                                    ("Mittwochnext <cycle>", -6.192362489474872),
-                                    ("Donnerstagbetween <datetime> and <datetime> (interval)",
-                                     -6.192362489474872),
-                                    ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
-                                     -6.192362489474872),
-                                    ("intersectyear", -4.400603020246817),
-                                    ("on <date>intersect", -5.786897381366708),
-                                    ("on <date><day-of-month> (ordinal)", -5.786897381366708),
-                                    ("intersectSeptember", -3.5533051598596135),
-                                    ("<ordinal> <cycle> of <time>year", -6.192362489474872),
-                                    ("minuteday", -2.3422148877648135),
-                                    ("absorption of , after named dayintersect",
-                                     -3.7944672166765017),
-                                    ("intersect by ','September", -4.8060681283549815),
-                                    ("year<time-of-day>  o'clock", -6.192362489474872),
-                                    ("Juliyear", -5.786897381366708),
-                                    ("at <time-of-day>intersect by ','", -5.499215308914927),
-                                    ("hh:mmabsorption of , after named day", -5.786897381366708),
-                                    ("intersect by ','<time> <part-of-day>", -5.276071757600717),
-                                    ("hh:mmon <date>", -3.7500154541056676),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -6.192362489474872),
-                                    ("until <time-of-day>after lunch", -6.192362489474872),
-                                    ("mm/ddyear", -5.786897381366708),
-                                    ("intersect by ','<time-of-day>  o'clock", -5.276071757600717),
-                                    ("intersect<day-of-month> (ordinal)", -4.939599520979504),
-                                    ("absorption of , after named daymm/dd", -6.192362489474872),
-                                    ("on <date>September", -5.276071757600717),
-                                    ("Septemberyear", -5.786897381366708),
-                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
-                                     -5.499215308914927),
-                                    ("at <time-of-day>on <date>", -4.3205603125732805),
-                                    ("intersectintersect", -4.112920947795036),
-                                    ("<day-of-month> (ordinal)Februar", -5.093750200806762),
-                                    ("dayweek", -5.093750200806762),
-                                    ("intersect by ','Juli", -5.499215308914927),
-                                    ("absorption of , after named daythe <day-of-month> (ordinal)",
-                                     -6.192362489474872),
-                                    ("weekyear", -5.786897381366708),
-                                    ("hh:mmin|during the <part-of-day>", -5.276071757600717),
-                                    ("Marzyear", -6.192362489474872),
-                                    ("tomorrowat <time-of-day>", -5.786897381366708),
-                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
-                                     -6.192362489474872),
-                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
-                                     -6.192362489474872),
-                                    ("Donnerstag<datetime> - <datetime> (interval)",
-                                     -6.192362489474872),
-                                    ("Sonntaglast <cycle>", -6.192362489474872),
-                                    ("at <time-of-day>tomorrow", -6.192362489474872),
-                                    ("about <time-of-day>in|during the <part-of-day>",
-                                     -5.786897381366708),
-                                    ("half <integer> (german style hour-of-day)on <date>",
-                                     -6.192362489474872),
-                                    ("this <part-of-day>at <time-of-day>", -5.786897381366708),
-                                    ("<datetime> - <datetime> (interval)Juli", -5.786897381366708),
-                                    ("after lunch<hour-of-day> <integer> (as relative minutes)",
-                                     -5.786897381366708),
-                                    ("<day-of-month> (ordinal)Marz", -6.192362489474872),
-                                    ("last <cycle> of <time>year", -5.786897381366708),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -6.192362489474872),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -6.192362489474872)],
-                               n = 409},
-                   koData =
-                     ClassData{prior = -1.8315552963929982, unseen = -5.75890177387728,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Juli<day-of-month> (non ordinal) <named-month>",
-                                     -5.062595033026967),
-                                    ("absorption of , after named daythe <day-of-month> (non ordinal)",
-                                     -5.062595033026967),
-                                    ("<datetime> - <datetime> (interval)year", -5.062595033026967),
-                                    ("dayhour", -4.3694478524670215),
-                                    ("<named-month> <day-of-month> (non ordinal)Juli",
-                                     -5.062595033026967),
-                                    ("daymonth", -3.1907928561253756),
-                                    ("monthday", -4.657129924918802),
-                                    ("monthyear", -5.062595033026967),
-                                    ("yearhour", -5.062595033026967),
-                                    ("after lunchat <time-of-day>", -4.657129924918802),
-                                    ("mm/dduntil <time-of-day>", -4.657129924918802),
-                                    ("until <time-of-day>year", -4.657129924918802),
-                                    ("<day-of-month> (ordinal)Dienstag", -4.657129924918802),
-                                    ("absorption of , after named dayFebruar", -3.963982744358857),
-                                    ("on <date>Februar", -5.062595033026967),
-                                    ("intersect by 'of', 'from', 'syear", -4.3694478524670215),
-                                    ("intersect<time> <part-of-day>", -5.062595033026967),
-                                    ("<time-of-day>  o'clockafter lunch", -5.062595033026967),
-                                    ("<day-of-month> (ordinal)Mittwoch", -5.062595033026967),
-                                    ("after lunch<time-of-day>  o'clock", -5.062595033026967),
-                                    ("absorption of , after named dayhh:mm", -5.062595033026967),
-                                    ("<time-of-day>  o'clock<time> <part-of-day>",
-                                     -4.146304301152812),
-                                    ("mm/ddhh:mm", -4.146304301152812),
-                                    ("monthhour", -5.062595033026967),
-                                    ("on <date>between <datetime> and <datetime> (interval)",
-                                     -5.062595033026967),
-                                    ("todayat <time-of-day>", -5.062595033026967),
-                                    ("Donnerstagfrom <datetime> - <datetime> (interval)",
-                                     -4.657129924918802),
-                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -5.062595033026967),
-                                    ("dayday", -3.676300671907076),
-                                    ("hourhour", -3.5585176362506927),
-                                    ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.3694478524670215),
-                                    ("Donnerstagafter <time-of-day>", -5.062595033026967),
-                                    ("dayyear", -2.9831534913471307),
-                                    ("Aprilyear", -5.062595033026967),
-                                    ("Dienstagafter <time-of-day>", -5.062595033026967),
-                                    ("Donnerstaghh:mm", -4.657129924918802),
-                                    ("<day-of-month> (ordinal)Juli", -4.657129924918802),
-                                    ("<day-of-month> (ordinal)hh:mm", -4.146304301152812),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.062595033026967),
-                                    ("August<day-of-month> (non ordinal) <named-month>",
-                                     -5.062595033026967),
-                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -4.657129924918802),
-                                    ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.062595033026967),
-                                    ("dayminute", -2.388446383600438),
-                                    ("on <date>from <datetime> - <datetime> (interval)",
-                                     -5.062595033026967),
-                                    ("Donnerstagbetween <datetime> and <datetime> (interval)",
-                                     -5.062595033026967),
-                                    ("until <time-of-day>Juli", -5.062595033026967),
-                                    ("year<time> <part-of-day>", -5.062595033026967),
-                                    ("mm/ddyear", -3.5585176362506927),
-                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
-                                     -4.657129924918802),
-                                    ("Donnerstag<part-of-day> of <time>", -5.062595033026967),
-                                    ("<day-of-month> (ordinal)April", -5.062595033026967),
-                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
-                                     -5.062595033026967),
-                                    ("after <time-of-day>year", -5.062595033026967),
-                                    ("on <date>after <time-of-day>", -5.062595033026967),
-                                    ("tomorrownoon", -5.062595033026967)],
-                               n = 78}}),
-       ("<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}}),
-       ("Muttertag",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               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}}),
-       ("Silvester",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               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}}),
-       ("Weihnachten",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               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}}),
-       ("Vatertag",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               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}}),
-       ("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.2411620568168881, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)Juli", -1.9459101490553135),
-                                    ("ordinal (digits)September", -2.2335922215070942),
-                                    ("month", -0.8472978603872037),
-                                    ("ordinal (digits)Februar", -1.540445040947149),
-                                    ("ordinals (first..19th)Marz", -2.639057329615259)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.540445040947149, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)Juli", -1.3862943611198906),
-                                    ("ordinal (digits)April", -1.791759469228055),
-                                    ("month", -1.0986122886681098)],
-                               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}}),
-       ("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}}),
-       ("<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 = -6.899287148695143e-2,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.3545456628053103),
-                                    ("time-of-day (latent)", -1.3545456628053103),
-                                    ("hour", -0.7259370033829361)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.3856624808119846,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -9.909090264423089e-2),
-                                    ("integer (0..19)", -2.3608540011180215)],
-                               n = 51},
-                   koData =
-                     ClassData{prior = -1.1394342831883648, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.12260232209233239),
-                                    ("integer (0..19)", -2.159484249353372)],
-                               n = 24}}),
-       ("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}}),
-       ("<duration> after <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>Weihnachten", -1.252762968495368),
-                                    ("a <unit-of-duration>Weihnachten", -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.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   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.6061358035703156,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -0.7884573603642702,
-                               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.13353139262452263,
-                               unseen = -4.969813299576001,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Freitag<day-of-month>(ordinal) <named-month> year",
-                                     -3.8642323415917974),
-                                    ("dayhour", -2.765620052923688),
-                                    ("Freitagintersect", -1.967112356705916),
-                                    ("Samstag<day-of-month>(ordinal) <named-month>",
-                                     -4.269697449699962),
-                                    ("Freitagmm/dd/yyyy", -3.8642323415917974),
-                                    ("Freitagmm/dd", -3.8642323415917974),
-                                    ("dayday", -1.2992829841302609),
-                                    ("Samstagintersect", -4.269697449699962),
-                                    ("dayyear", -4.269697449699962),
-                                    ("Freitag<day-of-month>(ordinal) <named-month>",
-                                     -3.5765502691400166),
-                                    ("Freitagthe <day-of-month> (ordinal)", -4.269697449699962),
-                                    ("on <date><day-of-month>(ordinal) <named-month>",
-                                     -3.8642323415917974),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -3.5765502691400166),
-                                    ("Freitag<day-of-month> (ordinal)", -3.5765502691400166),
-                                    ("on <date>intersect", -3.8642323415917974),
-                                    ("on <date><day-of-month> (ordinal)", -3.8642323415917974),
-                                    ("minuteday", -2.6602595372658615),
-                                    ("Montag<named-month> <day-of-month> (non ordinal)",
-                                     -3.5765502691400166),
-                                    ("Sonntag<named-month> <day-of-month> (non ordinal)",
-                                     -4.269697449699962),
-                                    ("intersect<day-of-month> (ordinal)", -3.5765502691400166),
-                                    ("intersectintersect", -3.5765502691400166),
-                                    ("Samstag<day-of-month> (ordinal)", -4.269697449699962),
-                                    ("Mittwoch<named-month> <day-of-month> (non ordinal)",
-                                     -4.269697449699962),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.269697449699962)],
-                               n = 56},
-                   koData =
-                     ClassData{prior = -2.0794415416798357, unseen = -3.871201010907891,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.0583881324820035),
-                                    ("dayday", -3.1570004211501135),
-                                    ("SonntagFebruar", -3.1570004211501135),
-                                    ("MontagFebruar", -2.463853240590168),
-                                    ("Freitagthe <day-of-month> (non ordinal)",
-                                     -3.1570004211501135),
-                                    ("dayminute", -2.751535313041949),
-                                    ("MittwochFebruar", -3.1570004211501135),
-                                    ("Freitaghh:mm", -2.751535313041949)],
-                               n = 8}}),
-       ("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.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   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 = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Sonntag", -1.252762968495368), ("day", -0.8472978603872037),
-                                    ("Dienstag", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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.5753641449035618, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..19th)", -1.6094379124341003),
-                                    ("ordinal (digits)", -0.2231435513142097)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.8266785731844679, 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.5520685823000397, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -2.1972245773362196),
-                                    ("<time-of-day>  o'clock", -2.1972245773362196),
-                                    ("intersect", -3.295836866004329),
-                                    ("time-of-day (latent)", -2.043073897508961),
-                                    ("EOM|End of month", -3.295836866004329),
-                                    ("hour", -1.0445450673978338), ("month", -3.295836866004329),
-                                    ("midnight|EOD|end of day", -3.295836866004329)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -0.8574502318512216,
-                               unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.6855773452501515),
-                                    ("intersect", -2.3978952727983707),
-                                    ("mm/dd/yyyy", -2.6855773452501515),
-                                    ("<day-of-month>(ordinal) <named-month>", -3.0910424533583156),
-                                    ("day", -1.3862943611198906), ("hh:mm", -2.174751721484161),
-                                    ("<day-of-month> (ordinal)", -3.0910424533583156),
-                                    ("<day-of-month> (non ordinal) <named-month>",
-                                     -3.0910424533583156),
-                                    ("minute", -2.174751721484161)],
-                               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}}),
-       ("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}}),
-       ("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}}),
-       ("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
-                                   [("ordinals (first..19th)DienstagWeihnachten",
-                                     -0.916290731874155),
-                                    ("dayday", -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.3022808718729337,
-                               unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -1.3437347467010947,
-                               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),
-                                    ("Weihnachten", -1.8971199848858813),
-                                    ("day", -1.6094379124341003),
-                                    ("time-of-day (latent)", -2.3025850929940455),
-                                    ("hh:mm", -2.3025850929940455), ("hour", -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,
+      [("Bhai Dooj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.6094379124341003),
+                                    ("hh:mm", -1.2039728043259361), ("hour", -1.6094379124341003),
+                                    ("minute", -1.2039728043259361)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.41689380393178715,
+                               unseen = -5.857933154483459,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 348},
+                   koData =
+                     ClassData{prior = -1.0761394328160512, unseen = -5.204006687076795,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 180}}),
+       ("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}}),
+       ("Karva Chauth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodoxer Karsamstag",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("Maha Shivaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   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-of-day> approximately",
+        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}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.12044615307586722,
+                               unseen = -5.700443573390687,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clockmorning", -4.598481197837295),
+                                    ("until <time-of-day>afternoon", -5.003946305945459),
+                                    ("dayhour", -3.299198213707034),
+                                    ("todayevening", -4.598481197837295),
+                                    ("half <integer> (german style hour-of-day)afternoon",
+                                     -5.003946305945459),
+                                    ("<time-of-day>  o'clockafter lunch", -4.310799125385514),
+                                    ("intersect by ','evening", -3.499868909169185),
+                                    ("<time-of-day>  o'clockon <date>", -3.9053340172773496),
+                                    ("intersectevening", -1.935893370811842),
+                                    ("time-of-day (latent)on <date>", -4.310799125385514),
+                                    ("about <time-of-day>on <date>", -4.598481197837295),
+                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
+                                     -4.598481197837295),
+                                    ("hourhour", -1.2084571167732645),
+                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
+                                     -3.9053340172773496),
+                                    ("Donnerstagmorning", -5.003946305945459),
+                                    ("<time-of-day>  o'clockafternoon", -4.310799125385514),
+                                    ("half <integer> (german style hour-of-day)after lunch",
+                                     -5.003946305945459),
+                                    ("until <time-of-day>morning", -5.003946305945459),
+                                    ("minutehour", -2.3648889763302003),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -4.087655574071304),
+                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
+                                     -5.003946305945459),
+                                    ("tomorrowevening", -5.003946305945459),
+                                    ("time-of-day (latent)morning", -5.003946305945459),
+                                    ("hh:mmmorning", -5.003946305945459),
+                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
+                                     -4.598481197837295),
+                                    ("until <time-of-day>on <date>", -5.003946305945459),
+                                    ("<day-of-month>(ordinal) <named-month>morning",
+                                     -5.003946305945459),
+                                    ("<time-of-day>  o'clockevening", -5.003946305945459),
+                                    ("hh:mmon <date>", -4.087655574071304),
+                                    ("<hour-of-day> <integer> (as relative minutes)afternoon",
+                                     -5.003946305945459),
+                                    ("tomorrowlunch", -4.598481197837295),
+                                    ("until <time-of-day>after lunch", -5.003946305945459),
+                                    ("Montagmorning", -5.003946305945459),
+                                    ("at <time-of-day>on <date>", -4.087655574071304),
+                                    ("yesterdayevening", -5.003946305945459),
+                                    ("intersectmorning", -5.003946305945459),
+                                    ("hh:mmin|during the <part-of-day>", -4.087655574071304),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -4.310799125385514),
+                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
+                                     -4.598481197837295),
+                                    ("about <time-of-day>in|during the <part-of-day>",
+                                     -4.598481197837295),
+                                    ("half <integer> (german style hour-of-day)on <date>",
+                                     -4.598481197837295),
+                                    ("at <time-of-day>morning", -5.003946305945459),
+                                    ("until <time-of-day>in|during the <part-of-day>",
+                                     -5.003946305945459)],
+                               n = 125},
+                   koData =
+                     ClassData{prior = -2.176171168138387, 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),
+                                    ("Februarmorning", -3.6888794541139363),
+                                    ("<time-of-day>  o'clockafternoon", -3.6888794541139363),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -3.6888794541139363),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.772588722239781)],
+                               n = 16}}),
+       ("Pfingstmontag",
+        Classifier{okData =
+                     ClassData{prior = 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 = -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.37729423114146804,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.157452788691043, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.1416505170630268, unseen = -4.634728988229636,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.8523840910444898),
+                                    ("half <integer> (german style hour-of-day)",
+                                     -3.9318256327243257),
+                                    ("about <time-of-day>", -3.0155349008501706),
+                                    ("time-of-day (latent)", -1.62924053973028),
+                                    ("relative minutes after|past <integer> (hour-of-day)",
+                                     -3.9318256327243257),
+                                    ("hh:mm", -3.0155349008501706),
+                                    ("quarter after|past <integer> (hour-of-day)",
+                                     -3.9318256327243257),
+                                    ("hour", -0.9614111671546247), ("minute", -2.4277482359480516),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.9318256327243257)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -2.0243817644968085,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -2.4849066497880004),
+                                    ("time-of-day (latent)", -1.2321436812926323),
+                                    ("hour", -1.0986122886681098)],
+                               n = 7}}),
+       ("Neujahr",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("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}}),
+       ("Pessach",
+        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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -4.941642422609305,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("absorption of , after named day", -3.835861644462582),
+                                    ("Freitag", -4.241326752570746),
+                                    ("intersect", -1.7155981082624912),
+                                    ("after lunch", -2.9885637840753785),
+                                    ("<day-of-month>(ordinal) <named-month>", -4.241326752570746),
+                                    ("day", -1.5671781031442178),
+                                    ("afternoon", -2.9885637840753785),
+                                    ("intersect by ','", -2.9885637840753785),
+                                    ("intersect by 'of', 'from', 's", -3.3250360206965914),
+                                    ("Donnerstag", -3.548179572010801),
+                                    ("<day-of-month> (ordinal)", -3.835861644462582),
+                                    ("hour", -2.044102175234527), ("evening", -4.241326752570746),
+                                    ("<datetime> - <datetime> (interval)", -4.241326752570746),
+                                    ("minute", -2.1618852108909103),
+                                    ("Samstag", -3.835861644462582),
+                                    ("morning", -4.241326752570746)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.456735772821304),
+                                    ("after lunch", -2.8622008809294686),
+                                    ("<day-of-month>(ordinal) <named-month>", -2.8622008809294686),
+                                    ("tomorrow", -2.8622008809294686), ("day", -1.9459101490553135),
+                                    ("hh:mm", -2.456735772821304),
+                                    ("<day-of-month> (ordinal)", -2.8622008809294686),
+                                    ("hour", -2.8622008809294686), ("minute", -2.169053700369523)],
+                               n = 8}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.10008345855698253,
+                               unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -2.3513752571634776, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Aschura",
+        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 (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}}),
+       ("Vesak",
+        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}}),
+       ("Earth 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}}),
+       ("Pfingsten",
+        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}}),
+       ("<time-of-day>  o'clock",
+        Classifier{okData =
+                     ClassData{prior = -3.846628082779605e-2,
+                               unseen = -5.3706380281276624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("exactly <time-of-day>", -4.672828834461907),
+                                    ("at <time-of-day>", -2.5933872927820705),
+                                    ("half <integer> (german style hour-of-day)",
+                                     -4.672828834461907),
+                                    ("about <time-of-day>", -2.1078794770003695),
+                                    ("time-of-day (latent)", -1.4539530095937054),
+                                    ("quarter after|past <integer> (hour-of-day)",
+                                     -4.672828834461907),
+                                    ("until <time-of-day>", -3.5742165457937967),
+                                    ("hour", -0.750855498180592), ("minute", -4.267363726353742),
+                                    ("after <time-of-day>", -3.5742165457937967)],
+                               n = 102},
+                   koData =
+                     ClassData{prior = -3.2771447329921766,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.1972245773362196),
+                                    ("time-of-day (latent)", -1.791759469228055),
+                                    ("hour", -1.2809338454620642),
+                                    ("after <time-of-day>", -2.1972245773362196)],
+                               n = 4}}),
+       ("Rosch haSchana",
+        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}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Freitag",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("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}}),
+       ("Valentinstag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.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}}),
+       ("Gr\252ndonnerstag",
+        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}}),
+       ("Karfreitag",
+        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}}),
+       ("Chinesisches Neujahr",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -0.916290731874155),
+                                    ("ordinal (1..31)quarter (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}}),
+       ("a <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half a <time-grain>", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1}}),
+       ("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}}),
+       ("3 days ago",
+        Classifier{okData =
+                     ClassData{prior = 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 a half hour",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..19)hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..19)hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.12020308869575518,
+                               unseen = -7.333676395657684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Boghiyear", -6.639875833826536),
+                                    ("Lailat al-Qadryear", -5.135798437050262),
+                                    ("Samstag<time-of-day>  o'clock", -6.639875833826536),
+                                    ("hourday", -5.387112865331168),
+                                    ("<datetime> - <datetime> (interval)year", -5.387112865331168),
+                                    ("dayhour", -2.9385738597140425),
+                                    ("daymonth", -3.4011973816621555),
+                                    ("Orthodoxer Ostersonntagyear", -6.639875833826536),
+                                    ("<day-of-month>(ordinal) <named-month> year<time-of-day>  o'clock",
+                                     -6.639875833826536),
+                                    ("monthyear", -4.848116364598481),
+                                    ("yearhour", -6.639875833826536),
+                                    ("Naraka Chaturdashiyear", -6.234410725718371),
+                                    ("Govardhan Pujayear", -6.234410725718371),
+                                    ("Juliintersect", -6.639875833826536),
+                                    ("intersect<time-of-day>  o'clock", -4.499809670330265),
+                                    ("after lunchat <time-of-day>", -6.639875833826536),
+                                    ("absorption of , after named daymm/dd/yyyy",
+                                     -6.639875833826536),
+                                    ("intersectJuli", -5.94672865326659),
+                                    ("Isra and Mi'rajyear", -5.723585101952381),
+                                    ("Schawuotyear", -6.234410725718371),
+                                    ("Aschermontagyear", -5.94672865326659),
+                                    ("<day-of-month> (ordinal)Dienstag", -6.639875833826536),
+                                    ("Sukkotyear", -6.234410725718371),
+                                    ("intersect by 'of', 'from', 'syear", -6.234410725718371),
+                                    ("<day-of-month> (ordinal)September", -6.234410725718371),
+                                    ("intersect<time> <part-of-day>", -4.5604342921467),
+                                    ("Jom Kippuryear", -6.234410725718371),
+                                    ("<time-of-day>  o'clockafter lunch", -5.94672865326659),
+                                    ("<day-of-month> (ordinal)Mittwoch", -6.639875833826536),
+                                    ("Montagthis <cycle>", -6.639875833826536),
+                                    ("Holiyear", -5.94672865326659),
+                                    ("<time> <part-of-day><time-of-day>  o'clock",
+                                     -6.639875833826536),
+                                    ("Oktoberyear", -5.541263545158426),
+                                    ("today<time-of-day>  o'clock", -6.639875833826536),
+                                    ("Dhanterasyear", -6.234410725718371),
+                                    ("<time-of-day>  o'clockon <date>", -6.234410725718371),
+                                    ("Islamisches Neujahryear", -6.234410725718371),
+                                    ("intersect by ','year", -5.541263545158426),
+                                    ("Holika Dahanyear", -5.94672865326659),
+                                    ("on <date><time-of-day>  o'clock", -6.639875833826536),
+                                    ("exactly <time-of-day>tomorrow", -6.234410725718371),
+                                    ("Jumu'atul-Widayear", -5.723585101952381),
+                                    ("mm/dd<time-of-day>  o'clock", -6.639875833826536),
+                                    ("monthhour", -6.234410725718371),
+                                    ("on <date>between <datetime> and <datetime> (interval)",
+                                     -6.234410725718371),
+                                    ("last <day-of-week> of <time>year", -6.639875833826536),
+                                    ("hourmonth", -6.234410725718371),
+                                    ("Krishna Janmashtamiyear", -6.234410725718371),
+                                    ("todayat <time-of-day>", -5.94672865326659),
+                                    ("Guru Gobind Singh Jayantiyear", -6.639875833826536),
+                                    ("mm/ddabout <time-of-day>", -6.234410725718371),
+                                    ("Donnerstagfrom <datetime> - <datetime> (interval)",
+                                     -5.723585101952381),
+                                    ("<day-of-month> (ordinal)Mai", -6.639875833826536),
+                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
+                                     -6.234410725718371),
+                                    ("Christi Himmelfahrtyear", -5.94672865326659),
+                                    ("on <date>at <time-of-day>", -6.234410725718371),
+                                    ("dayday", -3.46182200347859),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.234410725718371),
+                                    ("Thai Pongalyear", -5.723585101952381),
+                                    ("Thiru Onamyear", -5.94672865326659),
+                                    ("Maulid an-Nab\299year", -6.234410725718371),
+                                    ("Vijayadashamiyear", -6.234410725718371),
+                                    ("about <time-of-day>on <date>", -6.639875833826536),
+                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
+                                     -6.234410725718371),
+                                    ("<day-of-month> (ordinal)intersect", -5.387112865331168),
+                                    ("hourhour", -4.11414718951828),
+                                    ("hh:mmintersect by ','", -5.387112865331168),
+                                    ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.387112865331168),
+                                    ("Dienstagthis <cycle>", -6.639875833826536),
+                                    ("<part-of-day> of <time>Februar", -6.234410725718371),
+                                    ("Raksha Bandhanyear", -6.639875833826536),
+                                    ("Tu biSchevatyear", -6.234410725718371),
+                                    ("dayyear", -1.844085288229795),
+                                    ("Eid al-Adhayear", -4.499809670330265),
+                                    ("Orthodoxer Palmsonntagyear", -6.639875833826536),
+                                    ("K\246nigstagyear", -5.94672865326659),
+                                    ("Mittwochthis <cycle>", -6.639875833826536),
+                                    ("Jom HaShoahyear", -5.723585101952381),
+                                    ("Lag BaOmeryear", -6.234410725718371),
+                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
+                                     -5.541263545158426),
+                                    ("Guru Ravidass Jayantiyear", -5.541263545158426),
+                                    ("tomorrow<time-of-day>  o'clock", -6.234410725718371),
+                                    ("<time-of-day>  o'clocktomorrow", -5.94672865326659),
+                                    ("Jom Ha'atzmautyear", -5.94672865326659),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -5.94672865326659),
+                                    ("half <integer> (german style hour-of-day)after lunch",
+                                     -6.639875833826536),
+                                    ("Pargat Diwasyear", -5.723585101952381),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -5.387112865331168),
+                                    ("Rabindra Jayantiyear", -5.723585101952381),
+                                    ("hourminute", -5.94672865326659),
+                                    ("the <day-of-month> (ordinal)Juli", -6.639875833826536),
+                                    ("Ostermontagyear", -6.639875833826536),
+                                    ("Fastenzeityear", -6.639875833826536),
+                                    ("on <date><day-of-month>(ordinal) <named-month>",
+                                     -6.234410725718371),
+                                    ("minutemonth", -4.11414718951828),
+                                    ("minutehour", -4.388584035220041),
+                                    ("Maha Navamiyear", -6.639875833826536),
+                                    ("Simchat Torahyear", -6.639875833826536),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.723585101952381),
+                                    ("Palmsonntagyear", -6.639875833826536),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
+                                     -6.234410725718371),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -5.541263545158426),
+                                    ("Kaanum Pongalyear", -6.234410725718371),
+                                    ("Maha Saptamiyear", -6.639875833826536),
+                                    ("<day-of-month>(ordinal) <named-month> year<time> <part-of-day>",
+                                     -6.639875833826536),
+                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
+                                     -6.639875833826536),
+                                    ("Donnerstag<time> timezone", -6.234410725718371),
+                                    ("on <date>Dezember", -6.639875833826536),
+                                    ("Parsi Neujahryear", -5.723585101952381),
+                                    ("Corpus Christiyear", -6.234410725718371),
+                                    ("Samstagat <time-of-day>", -6.234410725718371),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -5.387112865331168),
+                                    ("Orthodoxer Ostermontagyear", -6.639875833826536),
+                                    ("this <part-of-day><time-of-day>  o'clock",
+                                     -6.639875833826536),
+                                    ("<day-of-month>(ordinal) <named-month>intersect",
+                                     -6.639875833826536),
+                                    ("hh:mmintersect", -4.1975287984573315),
+                                    ("Fastnachtyear", -5.94672865326659),
+                                    ("Donnerstaghh:mm", -6.639875833826536),
+                                    ("Weihnachtenyear", -6.639875833826536),
+                                    ("<day-of-month> (ordinal)Juli", -5.94672865326659),
+                                    ("Dayananda Saraswati Jayantiyear", -6.639875833826536),
+                                    ("Orthodoxer Karfreitagyear", -6.639875833826536),
+                                    ("Chanukkayear", -6.234410725718371),
+                                    ("intersect by ','intersect", -5.387112865331168),
+                                    ("intersect by 'of', 'from', 'sJuli", -6.639875833826536),
+                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
+                                     -6.234410725718371),
+                                    ("Mahavir Jayantiyear", -6.234410725718371),
+                                    ("from <datetime> - <datetime> (interval)year",
+                                     -5.94672865326659),
+                                    ("at <time-of-day>intersect", -4.848116364598481),
+                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
+                                     -5.723585101952381),
+                                    ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
+                                     -6.639875833826536),
+                                    ("absorption of , after named day<day-of-month> (ordinal)",
+                                     -5.387112865331168),
+                                    ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -6.234410725718371),
+                                    ("Dreifaltigkeitssonntagyear", -5.723585101952381),
+                                    ("Tisha B'Avyear", -6.639875833826536),
+                                    ("the <day-of-month> (ordinal)Dezember", -6.639875833826536),
+                                    ("dayminute", -3.8672871115867546),
+                                    ("on <date>from <datetime> - <datetime> (interval)",
+                                     -6.234410725718371),
+                                    ("Maiyear", -6.639875833826536),
+                                    ("Mittwochnext <cycle>", -6.639875833826536),
+                                    ("Donnerstagbetween <datetime> and <datetime> (interval)",
+                                     -6.234410725718371),
+                                    ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
+                                     -6.639875833826536),
+                                    ("intersectyear", -4.768073656924945),
+                                    ("on <date>intersect", -6.234410725718371),
+                                    ("on <date><day-of-month> (ordinal)", -6.234410725718371),
+                                    ("intersectSeptember", -4.000818504211277),
+                                    ("<ordinal> <cycle> of <time>year", -6.639875833826536),
+                                    ("minuteday", -2.7897282321164774),
+                                    ("absorption of , after named dayintersect",
+                                     -4.241980561028165),
+                                    ("intersect by ','September", -5.253581472706645),
+                                    ("year<time-of-day>  o'clock", -6.639875833826536),
+                                    ("Juliyear", -6.234410725718371),
+                                    ("at <time-of-day>intersect by ','", -5.94672865326659),
+                                    ("hh:mmabsorption of , after named day", -6.234410725718371),
+                                    ("Earth Houryear", -6.234410725718371),
+                                    ("intersect by ','<time> <part-of-day>", -5.723585101952381),
+                                    ("Karfreitagyear", -5.94672865326659),
+                                    ("Chinesisches Neujahryear", -6.639875833826536),
+                                    ("Gr\252ndonnerstagyear", -5.541263545158426),
+                                    ("hh:mmon <date>", -4.1975287984573315),
+                                    ("Pfingstenyear", -6.234410725718371),
+                                    ("Mattu Pongalyear", -6.639875833826536),
+                                    ("Rosch haSchanayear", -5.94672865326659),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.639875833826536),
+                                    ("until <time-of-day>after lunch", -6.639875833826536),
+                                    ("Pfingstmontagyear", -6.234410725718371),
+                                    ("mm/ddyear", -6.234410725718371),
+                                    ("intersect by ','<time-of-day>  o'clock", -5.723585101952381),
+                                    ("intersect<day-of-month> (ordinal)", -5.387112865331168),
+                                    ("absorption of , after named daymm/dd", -6.639875833826536),
+                                    ("on <date>September", -5.723585101952381),
+                                    ("Septemberyear", -6.234410725718371),
+                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
+                                     -5.94672865326659),
+                                    ("at <time-of-day>on <date>", -4.768073656924945),
+                                    ("Pessachyear", -5.541263545158426),
+                                    ("intersectintersect", -4.5604342921467),
+                                    ("<day-of-month> (ordinal)Februar", -5.541263545158426),
+                                    ("Aschurayear", -5.94672865326659),
+                                    ("dayweek", -5.541263545158426),
+                                    ("intersect by ','Juli", -5.94672865326659),
+                                    ("absorption of , after named daythe <day-of-month> (ordinal)",
+                                     -6.639875833826536),
+                                    ("weekyear", -6.234410725718371),
+                                    ("<day-of-month> (ordinal)Dezember", -5.541263545158426),
+                                    ("hh:mmin|during the <part-of-day>", -5.723585101952381),
+                                    ("Karva Chauthyear", -6.234410725718371),
+                                    ("Orthodoxer Karsamstagyear", -6.639875833826536),
+                                    ("Navaratriyear", -6.234410725718371),
+                                    ("Maha Shivaratriyear", -6.639875833826536),
+                                    ("Ramadanyear", -5.387112865331168),
+                                    ("Marzyear", -6.639875833826536),
+                                    ("Bhai Doojyear", -6.639875833826536),
+                                    ("tomorrowat <time-of-day>", -6.234410725718371),
+                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
+                                     -6.639875833826536),
+                                    ("Eid al-Fitryear", -5.253581472706645),
+                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
+                                     -6.234410725718371),
+                                    ("Donnerstag<datetime> - <datetime> (interval)",
+                                     -6.639875833826536),
+                                    ("Aschermittwochyear", -5.94672865326659),
+                                    ("Lazarus-Samstagyear", -6.234410725718371),
+                                    ("Sonntaglast <cycle>", -6.639875833826536),
+                                    ("at <time-of-day>tomorrow", -6.639875833826536),
+                                    ("Ostersonntagyear", -6.639875833826536),
+                                    ("tomorrowabout <time-of-day>", -6.234410725718371),
+                                    ("Gro\223e Fastenzeityear", -6.639875833826536),
+                                    ("about <time-of-day>in|during the <part-of-day>",
+                                     -6.234410725718371),
+                                    ("Schmini Azeretyear", -5.94672865326659),
+                                    ("half <integer> (german style hour-of-day)on <date>",
+                                     -6.639875833826536),
+                                    ("this <part-of-day>at <time-of-day>", -6.234410725718371),
+                                    ("<datetime> - <datetime> (interval)Juli", -6.234410725718371),
+                                    ("Vaisakhiyear", -5.723585101952381),
+                                    ("Diwaliyear", -5.94672865326659),
+                                    ("after lunch<hour-of-day> <integer> (as relative minutes)",
+                                     -6.234410725718371),
+                                    ("<day-of-month> (ordinal)Marz", -6.639875833826536),
+                                    ("last <cycle> of <time>year", -6.234410725718371),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -6.639875833826536),
+                                    ("minuteyear", -6.234410725718371),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -6.639875833826536),
+                                    ("Chhathyear", -5.94672865326659),
+                                    ("Vasant Panchamiyear", -6.234410725718371),
+                                    ("Global Youth Service-Tagyear", -6.639875833826536),
+                                    ("Karsamstagyear", -5.94672865326659)],
+                               n = 642},
+                   koData =
+                     ClassData{prior = -2.178072145121463, unseen = -6.018593214496234,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("absorption of , after named daythe <day-of-month> (non ordinal)",
+                                     -5.3230099791384085),
+                                    ("<datetime> - <datetime> (interval)year", -5.3230099791384085),
+                                    ("Mittwochby the end of <time>", -4.917544871030244),
+                                    ("dayhour", -4.629862798578463),
+                                    ("daymonth", -3.618261886899983),
+                                    ("monthyear", -5.3230099791384085),
+                                    ("yearhour", -5.3230099791384085),
+                                    ("after lunchat <time-of-day>", -4.917544871030244),
+                                    ("mm/dduntil <time-of-day>", -4.917544871030244),
+                                    ("until <time-of-day>year", -4.917544871030244),
+                                    ("<day-of-month> (ordinal)Dienstag", -4.917544871030244),
+                                    ("absorption of , after named dayFebruar", -4.2243976904702984),
+                                    ("Donnerstagyear", -4.629862798578463),
+                                    ("on <date>Februar", -5.3230099791384085),
+                                    ("intersect by 'of', 'from', 'syear", -4.629862798578463),
+                                    ("intersect<time> <part-of-day>", -5.3230099791384085),
+                                    ("<time-of-day>  o'clockafter lunch", -5.3230099791384085),
+                                    ("<day-of-month> (ordinal)Mittwoch", -5.3230099791384085),
+                                    ("after lunch<time-of-day>  o'clock", -5.3230099791384085),
+                                    ("Holiyear", -5.3230099791384085),
+                                    ("absorption of , after named dayhh:mm", -5.3230099791384085),
+                                    ("<time-of-day>  o'clock<time> <part-of-day>",
+                                     -4.406719247264253),
+                                    ("monthhour", -5.3230099791384085),
+                                    ("todayat <time-of-day>", -5.3230099791384085),
+                                    ("dayday", -3.9367156180185177),
+                                    ("Thai Pongalyear", -4.629862798578463),
+                                    ("hourhour", -3.8189325823621343),
+                                    ("Donnerstagafter <time-of-day>", -5.3230099791384085),
+                                    ("dayyear", -2.254957044004791),
+                                    ("Ostermontagyear", -5.3230099791384085),
+                                    ("Fastenzeityear", -5.3230099791384085),
+                                    ("Palmsonntagyear", -5.3230099791384085),
+                                    ("Aprilyear", -5.3230099791384085),
+                                    ("Sonntagyear", -5.3230099791384085),
+                                    ("Montagyear", -4.629862798578463),
+                                    ("Dienstagafter <time-of-day>", -5.3230099791384085),
+                                    ("Donnerstaghh:mm", -4.917544871030244),
+                                    ("<day-of-month> (ordinal)Juli", -4.917544871030244),
+                                    ("dayminute", -3.9367156180185177),
+                                    ("until <time-of-day>Juli", -5.3230099791384085),
+                                    ("Karfreitagyear", -5.3230099791384085),
+                                    ("Freitagyear", -4.917544871030244),
+                                    ("year<time> <part-of-day>", -5.3230099791384085),
+                                    ("mm/ddyear", -3.8189325823621343),
+                                    ("Neujahryear", -4.406719247264253),
+                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
+                                     -4.917544871030244),
+                                    ("Donnerstag<part-of-day> of <time>", -5.3230099791384085),
+                                    ("<day-of-month> (ordinal)April", -5.3230099791384085),
+                                    ("daynograin", -4.917544871030244),
+                                    ("Ostersonntagyear", -5.3230099791384085),
+                                    ("after <time-of-day>year", -5.3230099791384085),
+                                    ("on <date>after <time-of-day>", -5.3230099791384085),
+                                    ("Diwaliyear", -5.3230099791384085),
+                                    ("tomorrownoon", -5.3230099791384085),
+                                    ("Samstagyear", -4.629862798578463),
+                                    ("Karsamstagyear", -5.3230099791384085)],
+                               n = 82}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7047480922384253),
+                                    ("ordinal (1..31)week (grain)intersect", -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609),
+                                    ("ordinal (1..31)day (grain)Oktober", -1.7047480922384253),
+                                    ("ordinal (1..31)week (grain)Oktober", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               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 = -0.916290731874155, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.3025850929940455),
+                                    ("minuteminute", -2.3025850929940455),
+                                    ("time-of-day (latent)time-of-day (latent)", -2.70805020110221),
+                                    ("hh:mmhh:mm", -2.3025850929940455),
+                                    ("dayday", -2.0149030205422647),
+                                    ("hourhour", -2.70805020110221),
+                                    ("minutehour", -2.3025850929940455),
+                                    ("mm/ddmm/dd", -2.0149030205422647)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.2512917986064953),
+                                    ("mm/ddmm/dd/yyyy", -2.2512917986064953),
+                                    ("mm/ddhh:mm", -2.2512917986064953),
+                                    ("dayday", -1.6916760106710724),
+                                    ("mm/ddintersect", -2.2512917986064953),
+                                    ("dayminute", -2.2512917986064953),
+                                    ("mm/ddtime-of-day (latent)", -2.2512917986064953)],
+                               n = 12}}),
+       ("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}}),
+       ("Muttertag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               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}}),
+       ("Dreifaltigkeitssonntag",
+        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}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.6094379124341003),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Silvester",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("Chanukka",
+        Classifier{okData =
+                     ClassData{prior = 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.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}}),
+       ("Mahavir Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.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}}),
+       ("Fastnacht",
+        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 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}}),
+       ("Dayananda Saraswati Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Weihnachten",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodoxer Karfreitag",
+        Classifier{okData =
+                     ClassData{prior = 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-week> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mittwoch<integer> <unit-of-duration>", -0.8754687373538999),
+                                    ("dayweek", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.0986122886681098),
+                                    ("Mittwochfortnight", -1.0986122886681098)],
+                               n = 1}}),
+       ("Orthodoxer Ostermontag",
+        Classifier{okData =
+                     ClassData{prior = 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 = -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
+                                   [("ordinal (1..31)DienstagOktober", -1.9459101490553135),
+                                    ("daymonth", -1.0296194171811581),
+                                    ("ordinal (1..31)Dienstagintersect", -1.9459101490553135),
+                                    ("ordinal (1..31)Mittwochintersect", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (1..31)MittwochOktober", -1.3862943611198906),
+                                    ("daymonth", -1.0986122886681098),
+                                    ("ordinal (1..31)DienstagSeptember", -1.791759469228055)],
+                               n = 3}}),
+       ("half a <time-grain>",
+        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 (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("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}}),
+       ("Palmsonntag",
+        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}}),
+       ("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}}),
+       ("Parsi Neujahr",
+        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}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vatertag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 31},
+                   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}}),
+       ("Corpus Christi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sonntag",
+        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}}),
+       ("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}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Montag",
+        Classifier{okData =
+                     ClassData{prior = -0.2411620568168881,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -1.540445040947149, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.16251892949777494,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)Juli", -2.3513752571634776),
+                                    ("ordinal (1..31)Dezember", -1.9459101490553135),
+                                    ("ordinal (1..31)Marz", -3.044522437723423),
+                                    ("ordinal (digits)Mai", -3.044522437723423),
+                                    ("ordinal (digits)September", -2.639057329615259),
+                                    ("month", -0.8472978603872037),
+                                    ("ordinal (digits)Februar", -1.9459101490553135)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -1.8971199848858813, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)Juli", -1.540445040947149),
+                                    ("ordinal (digits)April", -1.9459101490553135),
+                                    ("month", -1.252762968495368)],
+                               n = 3}}),
+       ("ordinal (1..31)",
+        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}}),
+       ("Rabindra Jayanti",
+        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}}),
+       ("Pargat Diwas",
+        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}}),
+       ("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.1780538303479458,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 22}}),
+       ("Fastenzeit",
+        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}}),
+       ("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}}),
+       ("Ostermontag",
+        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}}),
+       ("tomorrow",
+        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}}),
+       ("after next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0794415416798357),
+                                    ("month (grain)", -2.0794415416798357),
+                                    ("year (grain)", -2.0794415416798357),
+                                    ("week (grain)", -2.0794415416798357),
+                                    ("quarter", -2.0794415416798357), ("year", -2.0794415416798357),
+                                    ("month", -2.0794415416798357),
+                                    ("quarter (grain)", -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Navami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<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}}),
+       ("Tu biSchevat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodoxer Palmsonntag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("K\246nigstag",
+        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 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}}),
+       ("Jom HaShoah",
+        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 <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (1..31)", -0.6931471805599453),
+                                    ("ordinal (digits)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guru Ravidass Jayanti",
+        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}}),
+       ("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}}),
+       ("Jom Ha'atzmaut",
+        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 <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 = -1.626052087178029e-2,
+                               unseen = -4.852030263919617,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.646962509122372),
+                                    ("<time-of-day>  o'clock", -1.5860905484371093),
+                                    ("about <time-of-day>", -2.2792377289970545),
+                                    ("time-of-day (latent)", -2.010973742402375),
+                                    ("hour", -0.7170527014134996)],
+                               n = 61},
+                   koData =
+                     ClassData{prior = -4.127134385045092, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -1.252762968495368)],
+                               n = 1}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.23419338750079477, unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -6.995858860691034e-2),
+                                    ("integer (0..19)", -2.6946271807700692)],
+                               n = 72},
+                   koData =
+                     ClassData{prior = -1.5664205273504095,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2113090936672069),
+                                    ("integer (0..19)", -1.6582280766035324)],
+                               n = 19}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -1.731645001146093e-2,
+                               unseen = -5.442417710521793,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 229},
+                   koData =
+                     ClassData{prior = -4.06474409244581, 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),
+                                    ("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.8034952377288106, unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9339339580085977),
+                                    ("integer (0..19)year (grain)", -3.3202283191284883),
+                                    ("integer (numeric)day (grain)", -2.8094026953624978),
+                                    ("couplehour (grain)", -3.7256934272366524),
+                                    ("integer (0..19)hour (grain)", -3.3202283191284883),
+                                    ("second", -3.7256934272366524),
+                                    ("integer (numeric)year (grain)", -3.7256934272366524),
+                                    ("day", -2.8094026953624978), ("year", -3.0325462466767075),
+                                    ("integer (numeric)week (grain)", -2.627081138568543),
+                                    ("integer (0..19)month (grain)", -3.7256934272366524),
+                                    ("integer (0..19)second (grain)", -3.7256934272366524),
+                                    ("hour", -2.8094026953624978), ("month", -3.7256934272366524),
+                                    ("integer (numeric)minute (grain)", -2.627081138568543),
+                                    ("integer (0..19)minute (grain)", -3.7256934272366524),
+                                    ("minute", -2.472930458741285),
+                                    ("integer (numeric)hour (grain)", -3.7256934272366524),
+                                    ("integer (0..19)week (grain)", -2.472930458741285)],
+                               n = 30},
+                   koData =
+                     ClassData{prior = -0.5937747067467416, 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}}),
+       ("number,number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guru Gobind Singh Jayanti",
+        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}}),
+       ("Christi Himmelfahrt",
+        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}}),
+       ("Krishna Janmashtami",
+        Classifier{okData =
+                     ClassData{prior = 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 = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>Weihnachten", -1.252762968495368),
+                                    ("a <unit-of-duration>Weihnachten", -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}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Mittwoch",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Maulid an-Nab\299",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Oktober",
+        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}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (grain)", -0.6931471805599453),
+                                    ("year", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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.6061358035703156,
+                               unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   koData =
+                     ClassData{prior = -0.7884573603642702,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("Islamisches Neujahr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by ','",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.969813299576001,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Freitag<day-of-month>(ordinal) <named-month> year",
+                                     -3.8642323415917974),
+                                    ("dayhour", -2.765620052923688),
+                                    ("Freitagintersect", -1.967112356705916),
+                                    ("Samstag<day-of-month>(ordinal) <named-month>",
+                                     -4.269697449699962),
+                                    ("Freitagmm/dd/yyyy", -3.8642323415917974),
+                                    ("Freitagmm/dd", -3.8642323415917974),
+                                    ("dayday", -1.2992829841302609),
+                                    ("Samstagintersect", -4.269697449699962),
+                                    ("dayyear", -4.269697449699962),
+                                    ("Freitag<day-of-month>(ordinal) <named-month>",
+                                     -3.5765502691400166),
+                                    ("Freitagthe <day-of-month> (ordinal)", -4.269697449699962),
+                                    ("on <date><day-of-month>(ordinal) <named-month>",
+                                     -3.8642323415917974),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -3.5765502691400166),
+                                    ("Freitag<day-of-month> (ordinal)", -3.5765502691400166),
+                                    ("on <date>intersect", -3.8642323415917974),
+                                    ("on <date><day-of-month> (ordinal)", -3.8642323415917974),
+                                    ("minuteday", -2.6602595372658615),
+                                    ("Montag<named-month> <day-of-month> (non ordinal)",
+                                     -3.5765502691400166),
+                                    ("Sonntag<named-month> <day-of-month> (non ordinal)",
+                                     -4.269697449699962),
+                                    ("intersect<day-of-month> (ordinal)", -3.5765502691400166),
+                                    ("intersectintersect", -3.5765502691400166),
+                                    ("Samstag<day-of-month> (ordinal)", -4.269697449699962),
+                                    ("Mittwoch<named-month> <day-of-month> (non ordinal)",
+                                     -4.269697449699962),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -4.269697449699962)],
+                               n = 56},
+                   koData =
+                     ClassData{prior = -2.0794415416798357, unseen = -3.871201010907891,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.0583881324820035),
+                                    ("dayday", -3.1570004211501135),
+                                    ("SonntagFebruar", -3.1570004211501135),
+                                    ("MontagFebruar", -2.463853240590168),
+                                    ("Freitagthe <day-of-month> (non ordinal)",
+                                     -3.1570004211501135),
+                                    ("dayminute", -2.751535313041949),
+                                    ("MittwochFebruar", -3.1570004211501135),
+                                    ("Freitaghh:mm", -2.751535313041949)],
+                               n = 8}}),
+       ("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}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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.3184537311185346, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.371577964480997),
+                                    ("intersectOktober", -3.2188758248682006),
+                                    ("Mittwochintersect", -3.624340932976365),
+                                    ("on <date>hh:mm", -3.624340932976365),
+                                    ("dayday", -2.70805020110221),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -3.624340932976365),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
+                                     -3.624340932976365),
+                                    ("on <date><time-of-day> - <time-of-day> (interval)",
+                                     -3.2188758248682006),
+                                    ("on <date><datetime> - <datetime> (interval)",
+                                     -3.624340932976365),
+                                    ("Donnerstaghh:mm", -3.2188758248682006),
+                                    ("absorption of , after named day<day-of-month> (ordinal)",
+                                     -3.624340932976365),
+                                    ("dayminute", -1.7525387560747736),
+                                    ("Mittwochnext <cycle>", -3.624340932976365),
+                                    ("absorption of , after named dayintersect",
+                                     -3.624340932976365),
+                                    ("DienstagOktober", -3.624340932976365),
+                                    ("MittwochOktober", -3.624340932976365),
+                                    ("intersectintersect", -3.624340932976365),
+                                    ("dayweek", -3.2188758248682006),
+                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
+                                     -2.70805020110221),
+                                    ("Donnerstag<datetime> - <datetime> (interval)",
+                                     -3.2188758248682006),
+                                    ("Sonntaglast <cycle>", -3.624340932976365)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -1.2992829841302609, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.5040773967762742),
+                                    ("intersectOktober", -3.1135153092103742),
+                                    ("Mittwochintersect", -3.1135153092103742),
+                                    ("Dienstagintersect", -3.1135153092103742),
+                                    ("DienstagSeptember", -3.1135153092103742),
+                                    ("MontagMarz", -3.1135153092103742),
+                                    ("SonntagMarz", -3.1135153092103742),
+                                    ("intersectSeptember", -3.1135153092103742),
+                                    ("MittwochOktober", -3.1135153092103742),
+                                    ("Sonntagintersect", -3.1135153092103742)],
+                               n = 9}}),
+       ("Donnerstag",
+        Classifier{okData =
+                     ClassData{prior = -0.2411620568168881,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -1.540445040947149, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               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 = -1.0116009116784799, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149), ("day", -1.540445040947149),
+                                    ("<integer> <unit-of-duration>", -1.540445040947149),
+                                    ("fortnight", -1.540445040947149)],
+                               n = 4}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sonntag", -1.252762968495368), ("day", -0.8472978603872037),
+                                    ("Dienstag", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("Jom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.4595323293784402, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (1..31)", -1.0608719606852628),
+                                    ("ordinal (digits)", -0.42488319396526597)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -0.9985288301111273, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (1..31)", -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.5520685823000397, unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.1972245773362196),
+                                    ("<time-of-day>  o'clock", -2.1972245773362196),
+                                    ("intersect", -3.295836866004329),
+                                    ("time-of-day (latent)", -2.043073897508961),
+                                    ("EOM|End of month", -3.295836866004329),
+                                    ("hour", -1.0445450673978338), ("month", -3.295836866004329),
+                                    ("midnight|EOD|end of day", -3.295836866004329)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.8574502318512216,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.6855773452501515),
+                                    ("intersect", -2.3978952727983707),
+                                    ("mm/dd/yyyy", -2.6855773452501515),
+                                    ("<day-of-month>(ordinal) <named-month>", -3.0910424533583156),
+                                    ("day", -1.3862943611198906), ("hh:mm", -2.174751721484161),
+                                    ("<day-of-month> (ordinal)", -3.0910424533583156),
+                                    ("<day-of-month> (non ordinal) <named-month>",
+                                     -3.0910424533583156),
+                                    ("minute", -2.174751721484161)],
+                               n = 14}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Schawuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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}}),
+       ("Aschermontag",
+        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}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Govardhan Puja",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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}}),
+       ("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}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.916290731874155),
+                                    ("minute", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> and a half hour", -0.916290731874155),
+                                    ("minute", -0.916290731874155)],
+                               n = 1}}),
+       ("Purim",
+        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}}),
+       ("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.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9808292530117262),
+                                    ("hh:mm", -2.0794415416798357), ("hour", -0.9808292530117262),
+                                    ("minute", -2.0794415416798357)],
+                               n = 6}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.2336148511815052,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8134107167600364),
+                                    ("<integer> and a half hour", -3.2188758248682006),
+                                    ("second", -3.2188758248682006), ("day", -2.8134107167600364),
+                                    ("half an hour", -3.2188758248682006),
+                                    ("year", -3.2188758248682006),
+                                    ("<integer> <unit-of-duration>", -1.1394342831883648),
+                                    ("number,number hours", -3.2188758248682006),
+                                    ("hour", -2.3025850929940455),
+                                    ("about|exactly <duration>", -3.2188758248682006),
+                                    ("minute", -1.6094379124341003)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -1.5686159179138452,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9924301646902063),
+                                    ("<integer> and a half hour", -2.3978952727983707),
+                                    ("day", -2.3978952727983707),
+                                    ("<integer> <unit-of-duration>", -1.9924301646902063),
+                                    ("about|exactly <duration>", -2.3978952727983707),
+                                    ("fortnight", -2.3978952727983707),
+                                    ("minute", -1.9924301646902063)],
+                               n = 5}}),
+       ("<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}}),
+       ("fortnight",
+        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}}),
+       ("Orthodoxer Ostersonntag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.3217558399823195),
+                                    ("hh:mmhh:mm", -1.3217558399823195),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.9459101490553135),
+                                    ("hourminute", -1.252762968495368),
+                                    ("minutehour", -1.9459101490553135),
+                                    ("time-of-day (latent)hh:mm", -1.252762968495368)],
+                               n = 4}}),
+       ("Lailat al-Qadr",
+        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}}),
+       ("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
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinal (1..31)Dienstagintersect", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinal (1..31)DienstagWeihnachten", -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}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Marz", -1.3862943611198906),
+                                    ("integer (numeric)April", -1.3862943611198906),
+                                    ("month", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -0.9808292530117262),
+                                    ("integer (numeric)Juli", -0.9808292530117262)],
+                               n = 2}}),
+       ("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.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   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}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Global Youth Service-Tag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Karsamstag",
+        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}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)Juli", -1.252762968495368),
+                                    ("ordinal (digits)Mai", -1.9459101490553135),
+                                    ("ordinal (digits)April", -1.9459101490553135),
+                                    ("month", -0.8472978603872037)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Samstag",
+        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}}),
+       ("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}}),
+       ("Schmini Azeret",
+        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.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),
+                                    ("Weihnachten", -1.8971199848858813),
+                                    ("day", -1.6094379124341003),
+                                    ("time-of-day (latent)", -2.3025850929940455),
+                                    ("hh:mm", -2.3025850929940455), ("hour", -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}}),
+       ("Vaisakhi",
+        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}}),
+       ("Dezember",
+        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}}),
+       ("Ostersonntag",
+        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}}),
+       ("Gro\223e Fastenzeit",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        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}}),
+       ("<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}}),
+       ("Aschermittwoch",
+        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}}),
+       ("Lazarus-Samstag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -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}}),
+       ("Shushan Purim",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("within <duration>",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/EL_XX.hs b/Duckling/Ranking/Classifiers/EL_XX.hs
--- a/Duckling/Ranking/Classifiers/EL_XX.hs
+++ b/Duckling/Ranking/Classifiers/EL_XX.hs
@@ -73,11 +73,12 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.6150455928747536, unseen = -5.272999558563747,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 193},
+                     ClassData{prior = -0.5945320530416505, unseen = -5.293304824724492,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 197},
                    koData =
-                     ClassData{prior = -0.7778693539554407, unseen = -5.111987788356543,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 164}}),
+                     ClassData{prior = -0.8025619665458121,
+                               unseen = -5.0875963352323845,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 160}}),
        ("<integer> and a half <grain>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -139,24 +140,23 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month> (ordinal or number)",
         Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.0794415416798357,
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("month", -1.252762968495368),
-                                    ("Julyinteger (numeric)", -1.252762968495368)],
+                                   [("month", -1.0986122886681098),
+                                    ("Julyinteger (numeric)", -1.0986122886681098)],
                                n = 1},
                    koData =
-                     ClassData{prior = -0.2231435513142097, unseen = -2.639057329615259,
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
                                    [("absorption of article before timeinteger (numeric)",
-                                     -1.8718021769015913),
-                                    ("Augustinteger (numeric)", -1.8718021769015913),
-                                    ("Aprilinteger (numeric)", -1.8718021769015913),
-                                    ("month", -0.9555114450274363),
-                                    ("Julyinteger (numeric)", -1.8718021769015913)],
-                               n = 4}}),
+                                     -1.3862943611198906),
+                                    ("Aprilinteger (numeric)", -1.3862943611198906),
+                                    ("month", -0.9808292530117262)],
+                               n = 2}}),
        ("<time-of-day> approximately",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -376,26 +376,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("between <time-of-day> and <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.5649493574615367,
+                     ClassData{prior = -0.2876820724517809, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.791759469228055),
-                                    ("hh:mmhh:mm", -1.791759469228055),
-                                    ("hourminute", -1.791759469228055),
-                                    ("time-of-day (latent)hh:mm", -1.791759469228055)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.9459101490553135),
+                                    ("minuteminute", -1.9459101490553135),
+                                    ("hh:mmhh:mm", -1.9459101490553135),
+                                    ("hourminute", -1.9459101490553135),
+                                    ("minutehour", -1.9459101490553135),
+                                    ("time-of-day (latent)hh:mm", -1.9459101490553135)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.5649493574615367,
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -1.791759469228055),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.791759469228055)],
-                               n = 2}}),
+                                   [("time-of-day (latent)time-of-day (latent)",
+                                     -1.6094379124341003),
+                                    ("hourhour", -1.6094379124341003)],
+                               n = 1}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -560,363 +559,347 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.42294807088851183,
-                               unseen = -6.862757913051402,
+                     ClassData{prior = -0.4037091814058995, unseen = -6.860663671448286,
                                likelihoods =
                                  HashMap.fromList
-                                   [("tuesdaySeptember", -5.25227342804663),
+                                   [("tuesdaySeptember", -5.250176991220102),
                                     ("Father's Dayabsorption of article before time",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("last <cycle> <time>'s'absorption of article before time",
-                                     -5.47541697936084),
-                                    ("hourday", -4.296761983019193),
-                                    ("dayhour", -2.3619016701504654),
-                                    ("daymonth", -3.8171889027573074),
-                                    ("monthyear", -3.7706688871224143),
+                                     -5.473320542534312),
+                                    ("hourday", -4.2946655461926655),
+                                    ("dayhour", -2.359805233323937),
+                                    ("daymonth", -3.815092465930779),
+                                    ("monthyear", -3.768572450295886),
                                     ("<time-of-day> am|pmabsorption of article before time",
-                                     -4.028497996424514),
-                                    ("tuesdaythis <cycle>", -6.168564159920785),
+                                     -4.0264015595979865),
+                                    ("tuesdaythis <cycle>", -6.166467723094256),
                                     ("last <day-of-week> of <time>absorption of article before time",
-                                     -6.168564159920785),
-                                    ("wednesdayintersect", -5.069951871252675),
+                                     -6.166467723094256),
+                                    ("wednesdayintersect", -5.067855434426147),
                                     ("absorption of article before timeabsorption of , after named day",
-                                     -6.168564159920785),
-                                    ("houryear", -6.168564159920785),
+                                     -6.166467723094256),
+                                    ("houryear", -6.166467723094256),
                                     ("absorption of article before timeat <time-of-day>",
-                                     -5.47541697936084),
+                                     -5.473320542534312),
                                     ("absorption of article before time<day-of-month> (ordinal or number) <named-month>",
-                                     -5.25227342804663),
+                                     -5.250176991220102),
                                     ("absorption of article before time<time> <part-of-day>",
-                                     -5.47541697936084),
-                                    ("Octoberabsorption of article before time", -5.47541697936084),
+                                     -5.473320542534312),
+                                    ("Octoberabsorption of article before time",
+                                     -5.473320542534312),
                                     ("intersect<day-of-month> (ordinal or number) <named-month>",
-                                     -4.296761983019193),
-                                    ("intersect by 'of', 'from', 'syear", -6.168564159920785),
-                                    ("<time-of-day> am|pmintersect", -4.664486763144511),
-                                    ("intersectat <time-of-day>", -5.76309905181262),
+                                     -4.2946655461926655),
+                                    ("intersect by 'of', 'from', 'syear", -6.166467723094256),
+                                    ("<time-of-day> am|pmintersect", -4.662390326317983),
+                                    ("intersectat <time-of-day>", -5.761002614986093),
                                     ("thursday<day-of-month> ( ordinal) <named-month> year",
-                                     -6.168564159920785),
-                                    ("saturday<time-of-day> am|pm", -5.76309905181262),
-                                    ("saturdayat <time-of-day>", -5.76309905181262),
-                                    ("after tomorrowat <time-of-day>", -6.168564159920785),
-                                    ("intersect<time-of-day> am|pm", -6.168564159920785),
-                                    ("<part-of-day> of <time>February", -6.168564159920785),
-                                    ("absorption of article before timeOctober", -5.76309905181262),
+                                     -6.166467723094256),
+                                    ("saturday<time-of-day> am|pm", -5.761002614986093),
+                                    ("saturdayat <time-of-day>", -5.761002614986093),
+                                    ("after tomorrowat <time-of-day>", -6.166467723094256),
+                                    ("intersect<time-of-day> am|pm", -6.166467723094256),
+                                    ("<part-of-day> of <time>February", -6.166467723094256),
+                                    ("absorption of article before timeOctober",
+                                     -5.761002614986093),
                                     ("<time-of-day>  o'clockabsorption of article before time",
-                                     -6.168564159920785),
-                                    ("after tomorrow<time-of-day> am|pm", -5.76309905181262),
+                                     -6.166467723094256),
+                                    ("after tomorrow<time-of-day> am|pm", -5.761002614986093),
                                     ("wednesdayabsorption of article before time",
-                                     -4.664486763144511),
-                                    ("Marchabsorption of article before time", -6.168564159920785),
-                                    ("wednesdayat <time-of-day>", -5.76309905181262),
-                                    ("intersect by ','<time-of-day> am|pm", -5.25227342804663),
-                                    ("thursdayhh(:mm) - <time-of-day> am|pm", -6.168564159920785),
-                                    ("<time-of-day> am|pmintersect by ','", -5.25227342804663),
+                                     -4.662390326317983),
+                                    ("Marchabsorption of article before time", -6.166467723094256),
+                                    ("wednesdayat <time-of-day>", -5.761002614986093),
+                                    ("intersect by ','<time-of-day> am|pm", -5.250176991220102),
+                                    ("thursdayhh(:mm) - <time-of-day> am|pm", -6.166467723094256),
+                                    ("<time-of-day> am|pmintersect by ','", -5.250176991220102),
                                     ("absorption of article before timeLast year",
-                                     -5.76309905181262),
+                                     -5.761002614986093),
                                     ("absorption of article before timeintersect",
-                                     -5.25227342804663),
-                                    ("wednesday<time> <part-of-day>", -5.25227342804663),
-                                    ("hourmonth", -6.168564159920785),
-                                    ("todayat <time-of-day>", -6.168564159920785),
+                                     -5.250176991220102),
+                                    ("wednesday<time> <part-of-day>", -5.250176991220102),
+                                    ("hourmonth", -6.166467723094256),
+                                    ("todayat <time-of-day>", -6.166467723094256),
                                     ("absorption of article before timeabsorption of article before time",
-                                     -3.5658744744764013),
-                                    ("thursday<time> timezone", -4.915801191425417),
+                                     -3.563778037649873),
+                                    ("thursday<time> timezone", -4.913704754598889),
                                     ("yesterdayabsorption of article before time",
-                                     -6.168564159920785),
-                                    ("dayday", -3.6036148024592483),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.76309905181262),
-                                    ("tonightat <time-of-day>", -5.76309905181262),
+                                     -6.166467723094256),
+                                    ("dayday", -3.60151836563272),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.761002614986093),
+                                    ("tonightat <time-of-day>", -5.761002614986093),
                                     ("<time-of-day> am|pmabsorption of , after named day",
-                                     -5.25227342804663),
-                                    ("today<time-of-day> am|pm", -5.76309905181262),
-                                    ("at <time-of-day><time> <part-of-day>", -5.47541697936084),
+                                     -5.250176991220102),
+                                    ("today<time-of-day> am|pm", -5.761002614986093),
+                                    ("at <time-of-day><time> <part-of-day>", -5.473320542534312),
                                     ("absorption of , after named day<day-of-month> (ordinal or number) <named-month>",
-                                     -4.2226540108654715),
-                                    ("hourhour", -2.854378155248259),
+                                     -4.220557574038944),
+                                    ("hourhour", -2.852281718421731),
                                     ("<time-of-day> - <time-of-day> (interval)absorption of article before time",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("halloween dayabsorption of article before time",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("<datetime> - <datetime> (interval)absorption of article before time",
-                                     -5.76309905181262),
-                                    ("dayyear", -2.949688335052584),
+                                     -5.761002614986093),
+                                    ("dayyear", -2.9475918982260563),
                                     ("thursday<day-of-month> (ordinal or number) <named-month>",
-                                     -6.168564159920785),
-                                    ("last weekend of <named-month>year", -6.168564159920785),
+                                     -6.166467723094256),
+                                    ("last weekend of <named-month>year", -6.166467723094256),
                                     ("<time-of-day>  o'clockin|during the <part-of-day>",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -6.168564159920785),
+                                     -5.761002614986093),
                                     ("tuesdayabsorption of article before time",
-                                     -4.664486763144511),
+                                     -4.662390326317983),
                                     ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -6.168564159920785),
-                                    ("wednesday<time-of-day> am|pm (verbose)", -5.76309905181262),
-                                    ("before yesterday<time-of-day> am|pm", -5.76309905181262),
-                                    ("wednesdaythis <cycle>", -6.168564159920785),
-                                    ("todayin|during the <part-of-day>", -6.168564159920785),
-                                    ("<time-of-day> am|pmtomorrow", -5.25227342804663),
-                                    ("thursdayhh:mm", -6.168564159920785),
-                                    ("minutehour", -4.46381606768236),
-                                    ("before yesterdayat <time-of-day>", -5.76309905181262),
-                                    ("tonightin|during the <part-of-day>", -6.168564159920785),
+                                     -6.166467723094256),
+                                    ("wednesday<time-of-day> am|pm (verbose)", -5.761002614986093),
+                                    ("before yesterday<time-of-day> am|pm", -5.761002614986093),
+                                    ("wednesdaythis <cycle>", -6.166467723094256),
+                                    ("todayin|during the <part-of-day>", -6.166467723094256),
+                                    ("<time-of-day> am|pmtomorrow", -5.250176991220102),
+                                    ("thursdayhh:mm", -6.166467723094256),
+                                    ("minutehour", -4.461719630855832),
+                                    ("before yesterdayat <time-of-day>", -5.761002614986093),
+                                    ("tonightin|during the <part-of-day>", -6.166467723094256),
                                     ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.25227342804663),
-                                    ("thursdayintersect", -6.168564159920785),
+                                     -5.250176991220102),
+                                    ("thursdayintersect", -6.166467723094256),
                                     ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.25227342804663),
-                                    ("Aprilyear", -5.76309905181262),
+                                     -5.250176991220102),
+                                    ("Aprilyear", -5.761002614986093),
                                     ("absorption of article before timetomorrow",
-                                     -5.47541697936084),
+                                     -5.473320542534312),
                                     ("absorption of article before timehh(:mm) - <time-of-day> am|pm",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("absorption of article before timein|during the <part-of-day>",
-                                     -5.25227342804663),
-                                    ("yesterdayin|during the <part-of-day>", -6.168564159920785),
+                                     -5.250176991220102),
+                                    ("yesterdayin|during the <part-of-day>", -6.166467723094256),
                                     ("before yesterdayabsorption of article before time",
-                                     -5.76309905181262),
+                                     -5.761002614986093),
                                     ("this <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -6.168564159920785),
-                                    ("tuesday<time> <part-of-day>", -5.25227342804663),
+                                     -6.166467723094256),
+                                    ("tuesday<time> <part-of-day>", -5.250176991220102),
                                     ("absorption of article before timeFebruary",
-                                     -5.76309905181262),
-                                    ("weekmonth", -5.25227342804663),
-                                    ("tuesdayat <time-of-day>", -5.76309905181262),
-                                    ("mondaythis <cycle>", -6.168564159920785),
-                                    ("tomorrowintersect", -5.25227342804663),
-                                    ("intersectin|during the <part-of-day>", -4.915801191425417),
+                                     -5.761002614986093),
+                                    ("weekmonth", -5.250176991220102),
+                                    ("tuesdayat <time-of-day>", -5.761002614986093),
+                                    ("mondaythis <cycle>", -6.166467723094256),
+                                    ("tomorrowintersect", -5.250176991220102),
+                                    ("intersectin|during the <part-of-day>", -4.913704754598889),
                                     ("<time> <part-of-day>absorption of article before time",
-                                     -5.76309905181262),
-                                    ("the <cycle> of <time>October", -5.76309905181262),
+                                     -5.761002614986093),
+                                    ("the <cycle> of <time>October", -5.761002614986093),
                                     ("revolution dayabsorption of article before time",
-                                     -5.76309905181262),
+                                     -5.761002614986093),
                                     ("thursday<datetime> - <datetime> (interval)",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("Septemberabsorption of article before time",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("absorption of article before time<time-of-day> am|pm",
-                                     -5.76309905181262),
-                                    ("tonightabsorption of article before time", -5.47541697936084),
-                                    ("todayabsorption of article before time", -5.76309905181262),
+                                     -5.761002614986093),
+                                    ("tonightabsorption of article before time",
+                                     -5.473320542534312),
+                                    ("todayabsorption of article before time", -5.761002614986093),
                                     ("at <time-of-day>absorption of article before time",
-                                     -4.664486763144511),
+                                     -4.662390326317983),
                                     ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -6.168564159920785),
-                                    ("absorption of article before timeyear", -6.168564159920785),
-                                    ("tuesday<time-of-day> am|pm (verbose)", -5.76309905181262),
-                                    ("revolution dayLast year", -5.76309905181262),
-                                    ("at <time-of-day>intersect", -5.25227342804663),
+                                     -5.761002614986093),
+                                    ("absorption of article before timeyear", -6.166467723094256),
+                                    ("tuesday<time-of-day> am|pm (verbose)", -5.761002614986093),
+                                    ("revolution dayLast year", -5.761002614986093),
+                                    ("at <time-of-day>intersect", -5.250176991220102),
                                     ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("absorption of article before timeintersect by ','",
-                                     -6.168564159920785),
-                                    ("dayminute", -3.9172723613142897),
-                                    ("intersectyear", -5.069951871252675),
-                                    ("hh:mmabsorption of article before time", -5.47541697936084),
+                                     -6.166467723094256),
+                                    ("dayminute", -3.815092465930779),
+                                    ("intersectyear", -5.067855434426147),
+                                    ("hh:mmabsorption of article before time", -5.473320542534312),
                                     ("<datetime> - <datetime> (interval)tomorrow",
-                                     -6.168564159920785),
-                                    ("minuteday", -2.687324070585093),
+                                     -6.166467723094256),
+                                    ("minuteday", -2.685227633758565),
                                     ("absorption of , after named dayintersect",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("the <cycle> of <time>absorption of article before time",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("<ordinal> <cycle> of <time>absorption of article before time",
-                                     -6.168564159920785),
-                                    ("at <time-of-day>intersect by ','", -6.168564159920785),
-                                    ("Octoberyear", -4.915801191425417),
+                                     -6.166467723094256),
+                                    ("at <time-of-day>intersect by ','", -6.166467723094256),
+                                    ("Octoberyear", -4.913704754598889),
                                     ("absorption of , after named dayintersect by ','",
-                                     -5.76309905181262),
+                                     -5.761002614986093),
                                     ("this <cycle>hh(:mm) - <time-of-day> am|pm",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("intersectabsorption of article before time",
-                                     -4.5591262474866845),
+                                     -4.557029810660157),
                                     ("after tomorrowabsorption of article before time",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("saturdayabsorption of article before time",
-                                     -5.76309905181262),
-                                    ("tuesdaythe <day-of-month> (non ordinal)", -6.168564159920785),
+                                     -5.761002614986093),
+                                    ("tuesdaythe <day-of-month> (non ordinal)", -6.166467723094256),
                                     ("at <time-of-day>absorption of , after named day",
-                                     -6.168564159920785),
-                                    ("tomorrowin|during the <part-of-day>", -5.069951871252675),
+                                     -6.166467723094256),
+                                    ("tomorrowin|during the <part-of-day>", -5.067855434426147),
                                     ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -3.9172723613142897),
-                                    ("year<time-of-day> am|pm", -6.168564159920785),
-                                    ("Septemberyear", -5.25227342804663),
+                                     -3.9151759244877615),
+                                    ("year<time-of-day> am|pm", -6.166467723094256),
+                                    ("Septemberyear", -5.250176991220102),
                                     ("christmasabsorption of article before time",
-                                     -6.168564159920785),
-                                    ("dayweek", -5.069951871252675),
-                                    ("weekyear", -5.25227342804663),
-                                    ("hh:mmin|during the <part-of-day>", -5.47541697936084),
+                                     -6.166467723094256),
+                                    ("dayweek", -5.067855434426147),
+                                    ("weekyear", -5.250176991220102),
+                                    ("hh:mmin|during the <part-of-day>", -5.473320542534312),
                                     ("the <day-of-month> (non ordinal)absorption of article before time",
-                                     -5.76309905181262),
-                                    ("tomorrowat <time-of-day>", -6.168564159920785),
-                                    ("tuesdayintersect", -4.5591262474866845),
+                                     -5.761002614986093),
+                                    ("tomorrowat <time-of-day>", -6.166467723094256),
+                                    ("tuesdayintersect", -4.557029810660157),
                                     ("tomorrowbetween <time-of-day> and <time-of-day> (interval)",
-                                     -6.168564159920785),
-                                    ("at <time-of-day>tomorrow", -5.47541697936084),
-                                    ("tomorrow<time-of-day> am|pm", -5.76309905181262),
+                                     -6.166467723094256),
+                                    ("at <time-of-day>tomorrow", -5.473320542534312),
+                                    ("tomorrow<time-of-day> am|pm", -5.761002614986093),
                                     ("last <cycle> of <time>absorption of article before time",
-                                     -5.76309905181262),
+                                     -5.761002614986093),
                                     ("in|during the <part-of-day>at <time-of-day>",
-                                     -6.168564159920785),
+                                     -6.166467723094256),
                                     ("in|during the <part-of-day>absorption of article before time",
-                                     -6.168564159920785),
-                                    ("intersectFebruary", -6.168564159920785),
-                                    ("<datetime> - <datetime> (interval)July", -6.168564159920785),
+                                     -6.166467723094256),
+                                    ("intersectFebruary", -6.166467723094256),
+                                    ("<datetime> - <datetime> (interval)July", -6.166467723094256),
                                     ("tomorrowabsorption of article before time",
-                                     -4.915801191425417),
-                                    ("yearminute", -6.168564159920785),
+                                     -4.913704754598889),
+                                    ("yearminute", -6.166467723094256),
                                     ("Mother's Dayabsorption of article before time",
-                                     -6.168564159920785)],
-                               n = 378},
+                                     -6.166467723094256)],
+                               n = 380},
                    koData =
-                     ClassData{prior = -1.0645374417836073, unseen = -6.393590753950631,
+                     ClassData{prior = -1.1021334190666885, unseen = -6.349138991379798,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourday", -5.293304824724492),
+                                   [("hourday", -5.654242029096065),
                                     ("thursdayabsorption of article before time",
-                                     -5.293304824724492),
-                                    ("dayhour", -3.6193283911528207),
-                                    ("daymonth", -2.520716102484711),
-                                    ("hourquarter", -5.698769932832657),
-                                    ("monthday", -5.293304824724492),
-                                    ("absorption of article before timedd/mm", -5.698769932832657),
-                                    ("monthyear", -3.3473946756691793),
+                                     -5.2487769209879005),
+                                    ("dayhour", -3.574800487416229),
+                                    ("daymonth", -2.563199575737749),
+                                    ("hourquarter", -5.654242029096065),
+                                    ("absorption of article before timedd/mm", -5.654242029096065),
+                                    ("monthyear", -3.302866771932587),
                                     ("absorption of article before timeDecember",
-                                     -5.698769932832657),
-                                    ("tuesdayFebruary", -5.698769932832657),
-                                    ("wednesdayintersect", -5.698769932832657),
-                                    ("intersecthh:mm", -5.698769932832657),
-                                    ("hh:mmuntil <time>", -5.0056227522727115),
-                                    ("houryear", -5.293304824724492),
-                                    ("absorption of article before time<day-of-month> (ordinal or number) <named-month>",
-                                     -5.698769932832657),
-                                    ("intersect by 'of', 'from', 'syear", -4.782479200958502),
-                                    ("absorption of article before timeJuly", -5.293304824724492),
-                                    ("thursdayafter <time-of-day>", -4.600157644164547),
-                                    ("Marchyear", -4.194692536056383),
-                                    ("after tomorrowat <time-of-day>", -5.698769932832657),
+                                     -5.654242029096065),
+                                    ("tuesdayFebruary", -5.654242029096065),
+                                    ("wednesdayintersect", -5.654242029096065),
+                                    ("intersecthh:mm", -5.654242029096065),
+                                    ("hh:mmuntil <time>", -4.96109484853612),
+                                    ("houryear", -5.2487769209879005),
+                                    ("hournograin", -4.401479060600697),
+                                    ("intersect by 'of', 'from', 'syear", -4.73795129722191),
+                                    ("absorption of article before timeJuly", -5.2487769209879005),
+                                    ("thursdayafter <time-of-day>", -4.555629740427955),
+                                    ("Marchyear", -4.1501646323197905),
+                                    ("after tomorrowat <time-of-day>", -5.654242029096065),
                                     ("absorption of article before timeOctober",
-                                     -5.293304824724492),
-                                    ("<time-of-day> am|pmuntil <time>", -5.293304824724492),
+                                     -5.2487769209879005),
+                                    ("<time-of-day> am|pmuntil <time>", -5.2487769209879005),
                                     ("wednesdayabsorption of article before time",
-                                     -5.293304824724492),
-                                    ("<named-month> <day-of-month> (ordinal or number)July",
-                                     -5.698769932832657),
-                                    ("intersect by ','<time-of-day> am|pm", -5.698769932832657),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.698769932832657),
+                                     -5.2487769209879005),
+                                    ("intersect by ','<time-of-day> am|pm", -5.654242029096065),
                                     ("absorption of article before timethe <cycle> of <time>",
-                                     -5.698769932832657),
+                                     -5.654242029096065),
                                     ("intersect by 'of', 'from', 'sabsorption of article before time",
-                                     -5.698769932832657),
-                                    ("intersect by ','hh:mm", -4.600157644164547),
-                                    ("mondayabsorption of article before time", -5.698769932832657),
-                                    ("hourmonth", -3.300874660034286),
-                                    ("todayat <time-of-day>", -5.698769932832657),
+                                     -5.654242029096065),
+                                    ("intersect by ','hh:mm", -4.555629740427955),
+                                    ("mondayabsorption of article before time", -5.654242029096065),
+                                    ("hourmonth", -3.2563467562976944),
+                                    ("todayat <time-of-day>", -5.654242029096065),
                                     ("absorption of article before timeabsorption of article before time",
-                                     -3.6193283911528207),
-                                    ("dayday", -3.396184839838611),
-                                    ("dayquarter", -5.698769932832657),
+                                     -3.6393390085538),
+                                    ("dayday", -3.351656936102019),
+                                    ("dayquarter", -5.654242029096065),
                                     ("<time-of-day> - <time-of-day> (interval)absorption of article before time",
-                                     -5.698769932832657),
-                                    ("thursdayat <time-of-day>", -5.293304824724492),
-                                    ("week-endintersect", -5.698769932832657),
+                                     -5.654242029096065),
+                                    ("thursdayat <time-of-day>", -5.2487769209879005),
+                                    ("week-endintersect", -5.654242029096065),
                                     ("<datetime> - <datetime> (interval)absorption of article before time",
-                                     -5.293304824724492),
-                                    ("dayyear", -3.1730412885244013),
-                                    ("thursdaydd/mm", -5.698769932832657),
-                                    ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.698769932832657),
-                                    ("tuesdayabsorption of article before time",
-                                     -5.0056227522727115),
-                                    ("tuesdayintersect by 'of', 'from', 's", -5.293304824724492),
-                                    ("monthminute", -5.293304824724492),
-                                    ("<time-of-day> am|pmtomorrow", -5.698769932832657),
-                                    ("<named-month> <day-of-month> (ordinal or number)August",
-                                     -5.698769932832657),
-                                    ("tuesdayMarch", -4.782479200958502),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.698769932832657),
-                                    ("thursdayhh:mm", -5.293304824724492),
-                                    ("after <time-of-day>December", -5.698769932832657),
-                                    ("for <duration> from <time>December", -5.698769932832657),
-                                    ("thursdayintersect", -5.293304824724492),
-                                    ("Aprilyear", -4.600157644164547),
-                                    ("sundayintersect by 'of', 'from', 's", -5.698769932832657),
-                                    ("tuesdayJanuary", -5.698769932832657),
+                                     -5.2487769209879005),
+                                    ("dayyear", -3.1285133847878095),
+                                    ("thursdaydd/mm", -5.654242029096065),
+                                    ("tuesdayabsorption of article before time", -4.96109484853612),
+                                    ("tuesdayintersect by 'of', 'from', 's", -5.2487769209879005),
+                                    ("monthminute", -5.2487769209879005),
+                                    ("<time-of-day> am|pmtomorrow", -5.654242029096065),
+                                    ("tuesdayMarch", -4.73795129722191),
+                                    ("thursdayhh:mm", -5.2487769209879005),
+                                    ("after <time-of-day>December", -5.654242029096065),
+                                    ("for <duration> from <time>December", -5.654242029096065),
+                                    ("thursdayintersect", -5.2487769209879005),
+                                    ("Aprilyear", -4.555629740427955),
+                                    ("sundayintersect by 'of', 'from', 's", -5.654242029096065),
+                                    ("tuesdayJanuary", -5.654242029096065),
                                     ("absorption of article before timehh(:mm) - <time-of-day> am|pm",
-                                     -5.698769932832657),
-                                    ("tuesdayOctober", -5.293304824724492),
+                                     -5.654242029096065),
+                                    ("tuesdayOctober", -5.2487769209879005),
                                     ("<day-of-month> (ordinal or number) of <named-month>year",
-                                     -5.0056227522727115),
+                                     -4.96109484853612),
                                     ("absorption of article before timeFebruary",
-                                     -5.293304824724492),
+                                     -5.2487769209879005),
                                     ("tuesday<day-of-month> (ordinal or number) <named-month>",
-                                     -5.698769932832657),
-                                    ("weekmonth", -4.782479200958502),
-                                    ("daysecond", -3.8269677559310655),
-                                    ("sundayabsorption of article before time",
-                                     -5.0056227522727115),
-                                    ("todayabsorption of article before time", -5.698769932832657),
-                                    ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.698769932832657),
-                                    ("yearmonth", -5.293304824724492),
-                                    ("absorption of article before timeyear", -4.600157644164547),
-                                    ("dayminute", -3.907010463604602),
-                                    ("intersectyear", -3.907010463604602),
-                                    ("hh:mmabsorption of article before time", -5.293304824724492),
-                                    ("thursdayApril", -5.698769932832657),
-                                    ("minuteday", -4.782479200958502),
+                                     -5.654242029096065),
+                                    ("weekmonth", -4.73795129722191),
+                                    ("minutenograin", -4.96109484853612),
+                                    ("sundayabsorption of article before time", -4.96109484853612),
+                                    ("todayabsorption of article before time", -5.654242029096065),
+                                    ("yearmonth", -5.654242029096065),
+                                    ("absorption of article before timeyear", -4.555629740427955),
+                                    ("dayminute", -4.044804116661965),
+                                    ("intersectyear", -3.8624825598680097),
+                                    ("hh:mmabsorption of article before time", -5.2487769209879005),
+                                    ("thursdayApril", -5.654242029096065),
+                                    ("minuteday", -4.73795129722191),
                                     ("absorption of , after named dayintersect",
-                                     -5.698769932832657),
+                                     -5.654242029096065),
                                     ("the <cycle> of <time>absorption of article before time",
-                                     -5.0056227522727115),
-                                    ("tuesdayApril", -5.293304824724492),
-                                    ("Octoberyear", -5.698769932832657),
+                                     -4.96109484853612),
+                                    ("tuesdayApril", -5.2487769209879005),
+                                    ("Octoberyear", -5.654242029096065),
                                     ("absorption of , after named dayintersect by ','",
-                                     -5.698769932832657),
-                                    ("yearhh:mm", -5.698769932832657),
+                                     -5.654242029096065),
+                                    ("yearhh:mm", -5.654242029096065),
                                     ("this <cycle>hh(:mm) - <time-of-day> am|pm",
-                                     -5.698769932832657),
+                                     -5.654242029096065),
                                     ("intersectabsorption of article before time",
-                                     -4.600157644164547),
+                                     -4.555629740427955),
                                     ("tuesday<day-of-month> (ordinal or number) of <named-month>",
-                                     -5.698769932832657),
+                                     -5.654242029096065),
                                     ("after tomorrowabsorption of article before time",
-                                     -5.698769932832657),
+                                     -5.654242029096065),
                                     ("absorption of article before timeuntil <time>",
-                                     -4.312475571712766),
-                                    ("hoursecond", -4.446006964337289),
+                                     -4.267947667976174),
                                     ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -5.0056227522727115),
-                                    ("<duration> after <time>December", -5.698769932832657),
-                                    ("intersectintersect", -5.698769932832657),
-                                    ("tuesdaytuesday", -5.698769932832657),
+                                     -4.96109484853612),
+                                    ("<duration> after <time>December", -5.654242029096065),
+                                    ("intersectintersect", -5.654242029096065),
+                                    ("tuesdaytuesday", -5.654242029096065),
                                     ("the <day-of-month> (non ordinal)absorption of article before time",
-                                     -3.907010463604602),
-                                    ("at <time-of-day>February", -5.698769932832657),
+                                     -3.94949393685764),
+                                    ("at <time-of-day>February", -5.654242029096065),
                                     ("week-endabsorption of article before time",
-                                     -4.782479200958502),
-                                    ("thursdayOctober", -5.293304824724492),
-                                    ("tomorrowat <time-of-day>", -5.698769932832657),
-                                    ("tuesdayintersect", -3.907010463604602),
-                                    ("minutesecond", -5.0056227522727115),
+                                     -4.73795129722191),
+                                    ("thursdayOctober", -5.2487769209879005),
+                                    ("tomorrowat <time-of-day>", -5.654242029096065),
+                                    ("tuesdayintersect", -3.8624825598680097),
+                                    ("daynograin", -3.7824398521944733),
                                     ("tomorrowbetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.698769932832657),
-                                    ("tuesdayMay", -5.698769932832657),
+                                     -5.654242029096065),
+                                    ("tuesdayMay", -5.654242029096065),
                                     ("after <time-of-day>absorption of article before time",
-                                     -5.698769932832657),
+                                     -5.654242029096065),
                                     ("<time-of-day> - <time-of-day> (interval)July",
-                                     -5.293304824724492),
-                                    ("sundayintersect", -5.698769932832657),
-                                    ("thursdayintersect by 'of', 'from', 's", -5.698769932832657),
+                                     -5.2487769209879005),
+                                    ("sundayintersect", -5.654242029096065),
+                                    ("thursdayintersect by 'of', 'from', 's", -5.654242029096065),
                                     ("tomorrowabsorption of article before time",
-                                     -5.698769932832657),
-                                    ("absorption of article before timeAugust", -5.698769932832657),
-                                    ("yearminute", -5.698769932832657)],
-                               n = 199}}),
+                                     -5.654242029096065),
+                                    ("yearminute", -5.654242029096065)],
+                               n = 189}}),
        ("quarter to|past <integer> (hour-of-day)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -1079,15 +1062,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("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}}),
        ("this <day-of-week>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -1111,114 +1085,114 @@
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.5108256237659907),
-                                    ("negative numbers", -0.916290731874155)],
-                               n = 3}}),
+                                   [("integer (numeric)", -0.6931471805599453),
+                                    ("negative numbers", -0.6931471805599453)],
+                               n = 2}}),
        ("absorption of article before time",
         Classifier{okData =
-                     ClassData{prior = -0.24251310408386942, unseen = -6.54965074223381,
+                     ClassData{prior = -0.2325627732307014, unseen = -6.551080335043404,
                                likelihoods =
                                  HashMap.fromList
-                                   [("midnight", -5.855071922202427),
-                                    ("last <cycle> <time>'s'", -3.909161773147114),
-                                    ("week", -3.657847344866208),
-                                    ("Father's Day", -5.449606814094262),
-                                    ("thursday", -5.449606814094262), ("fall", -5.449606814094262),
+                                   [("midnight", -5.856503561673865),
+                                    ("last <cycle> <time>'s'", -3.9105934126185518),
+                                    ("week", -3.6592789843376456),
+                                    ("Father's Day", -5.4510384535657),
+                                    ("thursday", -5.4510384535657), ("fall", -5.4510384535657),
                                     ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.468777561082536),
-                                    ("<time> <part-of-day>", -4.2456340097683265),
-                                    ("absorption of , after named day", -5.449606814094262),
-                                    ("revolution day", -4.756459633534318),
-                                    ("October", -4.150323829964002),
-                                    ("wednesday", -5.855071922202427), ("July", -5.449606814094262),
-                                    ("<ordinal> quarter", -5.855071922202427),
-                                    ("saturday", -5.161924741642482),
-                                    ("Last year", -5.161924741642482),
-                                    ("intersect", -2.810549484479004),
-                                    ("half after|past <integer> (hour-of-day)", -5.855071922202427),
-                                    ("<ordinal> <cycle> of <time>", -5.855071922202427),
-                                    ("next <cycle>", -4.468777561082536),
-                                    ("the <cycle> of <time>", -4.602308953707059),
-                                    ("<ordinal> quarter <year>", -5.855071922202427),
-                                    ("second", -4.938781190328272), ("monday", -5.449606814094262),
-                                    ("valentine's day", -5.449606814094262),
+                                     -4.470209200553974),
+                                    ("<time> <part-of-day>", -4.247065649239764),
+                                    ("absorption of , after named day", -5.4510384535657),
+                                    ("revolution day", -4.757891273005756),
+                                    ("October", -4.1517554694354395),
+                                    ("wednesday", -5.856503561673865), ("July", -5.4510384535657),
+                                    ("<ordinal> quarter", -5.856503561673865),
+                                    ("saturday", -5.163356381113919),
+                                    ("Last year", -5.163356381113919),
+                                    ("intersect", -2.8119811239504418),
+                                    ("half after|past <integer> (hour-of-day)", -5.856503561673865),
+                                    ("<ordinal> <cycle> of <time>", -5.856503561673865),
+                                    ("next <cycle>", -4.470209200553974),
+                                    ("the <cycle> of <time>", -4.603740593178497),
+                                    ("<ordinal> quarter <year>", -5.856503561673865),
+                                    ("second", -4.94021282979971), ("monday", -5.4510384535657),
+                                    ("valentine's day", -5.4510384535657),
                                     ("<day-of-month> (ordinal or number) of <named-month>",
-                                     -5.855071922202427),
-                                    ("this|last|next <cycle>", -4.2456340097683265),
-                                    ("Mother's Day", -5.449606814094262),
-                                    ("friday", -5.449606814094262),
-                                    ("<time-of-day> am|pm (verbose)", -5.161924741642482),
-                                    ("<time> after next", -5.855071922202427),
-                                    ("day", -1.8847800086503053),
-                                    ("next <day-of-week>", -4.938781190328272),
-                                    ("afternoon", -4.150323829964002),
-                                    ("February", -4.938781190328272),
-                                    ("quarter", -4.756459633534318),
-                                    ("this <cycle>", -5.855071922202427),
-                                    ("sunday", -5.855071922202427),
-                                    ("time-of-day (latent)", -2.9647001643062625),
-                                    ("year", -3.5524868292083815),
-                                    ("<time-of-day> am|pm", -3.457176649404057),
-                                    ("<duration> after <time>", -5.161924741642482),
-                                    ("hh:mm", -4.756459633534318),
-                                    ("intersect by ','", -5.161924741642482),
-                                    ("intersect by 'of', 'from', 's", -3.909161773147114),
-                                    ("last <time>", -4.468777561082536),
-                                    ("EOM|End of month", -5.855071922202427),
-                                    ("March", -4.602308953707059),
-                                    ("<day-of-month> (ordinal)", -4.468777561082536),
-                                    ("noon", -5.449606814094262), ("hour", -1.9430489167742813),
-                                    ("evening", -4.468777561082536), ("month", -2.937301190118148),
-                                    ("EOD|End of day", -5.855071922202427),
-                                    ("next <time>", -4.756459633534318),
-                                    ("christmas", -5.449606814094262),
-                                    ("next n <cycle>", -4.602308953707059),
-                                    ("tuesday", -5.161924741642482),
-                                    ("halloween day", -5.855071922202427),
-                                    ("winter", -5.855071922202427),
-                                    ("last n <cycle>", -4.756459633534318),
-                                    ("last <cycle> of <time>", -4.602308953707059),
-                                    ("minute", -3.051711541295892),
-                                    ("week-end", -5.449606814094262),
-                                    ("summer", -5.855071922202427), ("August", -5.855071922202427)],
+                                     -5.856503561673865),
+                                    ("this|last|next <cycle>", -4.247065649239764),
+                                    ("Mother's Day", -5.4510384535657),
+                                    ("friday", -5.4510384535657),
+                                    ("<time-of-day> am|pm (verbose)", -5.163356381113919),
+                                    ("<time> after next", -5.856503561673865),
+                                    ("day", -1.8862116481217432),
+                                    ("next <day-of-week>", -4.94021282979971),
+                                    ("afternoon", -4.1517554694354395),
+                                    ("February", -4.94021282979971),
+                                    ("quarter", -4.757891273005756),
+                                    ("this <cycle>", -5.856503561673865),
+                                    ("sunday", -5.856503561673865),
+                                    ("time-of-day (latent)", -2.9661318037777002),
+                                    ("year", -3.5539184686798193),
+                                    ("<time-of-day> am|pm", -3.4586082888754945),
+                                    ("<duration> after <time>", -5.163356381113919),
+                                    ("hh:mm", -4.757891273005756),
+                                    ("intersect by ','", -5.163356381113919),
+                                    ("intersect by 'of', 'from', 's", -3.9105934126185518),
+                                    ("last <time>", -4.470209200553974),
+                                    ("EOM|End of month", -5.856503561673865),
+                                    ("March", -4.603740593178497),
+                                    ("<day-of-month> (ordinal)", -4.470209200553974),
+                                    ("noon", -5.4510384535657), ("hour", -1.9444805562457188),
+                                    ("evening", -4.470209200553974), ("month", -2.938732829589586),
+                                    ("EOD|End of day", -5.856503561673865),
+                                    ("next <time>", -4.757891273005756),
+                                    ("christmas", -5.4510384535657),
+                                    ("next n <cycle>", -4.603740593178497),
+                                    ("tuesday", -5.163356381113919),
+                                    ("halloween day", -5.856503561673865),
+                                    ("winter", -5.856503561673865),
+                                    ("last n <cycle>", -4.757891273005756),
+                                    ("last <cycle> of <time>", -4.603740593178497),
+                                    ("minute", -3.05314318076733), ("week-end", -5.4510384535657),
+                                    ("summer", -5.856503561673865), ("August", -5.856503561673865)],
                                n = 317},
                    koData =
-                     ClassData{prior = -1.5355067593065663, unseen = -5.521460917862246,
+                     ClassData{prior = -1.5726239393113841, unseen = -5.493061443340548,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -3.7256934272366524),
-                                    ("<duration> hence|ago", -4.824305715904762),
+                                   [("week", -3.6971782569286313),
+                                    ("<duration> hence|ago", -4.795790545596741),
                                     ("<named-month> <day-of-month> (ordinal or number)",
-                                     -4.824305715904762),
+                                     -4.795790545596741),
                                     ("<day-of-month> (ordinal or number) <named-month>",
-                                     -3.0325462466767075),
-                                    ("September", -4.824305715904762),
-                                    ("October", -4.418840607796598),
-                                    ("<ordinal> quarter", -4.824305715904762),
-                                    ("intersect", -3.214867803470662),
-                                    ("the <cycle> of <time>", -3.9080149840306073),
-                                    ("year (latent)", -4.418840607796598),
-                                    ("second", -3.3202283191284883), ("April", -4.824305715904762),
-                                    ("this|last|next <cycle>", -4.824305715904762),
-                                    ("day", -2.1501570664782337), ("afternoon", -4.824305715904762),
-                                    ("quarter", -4.1311585353448175),
-                                    ("time-of-day (latent)", -2.472930458741285),
-                                    ("year", -4.418840607796598), ("hh:mm", -4.824305715904762),
-                                    ("until <time>", -3.3202283191284883),
-                                    ("intersect by 'of', 'from', 's", -4.824305715904762),
-                                    ("March", -4.418840607796598),
-                                    ("<day-of-month> (ordinal)", -2.952503539003171),
-                                    ("hour", -2.4264104431063918), ("month", -2.7448641742249267),
-                                    ("last <cycle>", -4.1311585353448175),
-                                    ("<datetime> - <datetime> (interval)", -4.824305715904762),
+                                     -3.186352633162641),
+                                    ("September", -4.795790545596741),
+                                    ("October", -4.390325437488577),
+                                    ("<ordinal> quarter", -4.795790545596741),
+                                    ("intersect", -3.186352633162641),
+                                    ("the <cycle> of <time>", -3.879499813722586),
+                                    ("year (latent)", -4.795790545596741),
+                                    ("April", -4.795790545596741),
+                                    ("this|last|next <cycle>", -4.795790545596741),
+                                    ("day", -2.230841188135204), ("afternoon", -4.795790545596741),
+                                    ("quarter", -4.102643365036796),
+                                    ("time-of-day (latent)", -2.4444152884332633),
+                                    ("year", -4.795790545596741), ("hh:mm", -4.795790545596741),
+                                    ("nograin", -3.291713148820467),
+                                    ("until <time>", -3.291713148820467),
+                                    ("intersect by 'of', 'from', 's", -4.795790545596741),
+                                    ("March", -4.390325437488577),
+                                    ("<day-of-month> (ordinal)", -3.004031076368686),
+                                    ("hour", -2.3978952727983707), ("month", -2.716349003916905),
+                                    ("last <cycle>", -4.102643365036796),
+                                    ("<datetime> - <datetime> (interval)", -4.795790545596741),
                                     ("<time-of-day> - <time-of-day> (interval)",
-                                     -4.418840607796598),
-                                    ("minute", -3.7256934272366524),
-                                    ("August", -4.418840607796598)],
-                               n = 87}}),
+                                     -4.390325437488577),
+                                    ("minute", -3.6971782569286313),
+                                    ("August", -4.390325437488577)],
+                               n = 83}}),
        ("dd/mm/yyyy",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -1289,13 +1263,13 @@
                                n = 3}}),
        ("the <day-of-month> (non ordinal)",
         Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -1.791759469228055,
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
                                n = 4},
                    koData =
-                     ClassData{prior = -0.587786664902119, unseen = -1.9459101490553135,
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 5}}),
+                               n = 4}}),
        ("April",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.890371757896165,
@@ -1637,18 +1611,18 @@
                                n = 2}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.4900224961362275,
-                               unseen = -4.2626798770413155,
+                     ClassData{prior = -0.43286408229627876, unseen = -4.31748811353631,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -7.410797215372185e-2),
-                                    ("number (0..19, 20, 30..90)", -2.639057329615259)],
-                               n = 68},
+                                   [("integer (numeric)", -6.995858860691034e-2),
+                                    ("number (0..19, 20, 30..90)", -2.6946271807700692)],
+                               n = 72},
                    koData =
-                     ClassData{prior = -0.9483300856187717, unseen = -3.828641396489095,
+                     ClassData{prior = -1.0459685551826876,
+                               unseen = -3.7376696182833684,
                                likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -2.247285585205863e-2)],
-                               n = 43}}),
+                                 HashMap.fromList [("integer (numeric)", -2.469261259037152e-2)],
+                               n = 39}}),
        ("three quarters of an hour",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
@@ -2039,21 +2013,20 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> (ordinal)",
         Classifier{okData =
-                     ClassData{prior = -0.6418538861723948,
-                               unseen = -2.5649493574615367,
+                     ClassData{prior = -0.587786664902119, unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
                                    [("ordinals (1st..12th, 20th, 30th..90th)", -1.3862943611198906),
                                     ("ordinal (digits)", -0.2876820724517809)],
                                n = 10},
                    koData =
-                     ClassData{prior = -0.7472144018302211,
-                               unseen = -2.4849066497880004,
+                     ClassData{prior = -0.8109302162163288,
+                               unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (1st..12th, 20th, 30th..90th)", -0.3184537311185346),
-                                    ("ordinal (digits)", -1.2992829841302609)],
-                               n = 9}}),
+                                   [("ordinals (1st..12th, 20th, 30th..90th)", -0.2231435513142097),
+                                    ("ordinal (digits)", -1.6094379124341003)],
+                               n = 8}}),
        ("noon",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -2338,42 +2311,41 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -1.3545456628053103,
-                               unseen = -3.4339872044851463,
+                     ClassData{prior = -1.0360919316867756,
+                               unseen = -3.6109179126442243,
                                likelihoods =
                                  HashMap.fromList
                                    [("<time-of-day> am|pmabsorption of article before time",
-                                     -2.70805020110221),
-                                    ("minuteminute", -1.791759469228055),
-                                    ("hh:mmhh:mm", -1.791759469228055),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -1.791759469228055),
+                                     -2.890371757896165),
+                                    ("hh:mmtime-of-day (latent)", -2.1972245773362196),
+                                    ("minuteminute", -1.9740810260220096),
+                                    ("hh:mmhh:mm", -1.9740810260220096),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.890371757896165),
+                                    ("hourhour", -1.9740810260220096),
+                                    ("minutehour", -2.1972245773362196),
                                     ("<time-of-day> am|pm<time-of-day> am|pm",
-                                     -2.3025850929940455)],
-                               n = 8},
+                                     -2.4849066497880004)],
+                               n = 11},
                    koData =
-                     ClassData{prior = -0.29849298855599654,
-                               unseen = -4.110873864173311,
+                     ClassData{prior = -0.4382549309311553, unseen = -4.007333185232471,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
-                                    ("hh:mm<time-of-day> am|pm", -2.995732273553991),
-                                    ("minuteminute", -2.4849066497880004),
+                                   [("hh:mmtime-of-day (latent)", -2.043073897508961),
+                                    ("hh:mm<time-of-day> am|pm", -2.890371757896165),
+                                    ("minuteminute", -2.379546134130174),
                                     ("absorption of article before timeabsorption of article before time",
-                                     -3.4011973816621555),
-                                    ("hh:mmhh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.995732273553991),
-                                    ("hourhour", -2.0149030205422647),
-                                    ("about <time-of-day>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("minutehour", -1.529395204760564),
+                                     -3.295836866004329),
+                                    ("hh:mmhh:mm", -2.6026896854443837),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.890371757896165),
+                                    ("hourhour", -1.9095425048844386),
+                                    ("about <time-of-day>time-of-day (latent)", -3.295836866004329),
+                                    ("minutehour", -1.6863989535702288),
                                     ("absorption of article before timetime-of-day (latent)",
-                                     -2.995732273553991),
-                                    ("absorption of article before timehh:mm", -3.4011973816621555),
-                                    ("about <time-of-day><time-of-day> am|pm", -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm",
-                                     -3.4011973816621555)],
-                               n = 23}}),
+                                     -2.890371757896165),
+                                    ("absorption of article before timehh:mm", -3.295836866004329),
+                                    ("about <time-of-day><time-of-day> am|pm", -3.295836866004329),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.295836866004329)],
+                               n = 20}}),
        ("<number><grain> (one word)",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
diff --git a/Duckling/Ranking/Classifiers/EN_CA.hs b/Duckling/Ranking/Classifiers/EN_CA.hs
--- a/Duckling/Ranking/Classifiers/EN_CA.hs
+++ b/Duckling/Ranking/Classifiers/EN_CA.hs
@@ -30,3310 +30,4261 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> to|till|before <hour-of-day>",
         Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = -8.961215868968717e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
-                   koData =
-                     ClassData{prior = -2.456735772821304, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5818290513461541, unseen = -5.768320995793772,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 318},
-                   koData =
-                     ClassData{prior = -0.818427494994547, unseen = -5.53338948872752,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 251}}),
-       ("<year> (bc|ad)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = -5.406722127027582e-2,
-                               unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -2.9444389791664407,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year", -1.5040773967762742),
-                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
-                               n = 1}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6739764335716716),
-                                    ("dayday", -1.1631508098056809),
-                                    ("day (grain)yesterday", -1.6739764335716716)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.6739764335716716),
-                                    ("year (grain)Christmas", -2.0794415416798357),
-                                    ("dayday", -2.0794415416798357),
-                                    ("day (grain)intersect", -1.6739764335716716),
-                                    ("day (grain)Easter Sunday", -2.0794415416798357),
-                                    ("yearday", -2.0794415416798357)],
-                               n = 4}}),
-       ("Easter Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Navaratri",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Shemini Atzeret",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ramadan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lazarus Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect 2 numbers",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("compose by multiplicationinteger (0..19)",
-                                     -0.2231435513142097)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
-                               n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("from|since|after <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.540445040947149, unseen = -4.248495242049359,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal or number) <named-month>",
-                                     -3.5409593240373143),
-                                    ("July", -3.5409593240373143),
-                                    ("year (latent)", -3.1354942159291497),
-                                    ("day", -3.1354942159291497),
-                                    ("time-of-day (latent)", -2.624668592163159),
-                                    ("year", -3.1354942159291497),
-                                    ("<time-of-day> am|pm", -2.624668592163159),
-                                    ("hh:mm", -2.624668592163159),
-                                    ("<day-of-month> (ordinal)", -3.5409593240373143),
-                                    ("hour", -2.03688192726104), ("month", -3.1354942159291497),
-                                    ("minute", -2.624668592163159),
-                                    ("August", -3.5409593240373143)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.2411620568168881, unseen = -5.111987788356543,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -4.007333185232471),
-                                    ("week", -4.412798293340635),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.412798293340635),
-                                    ("today", -4.412798293340635),
-                                    ("intersect", -2.540996116439044),
-                                    ("<time> for <duration>", -4.412798293340635),
-                                    ("second", -4.412798293340635), ("now", -3.71965111278069),
-                                    ("tomorrow", -4.007333185232471),
-                                    ("this|last|next <cycle>", -4.412798293340635),
-                                    ("day", -1.927891643552635),
-                                    ("time-of-day (latent)", -2.6210388241125804),
-                                    ("<time-of-day> am|pm", -4.007333185232471),
-                                    ("nograin", -3.71965111278069),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.412798293340635),
-                                    ("<day-of-month> (ordinal)", -4.007333185232471),
-                                    ("Easter Sunday", -4.412798293340635),
-                                    ("Christmas", -3.71965111278069), ("hour", -2.3978952727983707),
-                                    ("month", -4.412798293340635),
-                                    ("<datetime> - <datetime> (interval)", -3.1600353248452673),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.908720896564361),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -4.007333185232471),
-                                    ("minute", -1.927891643552635),
-                                    ("right now", -4.412798293340635),
-                                    ("<month> dd-dd (interval)", -3.71965111278069),
-                                    ("part of days", -4.412798293340635),
-                                    ("dd-dd <month> (interval)", -4.007333185232471)],
-                               n = 66}}),
-       ("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}}),
-       ("<ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.268683541318364),
-                                    ("daymonth", -2.268683541318364),
-                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.6741486494265287),
-                                    ("weekmonth", -1.7578579175523736),
-                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.6741486494265287),
-                                    ("weekyear", -1.9810014688665833),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
-                                     -2.6741486494265287)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom HaShoah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -1.6582280766035324),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)April", -2.3513752571634776),
-                                    ("month", -1.252762968495368)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.237332013101517e-2,
-                               unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("dayhour", -1.4816045409242156),
-                                    ("Mondayearly morning", -3.378724525810097),
-                                    ("time-of-day (latent)tonight", -3.378724525810097),
-                                    ("hourhour", -2.3978952727983707),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("todaypart of days", -3.784189633918261),
-                                    ("minutehour", -2.6855773452501515),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.378724525810097),
-                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
-                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
-                                    ("intersectpart of days", -3.784189633918261),
-                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("tomorrowpart of days", -2.3978952727983707),
-                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("yesterdaypart of days", -3.378724525810097),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("Mondaypart of days", -3.784189633918261)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -2.4277482359480516,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.772588722239781),
-                                    ("monthhour", -2.772588722239781),
-                                    ("hourhour", -2.772588722239781),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -2.772588722239781),
-                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.772588722239781)],
-                               n = 3}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -1.2729656758128873,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.3285040669720361, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.4557388028063e-2, unseen = -5.003946305945459,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.898599985096005),
-                                    ("noon|midnight|EOD|end of day", -3.898599985096005),
-                                    ("integer after|past <hour-of-day>", -3.898599985096005),
-                                    ("half after|past <hour-of-day>", -4.304065093204169),
-                                    ("time-of-day (latent)", -1.6650077635889111),
-                                    ("hhmm (latent)", -3.6109179126442243),
-                                    ("<time-of-day> am|pm", -1.7783364488959144),
-                                    ("hh:mm", -3.3877743613300146),
-                                    ("about|exactly <time-of-day>", -3.898599985096005),
-                                    ("hour", -1.0459685551826876),
-                                    ("<time-of-day> sharp|exactly", -4.304065093204169),
-                                    ("minute", -2.10684051586795)],
-                               n = 68},
-                   koData =
-                     ClassData{prior = -2.512305623976115, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.4816045409242156),
-                                    ("mm/dd", -3.4965075614664802),
-                                    ("absorption of , after named day", -3.0910424533583156),
-                                    ("intersect", -3.0910424533583156),
-                                    ("Saturday", -2.803360380906535),
-                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
-                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.803360380906535),
-                                    ("hour", -3.4965075614664802)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.10919929196499197,
-                               unseen = -3.9889840465642745,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 52},
-                   koData =
-                     ClassData{prior = -2.268683541318364, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7884573603642702),
-                                    ("hh:mmhh:mm", -0.7884573603642702)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
-                                    ("minutehour", -0.7884573603642702)],
-                               n = 9}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Passover",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vesak",
-        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}}),
-       ("Earth 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}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.12516314295400605,
-                               unseen = -4.6913478822291435,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.295836866004329),
-                                    ("<integer> more <unit-of-duration>", -3.9889840465642745),
-                                    ("three-quarters of an hour", -3.0726933146901194),
-                                    ("<integer> + '\"", -3.295836866004329),
-                                    ("number.number hours", -3.9889840465642745),
-                                    ("second", -3.58351893845611),
-                                    ("half a <time-grain>", -3.0726933146901194),
-                                    ("day", -3.295836866004329), ("year", -3.9889840465642745),
-                                    ("<integer> <unit-of-duration>", -1.6376087894007967),
-                                    ("a <unit-of-duration>", -3.0726933146901194),
-                                    ("quarter of an hour", -3.0726933146901194),
-                                    ("hour", -2.6026896854443837),
-                                    ("about|exactly <duration>", -3.9889840465642745),
-                                    ("half an hour (abbrev).", -3.58351893845611),
-                                    ("<integer> and an half hour", -3.9889840465642745),
-                                    ("minute", -1.2809338454620642)],
-                               n = 45},
-                   koData =
-                     ClassData{prior = -2.1400661634962708,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -2.3025850929940455), ("year", -1.791759469228055),
-                                    ("<integer> <unit-of-duration>", -1.791759469228055),
-                                    ("a <unit-of-duration>", -2.3025850929940455)],
-                               n = 6}}),
-       ("January",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Mattu Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Family Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.48550781578170077,
-                               unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -0.9555114450274363,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("Shavuot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vimy Ridge Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> <duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayyear", -0.6931471805599453),
-                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("Boss's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Orthodox Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("May",
-        Classifier{okData =
-                     ClassData{prior = 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.45391749149411126, unseen = -6.78105762593618,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Navaratriyear (latent)", -6.0867747269123065),
-                                    ("Father's Dayyear (latent)", -6.0867747269123065),
-                                    ("Ramadanyear (latent)", -6.0867747269123065),
-                                    ("<datetime> - <datetime> (interval)on <date>",
-                                     -4.834011758416939),
-                                    ("Bhai Doojyear (latent)", -6.0867747269123065),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.834011758416939),
-                                    ("hourday", -4.382026634673881),
-                                    ("dayhour", -3.283414346005772),
-                                    ("Martin Luther King's Dayyear (latent)", -5.681309618804143),
-                                    ("Shemini Atzeretyear (latent)", -6.0867747269123065),
-                                    ("daymonth", -5.170483995038151),
-                                    ("monthday", -5.681309618804143),
-                                    ("monthyear", -4.295015257684252),
-                                    ("Yom Ha'atzmautyear (latent)", -6.0867747269123065),
-                                    ("Vijayadashamiyear (latent)", -6.0867747269123065),
-                                    ("Administrative Professionals' Dayyear (latent)",
-                                     -5.681309618804143),
-                                    ("Thanksgiving Dayyear (latent)", -4.988162438244197),
-                                    ("Thai Pongalyear (latent)", -5.393627546352362),
-                                    ("Thiru Onamyear (latent)", -5.393627546352362),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.0867747269123065),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -6.0867747269123065),
-                                    ("houryear", -5.393627546352362),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -6.0867747269123065),
-                                    ("Christmas<time-of-day> am|pm", -6.0867747269123065),
-                                    ("last <day-of-week> of <time>year (latent)",
-                                     -6.0867747269123065),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.393627546352362),
-                                    ("<time-of-day> am|pmintersect", -4.834011758416939),
-                                    ("Earth Houryear (latent)", -6.0867747269123065),
-                                    ("Family Dayyear (latent)", -5.170483995038151),
-                                    ("Octoberyear (latent)", -4.582697330136033),
-                                    ("intersect<time-of-day> am|pm", -6.0867747269123065),
-                                    ("Mattu Pongalyear (latent)", -6.0867747269123065),
-                                    ("Shavuotyear (latent)", -6.0867747269123065),
-                                    ("Dhanterasin <named-month>|year", -6.0867747269123065),
-                                    ("at <time-of-day>in|within|after <duration>",
-                                     -6.0867747269123065),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.0867747269123065),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -5.681309618804143),
-                                    ("Marchyear (latent)", -6.0867747269123065),
-                                    ("Sukkotyear (latent)", -5.681309618804143),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -6.0867747269123065),
-                                    ("Clean Mondayyear (latent)", -5.681309618804143),
-                                    ("monthhour", -5.681309618804143),
-                                    ("todayat <time-of-day>", -6.0867747269123065),
-                                    ("Thursday<time> timezone", -4.382026634673881),
-                                    ("from|since|after <time>December", -6.0867747269123065),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -6.0867747269123065),
-                                    ("Palm SundaySunday", -5.681309618804143),
-                                    ("dayday", -3.8895501495760874),
-                                    ("<time> <part-of-day>at <time-of-day>", -6.0867747269123065),
-                                    ("mm/ddat <time-of-day>", -6.0867747269123065),
-                                    ("tonightat <time-of-day>", -6.0867747269123065),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -5.393627546352362),
-                                    ("today<time-of-day> am|pm", -6.0867747269123065),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.681309618804143),
-                                    ("at <time-of-day><time> <part-of-day>", -6.0867747269123065),
-                                    ("mm/dd<time-of-day> am|pm", -6.0867747269123065),
-                                    ("hourhour", -4.834011758416939),
-                                    ("<time-of-day> am|pmon <date>", -4.071871706370042),
-                                    ("National Patriots' Dayyear (latent)", -5.393627546352362),
-                                    ("Wednesdaythis|last|next <cycle>", -6.0867747269123065),
-                                    ("Lentyear (latent)", -6.0867747269123065),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.582697330136033),
-                                    ("Boghiyear (latent)", -6.0867747269123065),
-                                    ("dayyear", -1.9123874570166697),
-                                    ("Thursdayfrom|since|after <time>", -5.681309618804143),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -6.0867747269123065),
-                                    ("Thursdayat <time-of-day>", -5.681309618804143),
-                                    ("Islamic New Yearyear (latent)", -5.681309618804143),
-                                    ("Laylat al-Qadryear (latent)", -5.170483995038151),
-                                    ("Chhathin <named-month>|year", -6.0867747269123065),
-                                    ("Vasant Panchamiin <named-month>|year", -6.0867747269123065),
-                                    ("Diwaliin <named-month>|year", -6.0867747269123065),
-                                    ("Discovery Dayyear (latent)", -5.681309618804143),
-                                    ("Shrove Tuesdayyear (latent)", -6.0867747269123065),
-                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
-                                     -5.393627546352362),
-                                    ("<time-of-day> am|pmtomorrow", -5.393627546352362),
-                                    ("Yom Kippuryear (latent)", -6.0867747269123065),
-                                    ("<part-of-day> of <time>year (latent)", -6.0867747269123065),
-                                    ("minutehour", -5.170483995038151),
-                                    ("Kaanum Pongalyear (latent)", -5.681309618804143),
-                                    ("Maha Saptamiyear (latent)", -6.0867747269123065),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.681309618804143),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.382026634673881),
-                                    ("for <duration> from <time>December", -6.0867747269123065),
-                                    ("tomorrow<time-of-day> sharp|exactly", -6.0867747269123065),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.170483995038151),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.681309618804143),
-                                    ("Pentecostyear (latent)", -6.0867747269123065),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.170483995038151),
-                                    ("Eid al-Fitryear (latent)", -6.0867747269123065),
-                                    ("Mondayin|during the <part-of-day>", -6.0867747269123065),
-                                    ("Raksha Bandhanyear (latent)", -6.0867747269123065),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.681309618804143),
-                                    ("Navaratriin <named-month>|year", -6.0867747269123065),
-                                    ("Ashurayear (latent)", -6.0867747269123065),
-                                    ("Chinese New Yearyear (latent)", -6.0867747269123065),
-                                    ("Sundayyear (latent)", -6.0867747269123065),
-                                    ("Lag BaOmeryear (latent)", -6.0867747269123065),
-                                    ("last weekend of <named-month>year (latent)",
-                                     -6.0867747269123065),
-                                    ("Eid al-Adhayear (latent)", -5.170483995038151),
-                                    ("intersectin|during the <part-of-day>", -6.0867747269123065),
-                                    ("Christmasat <time-of-day>", -6.0867747269123065),
-                                    ("Passoveryear (latent)", -6.0867747269123065),
-                                    ("Lazarus Saturdayyear (latent)", -6.0867747269123065),
-                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
-                                     -6.0867747269123065),
-                                    ("Yom HaShoahyear (latent)", -5.681309618804143),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -5.681309618804143),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -6.0867747269123065),
-                                    ("Thai Pongalin <named-month>|year", -6.0867747269123065),
-                                    ("Septemberyear (latent)", -5.681309618804143),
-                                    ("mm/ddyear (latent)", -6.0867747269123065),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.834011758416939),
-                                    ("Halloweenyear (latent)", -6.0867747269123065),
-                                    ("<ordinal> last <cycle> of <time>year (latent)",
-                                     -5.681309618804143),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.393627546352362),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -6.0867747269123065),
-                                    ("at <time-of-day>intersect", -5.681309618804143),
-                                    ("Rosh Hashanahyear (latent)", -5.393627546352362),
-                                    ("Dhanterasyear (latent)", -6.0867747269123065),
-                                    ("Tu BiShvatyear (latent)", -6.0867747269123065),
-                                    ("Holiyear (latent)", -5.393627546352362),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -6.0867747269123065),
-                                    ("Holika Dahanyear (latent)", -5.393627546352362),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -6.0867747269123065),
-                                    ("dayminute", -3.4477173972970485),
-                                    ("Mawlidyear (latent)", -6.0867747269123065),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.681309618804143),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -6.0867747269123065),
-                                    ("Jumu'atul-Widayear (latent)", -5.170483995038151),
-                                    ("minuteday", -2.4491885671859213),
-                                    ("absorption of , after named dayintersect",
-                                     -6.0867747269123065),
-                                    ("intersectyear (latent)", -6.0867747269123065),
-                                    ("Orthodox Easter Sundayyear (latent)", -6.0867747269123065),
-                                    ("<ordinal> <cycle> of <time>year (latent)",
-                                     -6.0867747269123065),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -6.0867747269123065),
-                                    ("Boss's Dayyear (latent)", -5.681309618804143),
-                                    ("Global Youth Service Dayyear (latent)", -6.0867747269123065),
-                                    ("Tisha B'Avyear (latent)", -6.0867747269123065),
-                                    ("Isra and Mi'rajyear (latent)", -5.170483995038151),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -6.0867747269123065),
-                                    ("Christmasyear (latent)", -5.681309618804143),
-                                    ("Naraka Chaturdashiyear (latent)", -5.681309618804143),
-                                    ("at <time-of-day>on <date>", -4.988162438244197),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.477336814478207),
-                                    ("dayweek", -6.0867747269123065),
-                                    ("Easter Sundayyear (latent)", -5.393627546352362),
-                                    ("Labour Dayyear (latent)", -6.0867747269123065),
-                                    ("weekyear", -4.988162438244197),
-                                    ("hh:mmin|during the <part-of-day>", -5.393627546352362),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.681309618804143),
-                                    ("Hanukkahyear (latent)", -5.393627546352362),
-                                    ("February<time> <part-of-day>", -6.0867747269123065),
-                                    ("Tuesdayin <named-month>|year", -6.0867747269123065),
-                                    ("Great Lentyear (latent)", -6.0867747269123065),
-                                    ("tomorrowat <time-of-day>", -5.393627546352362),
-                                    ("between <time> and <time>on <date>", -4.477336814478207),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
-                                     -6.0867747269123065),
-                                    ("last <cycle> of <time>year (latent)", -5.393627546352362),
-                                    ("at <time-of-day>tomorrow", -5.681309618804143),
-                                    ("tomorrow<time-of-day> am|pm", -6.0867747269123065),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -6.0867747269123065),
-                                    ("Diwaliyear (latent)", -6.0867747269123065),
-                                    ("Black Fridayyear (latent)", -5.681309618804143),
-                                    ("the <ordinal> last <cycle> of <time>year (latent)",
-                                     -6.0867747269123065),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -6.0867747269123065),
-                                    ("Chhathyear (latent)", -5.681309618804143),
-                                    ("Vasant Panchamiyear (latent)", -6.0867747269123065),
-                                    ("Palm Sundayintersect", -6.0867747269123065),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -6.0867747269123065),
-                                    ("Februaryintersect", -6.0867747269123065),
-                                    ("Mother's Dayyear (latent)", -6.0867747269123065),
-                                    ("Simchat Torahyear (latent)", -6.0867747269123065),
-                                    ("Victoria Dayyear (latent)", -5.681309618804143),
-                                    ("minuteyear", -6.0867747269123065)],
-                               n = 329},
-                   koData =
-                     ClassData{prior = -1.0082282271998406, unseen = -6.398594934535208,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.787491742782046),
-                                    ("hourday", -4.787491742782046),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.703782474656201),
-                                    ("dayhour", -3.138833117194664),
-                                    ("Tuesdayfrom|since|after <time>", -5.703782474656201),
-                                    ("daymonth", -3.56371631115993),
-                                    ("monthday", -5.298317366548036),
-                                    ("monthyear", -4.451019506160833),
-                                    ("<time-of-day> am|pmyear (latent)", -5.298317366548036),
-                                    ("Thai Pongalyear (latent)", -5.0106352940962555),
-                                    ("intersecthh:mm", -5.703782474656201),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.703782474656201),
-                                    ("houryear", -4.787491742782046),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.703782474656201),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.0106352940962555),
-                                    ("<time-of-day> am|pmintersect", -4.451019506160833),
-                                    ("until <time>on <date>", -5.0106352940962555),
-                                    ("Octoberyear (latent)", -5.703782474656201),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.703782474656201),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -4.451019506160833),
-                                    ("about|exactly <time-of-day>year (latent)",
-                                     -5.703782474656201),
-                                    ("absorption of , after named dayJuly", -5.298317366548036),
-                                    ("from|since|after <time>July", -5.703782474656201),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -4.787491742782046),
-                                    ("Clean Mondayyear (latent)", -5.703782474656201),
-                                    ("monthhour", -5.703782474656201),
-                                    ("hourmonth", -4.787491742782046),
-                                    ("todayat <time-of-day>", -5.703782474656201),
-                                    ("from|since|after <time>December", -5.703782474656201),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -5.703782474656201),
-                                    ("Mondayyear (latent)", -5.0106352940962555),
-                                    ("dayday", -5.298317366548036),
-                                    ("mm/ddat <time-of-day>", -5.298317366548036),
-                                    ("<time-of-day> am|pmon <date>", -4.451019506160833),
-                                    ("dayyear", -2.7333680090865),
-                                    ("Thursdaymm/dd", -5.703782474656201),
-                                    ("New Year's Dayyear (latent)", -5.298317366548036),
-                                    ("Thursdayfrom|since|after <time>", -3.9990343824177756),
-                                    ("Thursdayat <time-of-day>", -4.451019506160833),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.703782474656201),
-                                    ("Aprilyear (latent)", -5.703782474656201),
-                                    ("monthminute", -5.703782474656201),
-                                    ("<time-of-day> am|pmtomorrow", -5.703782474656201),
-                                    ("Thursdayhh:mm", -4.787491742782046),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.703782474656201),
-                                    ("minutemonth", -3.912023005428146),
-                                    ("week-endin <named-month>|year", -5.703782474656201),
-                                    ("Augustyear (latent)", -5.298317366548036),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.298317366548036),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.298317366548036),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -5.298317366548036),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.703782474656201),
-                                    ("Sundayyear (latent)", -5.0106352940962555),
-                                    ("Christmasat <time-of-day>", -5.703782474656201),
-                                    ("from|since|after <time>year (latent)", -4.451019506160833),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.703782474656201),
-                                    ("yesterday<time-of-day> am|pm", -5.703782474656201),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -5.703782474656201),
-                                    ("mm/ddyear (latent)", -5.703782474656201),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.0106352940962555),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.703782474656201),
-                                    ("at <time-of-day>intersect", -5.298317366548036),
-                                    ("hh:mmyear (latent)", -4.605170185988091),
-                                    ("Holiyear (latent)", -5.703782474656201),
-                                    ("until <time><time-of-day> am|pm", -5.703782474656201),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.703782474656201),
-                                    ("dayminute", -3.1780538303479458),
-                                    ("intersectSeptember", -4.199705077879927),
-                                    ("minuteday", -2.635729539522584),
-                                    ("absorption of , after named dayintersect",
-                                     -5.703782474656201),
-                                    ("Februaryin|during the <part-of-day>", -5.703782474656201),
-                                    ("hh:mmon <date>", -3.6888794541139363),
-                                    ("Saturdayyear (latent)", -5.703782474656201),
-                                    ("from|since|after <time>on <date>", -4.787491742782046),
-                                    ("absorption of , after named daySeptember",
-                                     -4.787491742782046),
-                                    ("Naraka Chaturdashiyear (latent)", -5.703782474656201),
-                                    ("on <date>September", -5.298317366548036),
-                                    ("at <time-of-day>on <date>", -5.298317366548036),
-                                    ("in <named-month>|yearyear (latent)", -5.703782474656201),
-                                    ("dayweek", -5.703782474656201),
-                                    ("Easter Sundayyear (latent)", -5.298317366548036),
-                                    ("Thursday<time-of-day> am|pm", -5.0106352940962555),
-                                    ("weekyear", -5.298317366548036),
-                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
-                                     -5.703782474656201),
-                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
-                                     -5.0106352940962555),
-                                    ("Sundayfrom|since|after <time>", -5.703782474656201),
-                                    ("absorption of , after named dayFebruary", -4.787491742782046),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.703782474656201),
-                                    ("tomorrowat <time-of-day>", -5.703782474656201),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.703782474656201),
-                                    ("last <cycle> of <time>year (latent)", -5.298317366548036),
-                                    ("tomorrow<time-of-day> am|pm", -5.703782474656201),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -5.0106352940962555),
-                                    ("Diwaliyear (latent)", -5.298317366548036),
-                                    ("<time-of-day> - <time-of-day> (interval)July",
-                                     -5.703782474656201),
-                                    ("Fridayyear (latent)", -5.298317366548036),
-                                    ("minuteyear", -4.451019506160833)],
-                               n = 189}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.2685113254635072,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.33024168687057687,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2231435513142097),
-                                    ("integer (0..19)", -1.6094379124341003)],
-                               n = 23}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.791759469228055),
-                                    ("ordinal (digits)quarter (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("quarteryear", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
-                                     -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 27},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("Global Youth Service 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}}),
-       ("Tisha B'Av",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.1431008436406733, unseen = -5.081404364984463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -3.822121282019774e-2),
-                                    ("intersect 2 numbers", -3.6888794541139363)],
-                               n = 156},
-                   koData =
-                     ClassData{prior = -2.0149030205422647, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1349799328389845),
-                                    ("negative numbers", -0.6931471805599453),
-                                    ("compose by multiplication", -1.9459101490553135)],
-                               n = 24}}),
-       ("mm/dd/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Civic Holiday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -1.0296194171811581),
-                                    ("intersect<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -1.540445040947149),
-                                    ("from|since|after <time><integer> <unit-of-duration>",
-                                     -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.2039728043259361),
-                                    ("December<integer> <unit-of-duration>", -1.2039728043259361)],
-                               n = 2}}),
-       ("Memorial Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.2237754316221157,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Hanukkah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("Labour Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.9808292530117262),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -2.0794415416798357),
-                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
-                                     -1.6739764335716716),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
-                                     -1.6739764335716716)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.0986122886681098),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
-                                     -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("half a <time-grain>",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maha Saptami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Discovery Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -3.822121282019774e-2,
-                               unseen = -4.3694478524670215,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 77},
-                   koData =
-                     ClassData{prior = -3.283414346005772, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.3513752571634776),
-                                    ("part of daysintersect", -2.3513752571634776),
-                                    ("hourday", -0.9650808960435872),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -2.3513752571634776),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -2.3513752571634776),
-                                    ("part of daysthis <time>", -2.3513752571634776),
-                                    ("part of daysChristmas", -1.9459101490553135)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Shrove Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Kaanum Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom Kippur",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("The Twelfth",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("powers of tens",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Groundhog Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15600424847658126, unseen = -5.10594547390058,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.1295745142720766),
-                                    ("month (grain)", -2.797281334830153),
-                                    ("year (grain)", -2.5349170703626616),
-                                    ("week (grain)", -1.1295745142720766),
-                                    ("quarter", -3.4904285153900982), ("year", -2.5349170703626616),
-                                    ("month", -2.797281334830153),
-                                    ("quarter (grain)", -3.4904285153900982)],
-                               n = 77},
-                   koData =
-                     ClassData{prior = -1.9348603128687285,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2809338454620642),
-                                    ("week (grain)", -1.2809338454620642),
-                                    ("day", -1.9740810260220096),
-                                    ("day (grain)", -1.9740810260220096)],
-                               n = 13}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Simchat Torah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Victoria Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Raksha Bandhan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ashura",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Palm Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Adha",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
-                                    ("time-of-day (latent)", -1.9459101490553135),
-                                    ("<time-of-day> am|pm", -1.9459101490553135),
-                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
-                                    ("minute", -1.540445040947149)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.5753641449035618,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.8266785731844679,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -0.8109302162163288),
-                                    ("ordinal (digits)", -0.587786664902119)],
-                               n = 7}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lag BaOmer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.262364264467491, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -1.466337068793427, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Chinese New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|this|next <season>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.635159922909596, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.11441035117774422),
-                                    ("integer (0..19)", -2.3581549441488563)],
-                               n = 71},
-                   koData =
-                     ClassData{prior = -0.7547050735593787, unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.878087785311434e-2),
-                                    ("integer (0..19)", -3.0910424533583156),
-                                    ("integer 21..99", -3.4965075614664802)],
-                               n = 63}}),
-       ("beginning of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -5.181783550292085,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5370924029585704),
-                                    ("integer (0..19)year (grain)", -2.9789251552376097),
-                                    ("integer (numeric)day (grain)", -2.6112003751122925),
-                                    ("integer (0..19)second (grain) ", -3.7898553714539385),
-                                    ("integer (0..19)hour (grain)", -3.096708190893993),
-                                    ("second", -3.3843902633457743),
-                                    ("integer (numeric)second (grain) ", -4.07753744390572),
-                                    ("integer (numeric)year (grain)", -3.3843902633457743),
-                                    ("day", -2.342936388517613), ("year", -2.5370924029585704),
-                                    ("integer (numeric)week (grain)", -3.096708190893993),
-                                    ("integer (0..19)month (grain)", -3.5667118201397288),
-                                    ("hour", -2.691243082785829), ("month", -3.230239583518516),
-                                    ("integer (numeric)minute (grain)", -3.230239583518516),
-                                    ("integer (0..19)minute (grain)", -3.096708190893993),
-                                    ("integer (numeric)month (grain)", -4.07753744390572),
-                                    ("minute", -2.5370924029585704),
-                                    ("integer (numeric)hour (grain)", -3.5667118201397288),
-                                    ("integer (0..19)day (grain)", -3.5667118201397288),
-                                    ("integer (0..19)week (grain)", -3.230239583518516)],
-                               n = 77},
-                   koData =
-                     ClassData{prior = -2.0794415416798357, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2546422183735807, unseen = -5.37989735354046,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>", -3.765840495250065),
-                                    ("integer after|past <hour-of-day>", -3.9889840465642745),
-                                    ("at <time-of-day>", -2.1564025828159643),
-                                    ("<time-of-day> o'clock", -4.276666119016055),
-                                    ("half after|past <hour-of-day>", -4.276666119016055),
-                                    ("time-of-day (latent)", -1.7117167615545186),
-                                    ("hhmm (latent)", -4.68213122712422),
-                                    ("hh:mm", -2.330755969960742),
-                                    ("quarter after|past <hour-of-day>", -4.68213122712422),
-                                    ("until <time>", -3.9889840465642745),
-                                    ("about|exactly <time-of-day>", -4.68213122712422),
-                                    ("hour", -1.1856236656577395),
-                                    ("<time-of-day> sharp|exactly", -4.68213122712422),
-                                    ("minute", -1.791759469228055)],
-                               n = 100},
-                   koData =
-                     ClassData{prior = -1.492516574375198, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.20545280453606),
-                                    ("from|since|after <time>", -3.20545280453606),
-                                    ("<hour-of-day> <integer>", -3.6109179126442243),
-                                    ("time-of-day (latent)", -1.085189268335969),
-                                    ("hour", -1.0459685551826876), ("minute", -2.6946271807700692)],
-                               n = 29}}),
-       ("Yom Ha'atzmaut",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thiru Onam",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thai Pongal",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Vijayadashami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Administrative Professionals' 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}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5306282510621704,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.1400661634962708),
-                                    ("year (grain)", -2.4277482359480516),
-                                    ("second", -2.833213344056216),
-                                    ("week (grain)", -2.1400661634962708),
-                                    ("day", -2.1400661634962708),
-                                    ("minute (grain)", -2.833213344056216),
-                                    ("year", -2.4277482359480516),
-                                    ("second (grain) ", -2.833213344056216),
-                                    ("minute", -2.833213344056216),
-                                    ("day (grain)", -2.1400661634962708)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.8873031950009028, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("at the beginning|end of <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -0.6931471805599453),
-                                    ("year", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Dhanteras",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Tu BiShvat",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Whit Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -5.6352936551131744e-2,
-                               unseen = -4.2626798770413155,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
-                   koData =
-                     ClassData{prior = -2.9041650800285006, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("Holi",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Rosh Hashanah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <named-day> ago|back",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)Thursday", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Holika Dahan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Mawlid",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Jumu'atul-Wida",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.1786549963416462, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -2.159484249353372),
-                                    ("time-of-day (latent)", -2.5649493574615367),
-                                    ("year", -2.159484249353372),
-                                    ("<time-of-day> am|pm", -1.8718021769015913),
-                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
-                                    ("minute", -1.6486586255873816)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.2192034840549946),
-                                    ("yesterday", -2.7300291078209855),
-                                    ("day", -2.7300291078209855),
-                                    ("time-of-day (latent)", -1.6314168191528755),
-                                    ("hh:mm", -2.2192034840549946), ("hour", -1.5260563034950494),
-                                    ("minute", -1.749199854809259)],
-                               n = 18}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
-                                    ("this|last|next <cycle>", -1.791759469228055),
-                                    ("day", -2.4849066497880004),
-                                    ("time-of-day (latent)", -2.890371757896165),
-                                    ("hhmm (latent)", -2.4849066497880004),
-                                    ("<time-of-day> am|pm", -2.890371757896165),
-                                    ("hour", -2.1972245773362196),
-                                    ("next <time>", -2.890371757896165),
-                                    ("this|next <day-of-week>", -2.890371757896165),
-                                    ("minute", -2.4849066497880004)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("Sukkot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthyear", -1.540445040947149),
-                                    ("Marcha <unit-of-duration>", -1.9459101490553135),
-                                    ("March<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("Vijayadashami<integer> <unit-of-duration>",
-                                     -1.9459101490553135),
-                                    ("Administrative Professionals' Day<integer> <unit-of-duration>",
-                                     -1.9459101490553135),
-                                    ("dayyear", -1.540445040947149)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("World Vegan Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.5292593254548287, unseen = -4.969813299576001,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.269697449699962),
-                                    ("dayhour", -3.8642323415917974),
-                                    ("daymonth", -3.016934481204594),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.269697449699962),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.5765502691400166),
-                                    ("Wednesdayintersect", -4.269697449699962),
-                                    ("Black Fridaythis|last|next <cycle>", -4.269697449699962),
-                                    ("Labour Daythis|last|next <cycle>", -4.269697449699962),
-                                    ("<part-of-day> of <time>February", -4.269697449699962),
-                                    ("Saturday<time-of-day> am|pm", -4.269697449699962),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -3.8642323415917974),
-                                    ("on <date><time-of-day> am|pm", -4.269697449699962),
-                                    ("hourmonth", -4.269697449699962),
-                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
-                                     -4.269697449699962),
-                                    ("dayday", -2.3978952727983707),
-                                    ("the <day-of-month> (ordinal)February", -3.8642323415917974),
-                                    ("WednesdayOctober", -4.269697449699962),
-                                    ("Wednesdaythis|last|next <cycle>", -3.8642323415917974),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.353406717825807),
-                                    ("dayyear", -3.1710851610318525),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.269697449699962),
-                                    ("Thursdayhh:mm", -3.8642323415917974),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.269697449699962),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -3.8642323415917974),
-                                    ("TuesdayOctober", -4.269697449699962),
-                                    ("the <day-of-month> (ordinal)March", -4.269697449699962),
-                                    ("Mondaythis|last|next <cycle>", -4.269697449699962),
-                                    ("Fridayintersect", -4.269697449699962),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.8642323415917974),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.8642323415917974),
-                                    ("Tuesdaythis|last|next <cycle>", -4.269697449699962),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.269697449699962),
-                                    ("dayminute", -2.883403088580071),
-                                    ("minuteday", -3.353406717825807),
-                                    ("this|last|next <cycle>Sunday", -4.269697449699962),
-                                    ("Sundaythis|last|next <cycle>", -4.269697449699962),
-                                    ("weekday", -4.269697449699962),
-                                    ("dayweek", -3.1710851610318525),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -3.8642323415917974)],
-                               n = 43},
-                   koData =
-                     ClassData{prior = -0.8892620594862358, unseen = -4.770684624465665,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.069026754237811),
-                                    ("week-endOctober", -3.3758795736778655),
-                                    ("daymonth", -1.8718021769015913),
-                                    ("TuesdaySeptember", -4.069026754237811),
-                                    ("Wednesdayintersect", -4.069026754237811),
-                                    ("hourmonth", -2.9704144655697013),
-                                    ("Fridaythis|last|next <cycle>", -4.069026754237811),
-                                    ("SundayFebruary", -4.069026754237811),
-                                    ("WednesdayOctober", -4.069026754237811),
-                                    ("week-endintersect", -4.069026754237811),
-                                    ("dayyear", -4.069026754237811),
-                                    ("FridayJuly", -3.6635616461296463),
-                                    ("FridaySeptember", -4.069026754237811),
-                                    ("WednesdayFebruary", -4.069026754237811),
-                                    ("minutemonth", -3.152736022363656),
-                                    ("SundayMarch", -4.069026754237811),
-                                    ("MondayFebruary", -3.6635616461296463),
-                                    ("Fridayintersect", -4.069026754237811),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.6635616461296463),
-                                    ("dayminute", -3.3758795736778655),
-                                    ("SaturdaySeptember", -4.069026754237811),
-                                    ("intersectSeptember", -3.152736022363656),
-                                    ("MondayMarch", -4.069026754237811),
-                                    ("on <date>September", -3.6635616461296463),
-                                    ("Tuesdayintersect", -4.069026754237811),
-                                    ("Sundayintersect", -4.069026754237811)],
-                               n = 30}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5306282510621704,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.772588722239781),
-                                    ("Martin Luther King's Day", -2.772588722239781),
-                                    ("Mother's Day", -2.772588722239781),
-                                    ("day", -1.1631508098056809), ("Sunday", -2.772588722239781),
-                                    ("Chinese New Year", -2.367123614131617),
-                                    ("Thanksgiving Day", -2.772588722239781),
-                                    ("Easter Sunday", -2.772588722239781),
-                                    ("hour", -2.772588722239781), ("Tuesday", -2.772588722239781),
-                                    ("week-end", -2.772588722239781)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.8873031950009028, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.5649493574615367), ("day", -2.159484249353372),
-                                    ("Sunday", -2.5649493574615367), ("hour", -1.466337068793427),
-                                    ("week-end", -1.466337068793427)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Clean Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm.dd.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Isra and Mi'raj",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.3184537311185346,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.803360380906535),
-                                    ("a <unit-of-duration>Christmas", -2.803360380906535),
-                                    ("dayday", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>today", -2.803360380906535),
-                                    ("daysecond", -2.803360380906535),
-                                    ("a <unit-of-duration>right now", -2.803360380906535),
-                                    ("minutenograin", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>Christmas", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>Easter Sunday",
-                                     -2.803360380906535),
-                                    ("secondnograin", -2.803360380906535),
-                                    ("yearday", -2.1102132003465894),
-                                    ("daynograin", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>now", -2.3978952727983707)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.4423470353692043),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.4423470353692043),
-                                    ("dayday", -2.03688192726104),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.4423470353692043),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.4423470353692043)],
-                               n = 3}}),
-       ("<day-of-month> (ordinal or number) of <month>",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.803360380906535),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.803360380906535),
-                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
-                                    ("integer (numeric)this|last|next <cycle>",
-                                     -2.3978952727983707),
-                                    ("ordinal (digits)February", -2.803360380906535),
-                                    ("integer (numeric)February", -2.3978952727983707),
-                                    ("month", -0.9315582040049435),
-                                    ("ordinal (digits)March", -2.803360380906535),
-                                    ("integer (numeric)July", -2.803360380906535)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.7047480922384253),
-                                    ("month", -1.7047480922384253)],
-                               n = 1}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Labour Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Naraka Chaturdashi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("beginning of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.9704144655697013),
-                                    ("Halloween", -2.9704144655697013),
-                                    ("Wednesday", -2.9704144655697013),
-                                    ("Boss's Day", -2.9704144655697013),
-                                    ("Memorial Day", -2.9704144655697013),
-                                    ("Monday", -2.9704144655697013),
-                                    ("Discovery Day", -2.9704144655697013),
-                                    ("Mother's Day", -2.9704144655697013),
-                                    ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.9704144655697013),
-                                    ("March", -2.9704144655697013), ("month", -2.9704144655697013),
-                                    ("Tuesday", -2.277267285009756)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>|year",
-        Classifier{okData =
-                     ClassData{prior = -0.2719337154836418,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<year> (bc|ad)", -1.845826690498331),
-                                    ("October", -2.9444389791664407),
-                                    ("year (latent)", -1.3350010667323402),
-                                    ("year", -0.9295359586241757), ("March", -2.9444389791664407),
-                                    ("month", -2.538973871058276)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.4350845252893227, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.6739764335716716),
-                                    ("year (latent)", -1.3862943611198906),
-                                    ("year", -1.3862943611198906), ("month", -1.6739764335716716)],
-                               n = 5}}),
-       ("Islamic New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half a <time-grain>", -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}}),
-       ("half an hour (abbrev).",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               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.5596157879354228, unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.012261575505202),
-                                    ("from|since|after <time>hh:mm", -2.501435951739211),
-                                    ("minuteminute", -1.2776605201170952),
-                                    ("hh:mmhh:mm", -1.9136492868370918),
-                                    ("dayday", -3.012261575505202),
-                                    ("hourhour", -3.012261575505202),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.012261575505202),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.012261575505202),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.012261575505202)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.2386784521643803),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.2386784521643803),
-                                    ("daymonth", -2.833213344056216),
-                                    ("<time-of-day> am|pmintersect", -3.2386784521643803),
-                                    ("hh:mm<time-of-day> am|pm", -2.833213344056216),
-                                    ("minuteminute", -1.9859154836690123),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("dayday", -3.2386784521643803),
-                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
-                                     -2.833213344056216),
-                                    ("hourhour", -2.5455312716044354),
-                                    ("minutehour", -2.833213344056216),
-                                    ("hh:mmintersect", -2.322387720290225),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.2386784521643803),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("from|since|after <time>intersect", -2.833213344056216)],
-                               n = 15}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("National Patriots' Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Laylat al-Qadr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Boghi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("at the beginning|end of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("January", -1.3862943611198906),
-                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.0986122886681098),
-                                    ("month", -1.0986122886681098)],
-                               n = 1}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>hh:mm", -2.4849066497880004),
-                                    ("minuteminute", -1.529395204760564),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -1.8971199848858813),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.4418327522790392, unseen = -4.532599493153256,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.828641396489095),
-                                    ("until <time>time-of-day (latent)", -2.575878427993727),
-                                    ("hh:mmtime-of-day (latent)", -2.12389330425067),
-                                    ("hh:mm<time-of-day> am|pm", -3.4231762883809305),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.828641396489095),
-                                    ("hourhour", -1.6314168191528755),
-                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
-                                     -3.828641396489095),
-                                    ("hourminute", -3.828641396489095),
-                                    ("minutehour", -1.5773495978825998),
-                                    ("until <time><time-of-day> am|pm", -3.4231762883809305),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -2.575878427993727),
-                                    ("at <time-of-day>time-of-day (latent)", -3.4231762883809305),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.4231762883809305)],
-                               n = 36}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("Diwali",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("last night",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   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.916290731874155, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.9924301646902063),
-                                    ("daymonth", -1.4816045409242156),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.9924301646902063),
-                                    ("week (grain)intersect", -2.3978952727983707),
-                                    ("week (grain)September", -2.3978952727983707)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.2335922215070942),
-                                    ("day (grain)May", -2.2335922215070942),
-                                    ("week (grain)year (latent)", -1.9459101490553135),
-                                    ("weekmonth", -1.7227665977411035),
-                                    ("week (grain)October", -2.2335922215070942),
-                                    ("weekyear", -1.9459101490553135),
-                                    ("week (grain)intersect", -2.2335922215070942)],
-                               n = 9}}),
-       ("Chhath",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vasant Panchami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("daymonth", -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("weekyear", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("Great Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maundy Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("compose by multiplication",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.832909122935104),
-                                    ("hh:mmhh:mm", -0.832909122935104)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
-                                    ("minuteminute", -1.410986973710262),
-                                    ("minutehour", -1.410986973710262),
-                                    ("hh:mmintersect", -1.410986973710262)],
-                               n = 18}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\" for year",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Black Fridaythis|last|next <cycle>", -2.6026896854443837),
-                                    ("Labour Daythis|last|next <cycle>", -2.6026896854443837),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -2.1972245773362196),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -2.6026896854443837),
-                                    ("dayyear", -0.9932517730102834),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -2.6026896854443837),
-                                    ("intersectyear (latent)", -2.6026896854443837),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -2.1972245773362196)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Fridaythis|last|next <cycle>", -1.7047480922384253),
-                                    ("dayyear", -1.7047480922384253)],
-                               n = 1}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("at the beginning|end of <week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.330733340286331,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.706570200892086),
-                                    ("this|last|next <cycle>", -0.8209805520698302),
-                                    ("about|exactly <time-of-day>", -2.70805020110221)],
-                               n = 36},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Fitr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Trinity Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Pentecost",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.639057329615259),
-                                    ("Martin Luther King's Day", -2.639057329615259),
-                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
-                                    ("Thanksgiving Day", -2.639057329615259),
-                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
-                                    ("winter", -2.639057329615259),
-                                    ("week-end", -2.639057329615259),
-                                    ("summer", -2.2335922215070942)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                     ClassData{prior = -2.5649493574615367, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7308875085427924),
+                                    ("integer (numeric)time-of-day (latent)", -0.7308875085427924)],
+                               n = 12}}),
+       ("week",
+        Classifier{okData =
+                     ClassData{prior = 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> timezone",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.23410650459726,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.4277482359480516),
+                                    ("hhhmm", -1.65455834771457),
+                                    ("<time-of-day> am|pm", -2.0222831278398874),
+                                    ("hh:mm", -2.2735975561207935), ("hour", -1.821612432377736),
+                                    ("minute", -1.128465251817791)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm", -1.3862943611198906), ("hh:mm", -1.791759469228055),
+                                    ("minute", -1.0986122886681098)],
+                               n = 3}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5465437063680699, unseen = -6.230481447578482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 506},
+                   koData =
+                     ClassData{prior = -0.8649974374866046, unseen = -5.91350300563827,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 368}}),
+       ("<year> (bc|ad)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.5040773967762742),
+                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
+                               n = 1}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   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}}),
+       ("Karva Chauth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Father's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        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}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -0.9808292530117262)],
+                               n = 2}}),
+       ("Maha Shivaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("from|since|after <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.701375407759786, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal or number) <named-month>",
+                                     -3.8066624897703196),
+                                    ("July", -3.8066624897703196),
+                                    ("intersect", -3.8066624897703196),
+                                    ("year (latent)", -3.4011973816621555),
+                                    ("day", -2.4203681286504293),
+                                    ("the <day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("the <day-of-month> (number)", -3.8066624897703196),
+                                    ("time-of-day (latent)", -2.5538995212749516),
+                                    ("year", -3.4011973816621555),
+                                    ("<time-of-day> am|pm", -2.5538995212749516),
+                                    ("hh:mm", -2.890371757896165),
+                                    ("<day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("hour", -1.9348603128687285), ("month", -3.4011973816621555),
+                                    ("minute", -2.890371757896165),
+                                    ("August", -3.8066624897703196)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.201421728167374, unseen = -5.631211781821365,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -4.018183201256536),
+                                    ("week", -4.9344739331306915),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.9344739331306915),
+                                    ("today", -4.9344739331306915),
+                                    ("intersect", -2.9885637840753785),
+                                    ("<time> for <duration>", -4.241326752570746),
+                                    ("second", -4.9344739331306915), ("now", -3.3250360206965914),
+                                    ("tomorrow", -4.529008825022527),
+                                    ("this|last|next <cycle>", -4.9344739331306915),
+                                    ("day", -1.7774735119805785),
+                                    ("the <day-of-month> (ordinal)", -4.529008825022527),
+                                    ("the <day-of-month> (number)", -3.548179572010801),
+                                    ("time-of-day (latent)", -2.492126897761487),
+                                    ("<time-of-day> am|pm", -4.241326752570746),
+                                    ("hh:mm", -4.529008825022527), ("nograin", -3.3250360206965914),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.529008825022527),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.9344739331306915),
+                                    ("<day-of-month> (ordinal)", -3.835861644462582),
+                                    ("Easter Sunday", -4.9344739331306915),
+                                    ("Christmas", -4.241326752570746),
+                                    ("hour", -2.3317842476863078), ("month", -4.9344739331306915),
+                                    ("<datetime> - <datetime> (interval)", -2.7372493557944724),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.9885637840753785),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -4.529008825022527),
+                                    ("minute", -1.9900349539642512),
+                                    ("right now", -4.9344739331306915),
+                                    ("<month> dd-dd (interval)", -4.241326752570746),
+                                    ("part of days", -4.9344739331306915),
+                                    ("dd-dd <month> (interval)", -4.529008825022527)],
+                               n = 121}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("integer (numeric)time-of-day (latent)", -1.3862943611198906),
+                                    ("integer (20..90)time-of-day (latent)", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.268683541318364),
+                                    ("daymonth", -2.268683541318364),
+                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.6741486494265287),
+                                    ("weekmonth", -1.7578579175523736),
+                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.6741486494265287),
+                                    ("weekyear", -1.9810014688665833),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
+                                     -2.6741486494265287)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.1631508098056809, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.3025850929940455),
+                                    ("integer (numeric)April", -2.3025850929940455),
+                                    ("month", -1.2039728043259361)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.3746934494414107,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.772588722239781),
+                                    ("ordinal (digits)July", -2.0794415416798357),
+                                    ("integer (numeric)September", -2.367123614131617),
+                                    ("ordinal (digits)August", -2.772588722239781),
+                                    ("ordinal (digits)April", -2.772588722239781),
+                                    ("month", -0.9808292530117262),
+                                    ("integer (numeric)July", -2.0794415416798357)],
+                               n = 11}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.19105523676270922,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("dayhour", -1.499234772300486),
+                                    ("Mondayearly morning", -3.536116699561526),
+                                    ("time-of-day (latent)tonight", -3.536116699561526),
+                                    ("hourhour", -2.236833715431265),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("todaypart of days", -3.9415818076696905),
+                                    ("minutehour", -2.6888188391743224),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.536116699561526),
+                                    ("time-of-day (latent)this <part-of-day>", -3.9415818076696905),
+                                    ("Mondayin|during the <part-of-day>", -3.9415818076696905),
+                                    ("intersectpart of days", -3.0252910757955354),
+                                    ("Saturdaypart of days", -3.9415818076696905),
+                                    ("intersectin|during the <part-of-day>", -3.9415818076696905),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("tomorrowpart of days", -2.33214389523559),
+                                    ("hh:mmin|during the <part-of-day>", -3.0252910757955354),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("yesterdaypart of days", -3.536116699561526),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("Mondaypart of days", -3.9415818076696905)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -1.749199854809259, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.068052935133617),
+                                    ("yearhour", -3.068052935133617),
+                                    ("monthhour", -3.068052935133617),
+                                    ("hourhour", -1.9694406464655074),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("Februaryin|during the <part-of-day>", -3.068052935133617),
+                                    ("tomorrowpart of days", -3.068052935133617),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.151762203259462)],
+                               n = 8}}),
+       ("today",
+        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}}),
+       ("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.2336148511815052, unseen = -5.327876168789581,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.9367156180185177),
+                                    ("noon|midnight|EOD|end of day", -4.2243976904702984),
+                                    ("integer after|past <hour-of-day>", -3.9367156180185177),
+                                    ("<time-of-day> o'clock", -4.629862798578463),
+                                    ("half after|past <hour-of-day>", -4.629862798578463),
+                                    ("hhhmm", -3.713572066704308),
+                                    ("<hour-of-day> <integer>", -3.9367156180185177),
+                                    ("time-of-day (latent)", -1.6594483330087617),
+                                    ("hhmm (latent)", -3.9367156180185177),
+                                    ("<time-of-day> am|pm", -1.9908054689632042),
+                                    ("hh:mm", -3.2435684374585723),
+                                    ("about|exactly <time-of-day>", -4.2243976904702984),
+                                    ("hour", -1.1333552371119826),
+                                    ("<time-of-day> sharp|exactly", -4.629862798578463),
+                                    ("minute", -1.889022774653262)],
+                               n = 95},
+                   koData =
+                     ClassData{prior = -1.5686159179138452, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9963334395476915),
+                                    ("<time-of-day> am|pm", -3.0757749812275272),
+                                    ("hour", -0.916290731874155)],
+                               n = 25}}),
+       ("December",
+        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}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.8622008809294686),
+                                    ("Saturday", -2.8622008809294686),
+                                    ("Monday", -2.456735772821304), ("Friday", -1.6094379124341003),
+                                    ("day", -0.8472978603872037), ("Sunday", -2.8622008809294686),
+                                    ("on <day>", -2.169053700369523)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = -3.17486983145803e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -3.4657359027997265,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("hour", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("the <day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7621400520468967, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6094379124341003),
+                                    ("ordinal (digits)February", -1.8971199848858813),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)March", -1.8971199848858813)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.6286086594223742,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.4816045409242156),
+                                    ("month", -0.8938178760220964),
+                                    ("integer (numeric)July", -1.4816045409242156)],
+                               n = 8}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -1.212136053234485e-2,
+                               unseen = -4.430816798843313,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 82},
+                   koData =
+                     ClassData{prior = -4.418840607796598, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("in|during <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2744368457017603,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<year> (bc|ad)", -1.9924301646902063),
+                                    ("October", -3.0910424533583156),
+                                    ("year (latent)", -1.2992829841302609),
+                                    ("year", -0.9509762898620451), ("March", -2.6855773452501515),
+                                    ("month", -2.3978952727983707)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -1.4271163556401458,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.5040773967762742),
+                                    ("year (latent)", -1.5040773967762742),
+                                    ("year", -1.5040773967762742), ("month", -1.5040773967762742)],
+                               n = 6}}),
+       ("<part-of-day> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.223809823697212e-2,
+                               unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this <part-of-day>hh:mm", -3.7013019741124937),
+                                    ("tonighthh:mm", -3.7013019741124937),
+                                    ("hourhour", -0.8979415932059586),
+                                    ("hourminute", -3.0081547935525483),
+                                    ("in|during the <part-of-day>time-of-day (latent)",
+                                     -3.7013019741124937),
+                                    ("this <part-of-day>time-of-day (latent)", -1.9965538818740682),
+                                    ("early morningtime-of-day (latent)", -3.7013019741124937),
+                                    ("tonight<time-of-day> o'clock", -3.7013019741124937),
+                                    ("tonighttime-of-day (latent)", -2.7850112422383386),
+                                    ("part of dayshh:mm", -3.7013019741124937),
+                                    ("part of daystime-of-day (latent)", -1.6218604324326575)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -2.538973871058276, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.4469189829363254),
+                                    ("this <part-of-day>time-of-day (latent)", -2.1400661634962708),
+                                    ("tonighttime-of-day (latent)", -2.1400661634962708),
+                                    ("part of daystime-of-day (latent)", -2.1400661634962708)],
+                               n = 3}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -2.0794415416798357),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.0794415416798357),
+                                    ("hhhmmhhhmm", -2.0794415416798357),
+                                    ("minutehour", -1.6739764335716716),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("minutehour", -1.3862943611198906),
+                                    ("hhhmmtime-of-day (latent)", -1.791759469228055)],
+                               n = 2}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Good Friday",
+        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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.12136085700426748,
+                               unseen = -3.4965075614664802,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 31},
+                   koData =
+                     ClassData{prior = -2.169053700369523, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<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.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.0794415416798357),
+                                    ("<part-of-day> at <time-of-day>", -2.0794415416798357),
+                                    ("time-of-day (latent)", -1.1631508098056809),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vesak",
+        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}}),
+       ("Earth 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}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.1416505170630268, unseen = -4.709530201312334,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.3141860046725258),
+                                    ("<integer> more <unit-of-duration>", -4.007333185232471),
+                                    ("three-quarters of an hour", -3.0910424533583156),
+                                    ("<integer> + '\"", -3.3141860046725258),
+                                    ("number.number hours", -4.007333185232471),
+                                    ("second", -3.6018680771243066),
+                                    ("half a <time-grain>", -3.0910424533583156),
+                                    ("day", -3.3141860046725258), ("year", -4.007333185232471),
+                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("a <unit-of-duration>", -3.0910424533583156),
+                                    ("quarter of an hour", -3.0910424533583156),
+                                    ("hour", -2.503255788456197),
+                                    ("about|exactly <duration>", -4.007333185232471),
+                                    ("half an hour (abbrev).", -3.6018680771243066),
+                                    ("<integer> and an half hour", -4.007333185232471),
+                                    ("minute", -1.2992829841302609)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -2.0243817644968085,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.772588722239781), ("quarter", -2.772588722239781),
+                                    ("year", -1.6739764335716716),
+                                    ("<integer> <unit-of-duration>", -1.6739764335716716),
+                                    ("a <unit-of-duration>", -2.367123614131617)],
+                               n = 7}}),
+       ("the closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.0986122886681098),
+                                    ("Christmastoday", -1.791759469228055),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.791759469228055),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("MondayOctober", -1.3862943611198906)],
+                               n = 1}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half <integer> (UK style hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Family Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ganesh Chaturthi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        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}}),
+       ("<time-of-day> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)tonight", -2.5649493574615367),
+                                    ("hourhour", -1.3609765531356008),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -2.9704144655697013),
+                                    ("minutehour", -1.717651497074333),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("time-of-day (latent)this <part-of-day>", -2.9704144655697013),
+                                    ("hh:mmin|during the <part-of-day>", -2.0541237336955462),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -2.9704144655697013)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.466337068793427),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -1.466337068793427)],
+                               n = 2}}),
+       ("the nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.6931471805599453),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.3723081191451507, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -0.2923879634891936, unseen = -4.007333185232471,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 53}}),
+       ("Parsi New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vimy Ridge Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -0.6931471805599453),
+                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("May",
+        Classifier{okData =
+                     ClassData{prior = 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.47948237320027937, unseen = -7.21890970761906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.525029657843462),
+                                    ("Father's Dayyear (latent)", -6.525029657843462),
+                                    ("Karva Chauthyear (latent)", -6.525029657843462),
+                                    ("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.525029657843462),
+                                    ("Maha Shivaratriyear (latent)", -6.525029657843462),
+                                    ("Ramadanyear (latent)", -5.272266689348094),
+                                    ("<datetime> - <datetime> (interval)on <day>",
+                                     -5.1387352967235715),
+                                    ("Bhai Doojyear (latent)", -6.525029657843462),
+                                    ("hourday", -4.510126637301197),
+                                    ("dayhour", -3.480507220120039),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.1387352967235715),
+                                    ("Martin Luther King's Dayyear (latent)", -6.119564549735298),
+                                    ("Shemini Atzeretyear (latent)", -6.525029657843462),
+                                    ("daymonth", -4.510126637301197),
+                                    ("monthday", -6.119564549735298),
+                                    ("monthyear", -4.733270188615407),
+                                    ("Yom Ha'atzmautyear (latent)", -6.525029657843462),
+                                    ("Orthodox Good Fridayyear (latent)", -6.119564549735298),
+                                    ("Vijayadashamiyear (latent)", -6.525029657843462),
+                                    ("Administrative Professionals' Dayyear (latent)",
+                                     -6.119564549735298),
+                                    ("Thanksgiving Dayyear (latent)", -5.426417369175352),
+                                    ("Thai Pongalyear (latent)", -5.831882477283517),
+                                    ("Thiru Onamyear (latent)", -5.831882477283517),
+                                    ("hhhmmabsorption of , after named day", -6.525029657843462),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.525029657843462),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.608738925969307),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.525029657843462),
+                                    ("Krishna Janmashtamiyear (latent)", -6.119564549735298),
+                                    ("Guru Gobind Singh Jayantiyear (latent)", -6.525029657843462),
+                                    ("houryear", -5.608738925969307),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.525029657843462),
+                                    ("Christmas<time-of-day> am|pm", -6.525029657843462),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.525029657843462),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.831882477283517),
+                                    ("intersectin|during <named-month>|year", -6.525029657843462),
+                                    ("<time-of-day> am|pmintersect", -5.272266689348094),
+                                    ("Earth Houryear (latent)", -6.525029657843462),
+                                    ("Ganesh Chaturthiyear (latent)", -6.525029657843462),
+                                    ("Family Dayyear (latent)", -5.608738925969307),
+                                    ("Octoberyear (latent)", -5.020952261067188),
+                                    ("intersect<time-of-day> am|pm", -6.525029657843462),
+                                    ("Mattu Pongalyear (latent)", -6.525029657843462),
+                                    ("Saturday<part-of-day> at <time-of-day>", -6.525029657843462),
+                                    ("Shavuotyear (latent)", -6.525029657843462),
+                                    ("Parsi New Yearyear (latent)", -5.608738925969307),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.525029657843462),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.525029657843462),
+                                    ("todayin|within|after <duration>", -6.525029657843462),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -6.119564549735298),
+                                    ("Marchyear (latent)", -6.525029657843462),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hhhmm",
+                                     -6.119564549735298),
+                                    ("Sukkotyear (latent)", -6.119564549735298),
+                                    ("hhhmmintersect", -6.119564549735298),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.119564549735298),
+                                    ("Clean Mondayyear (latent)", -6.119564549735298),
+                                    ("monthhour", -6.119564549735298),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.608738925969307),
+                                    ("todayat <time-of-day>", -6.525029657843462),
+                                    ("Thursday<time> timezone", -4.127134385045092),
+                                    ("tonight<time-of-day> am|pm", -6.525029657843462),
+                                    ("time-of-day (latent)tonight", -6.119564549735298),
+                                    ("from|since|after <time>December", -6.525029657843462),
+                                    ("<time-of-day> am|pmon <day>", -4.510126637301197),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.525029657843462),
+                                    ("yyyy-mm-ddhh:mm:ss", -6.119564549735298),
+                                    ("dayday", -3.7524409356036807),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.119564549735298),
+                                    ("mm/ddat <time-of-day>", -6.525029657843462),
+                                    ("tonightat <time-of-day>", -5.426417369175352),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.831882477283517),
+                                    ("Dayananda Saraswati Jayantiyear (latent)",
+                                     -6.525029657843462),
+                                    ("today<time-of-day> am|pm", -6.525029657843462),
+                                    ("Februarythe <day-of-month> (ordinal)", -6.119564549735298),
+                                    ("at <time-of-day><time> <part-of-day>", -6.525029657843462),
+                                    ("<day-of-month> (ordinal)intersect", -6.119564549735298),
+                                    ("mm/dd<time-of-day> am|pm", -6.525029657843462),
+                                    ("hourhour", -3.554615192273761),
+                                    ("Mahavir Jayantiyear (latent)", -6.119564549735298),
+                                    ("Navaratriin|during <named-month>|year", -6.525029657843462),
+                                    ("National Patriots' Dayyear (latent)", -5.831882477283517),
+                                    ("Wednesdaythis|last|next <cycle>", -6.525029657843462),
+                                    ("Lentyear (latent)", -6.525029657843462),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.6532274809418706),
+                                    ("Boghiyear (latent)", -6.525029657843462),
+                                    ("dayyear", -1.861590563731395),
+                                    ("Karva Chauthin|during <named-month>|year",
+                                     -6.525029657843462),
+                                    ("Thursdayfrom|since|after <time>", -6.119564549735298),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.525029657843462),
+                                    ("Thursdayat <time-of-day>", -5.831882477283517),
+                                    ("Islamic New Yearyear (latent)", -6.119564549735298),
+                                    ("Laylat al-Qadryear (latent)", -5.608738925969307),
+                                    ("part of days<time-of-day> am|pm", -6.525029657843462),
+                                    ("Discovery Dayyear (latent)", -6.119564549735298),
+                                    ("Shrove Tuesdayyear (latent)", -6.525029657843462),
+                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
+                                     -5.831882477283517),
+                                    ("hourminute", -6.119564549735298),
+                                    ("<time-of-day> am|pmtomorrow", -5.608738925969307),
+                                    ("Yom Kippuryear (latent)", -6.525029657843462),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.831882477283517),
+                                    ("<part-of-day> of <time>year (latent)", -6.525029657843462),
+                                    ("minutehour", -5.272266689348094),
+                                    ("Kaanum Pongalyear (latent)", -6.119564549735298),
+                                    ("Maha Saptamiyear (latent)", -6.525029657843462),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.831882477283517),
+                                    ("time-of-day (latent)tomorrow", -5.608738925969307),
+                                    ("part of daysat <time-of-day>", -4.915591745409362),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.510126637301197),
+                                    ("for <duration> from <time>December", -6.525029657843462),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.525029657843462),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.272266689348094),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhhhmm",
+                                     -5.272266689348094),
+                                    ("time-of-day (latent)this <part-of-day>", -6.525029657843462),
+                                    ("Pentecostyear (latent)", -6.525029657843462),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.272266689348094),
+                                    ("<day-of-month> (ordinal)February", -6.525029657843462),
+                                    ("Eid al-Fitryear (latent)", -5.1387352967235715),
+                                    ("Vasant Panchamiin|during <named-month>|year",
+                                     -6.525029657843462),
+                                    ("Mondayin|during the <part-of-day>", -6.525029657843462),
+                                    ("Chhathin|during <named-month>|year", -6.525029657843462),
+                                    ("Diwaliin|during <named-month>|year", -6.525029657843462),
+                                    ("this <part-of-day><time-of-day> am|pm", -6.525029657843462),
+                                    ("Vaisakhiin|during <named-month>|year", -6.525029657843462),
+                                    ("Guru Ravidass Jayantiyear (latent)", -5.272266689348094),
+                                    ("Raksha Bandhanyear (latent)", -6.525029657843462),
+                                    ("daysecond", -6.119564549735298),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.119564549735298),
+                                    ("Ratha-Yatrayear (latent)", -6.525029657843462),
+                                    ("Ashurayear (latent)", -6.525029657843462),
+                                    ("Tuesdayin|during <named-month>|year", -6.525029657843462),
+                                    ("Chinese New Yearyear (latent)", -6.525029657843462),
+                                    ("tomorrowintersect", -6.525029657843462),
+                                    ("Lag BaOmeryear (latent)", -6.525029657843462),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.525029657843462),
+                                    ("Eid al-Adhayear (latent)", -4.384963494347192),
+                                    ("intersectin|during the <part-of-day>", -6.525029657843462),
+                                    ("Palm Sundayyear (latent)", -6.525029657843462),
+                                    ("Christmasat <time-of-day>", -6.525029657843462),
+                                    ("Passoveryear (latent)", -6.525029657843462),
+                                    ("Lazarus Saturdayyear (latent)", -6.525029657843462),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.525029657843462),
+                                    ("hhhmmon <day>", -5.608738925969307),
+                                    ("Yom HaShoahyear (latent)", -6.119564549735298),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -6.119564549735298),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.525029657843462),
+                                    ("Septemberyear (latent)", -6.119564549735298),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.020952261067188),
+                                    ("Halloweenyear (latent)", -6.525029657843462),
+                                    ("<ordinal> last <cycle> of <time>year (latent)",
+                                     -6.119564549735298),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.831882477283517),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -6.525029657843462),
+                                    ("at <time-of-day>intersect", -5.608738925969307),
+                                    ("Rosh Hashanahyear (latent)", -5.831882477283517),
+                                    ("Dhanterasyear (latent)", -6.525029657843462),
+                                    ("Tu BiShvatyear (latent)", -6.525029657843462),
+                                    ("<day-of-month> (ordinal)December", -5.831882477283517),
+                                    ("Holiyear (latent)", -5.831882477283517),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.525029657843462),
+                                    ("Holika Dahanyear (latent)", -5.831882477283517),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.119564549735298),
+                                    ("dayminute", -3.1751255705688575),
+                                    ("Mawlidyear (latent)", -6.525029657843462),
+                                    ("from <datetime> - <datetime> (interval)on <day>",
+                                     -6.119564549735298),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.525029657843462),
+                                    ("Jumu'atul-Widayear (latent)", -5.608738925969307),
+                                    ("minuteday", -2.775525581913091),
+                                    ("absorption of , after named dayintersect",
+                                     -5.831882477283517),
+                                    ("intersectyear (latent)", -6.525029657843462),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.525029657843462),
+                                    ("time-of-day (latent)in|within|after <duration>",
+                                     -6.525029657843462),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.525029657843462),
+                                    ("intersecthhhmm", -6.119564549735298),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.525029657843462),
+                                    ("Boss's Dayyear (latent)", -6.119564549735298),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.525029657843462),
+                                    ("Global Youth Service Dayyear (latent)", -6.525029657843462),
+                                    ("Dhanterasin|during <named-month>|year", -6.525029657843462),
+                                    ("tonight<time-of-day> o'clock", -6.525029657843462),
+                                    ("Tisha B'Avyear (latent)", -6.525029657843462),
+                                    ("Isra and Mi'rajyear (latent)", -5.608738925969307),
+                                    ("at <time-of-day>on <day>", -4.915591745409362),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.119564549735298),
+                                    ("time-of-day (latent)<time> <part-of-day>",
+                                     -5.831882477283517),
+                                    ("Christmasyear (latent)", -6.119564549735298),
+                                    ("Saturdayintersect", -6.525029657843462),
+                                    ("Naraka Chaturdashiyear (latent)", -6.119564549735298),
+                                    ("Thai Pongalin|during <named-month>|year", -6.525029657843462),
+                                    ("dayweek", -6.525029657843462),
+                                    ("Easter Sundayyear (latent)", -5.831882477283517),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <day>",
+                                     -6.119564549735298),
+                                    ("Labour Dayyear (latent)", -6.525029657843462),
+                                    ("weekyear", -5.426417369175352),
+                                    ("King's Dayyear (latent)", -5.020952261067188),
+                                    ("hh:mmin|during the <part-of-day>", -5.608738925969307),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -6.119564549735298),
+                                    ("first|second|third|fourth|fifth <day-of-week> of <time>year (latent)",
+                                     -5.831882477283517),
+                                    ("Hanukkahyear (latent)", -5.831882477283517),
+                                    ("Rama Navamiyear (latent)", -6.525029657843462),
+                                    ("February<time> <part-of-day>", -6.525029657843462),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.831882477283517),
+                                    ("Great Lentyear (latent)", -6.525029657843462),
+                                    ("tomorrowat <time-of-day>", -5.831882477283517),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -6.525029657843462),
+                                    ("tomorrow<part-of-day> at <time-of-day>", -6.119564549735298),
+                                    ("Ugadiyear (latent)", -5.1387352967235715),
+                                    ("Vaisakhiyear (latent)", -5.831882477283517),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
+                                     -5.831882477283517),
+                                    ("last <cycle> of <time>year (latent)", -5.831882477283517),
+                                    ("at <time-of-day>tomorrow", -6.119564549735298),
+                                    ("tomorrow<time-of-day> am|pm", -6.525029657843462),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.525029657843462),
+                                    ("Diwaliyear (latent)", -6.525029657843462),
+                                    ("between <time> and <time>on <day>", -6.119564549735298),
+                                    ("Black Fridayyear (latent)", -6.119564549735298),
+                                    ("the <ordinal> last <cycle> of <time>year (latent)",
+                                     -6.525029657843462),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.525029657843462),
+                                    ("Chhathyear (latent)", -6.119564549735298),
+                                    ("Vasant Panchamiyear (latent)", -6.525029657843462),
+                                    ("Rabindra Jayantiyear (latent)", -5.272266689348094),
+                                    ("this <part-of-day>at <time-of-day>", -5.272266689348094),
+                                    ("St Patrick's Dayyear (latent)", -6.525029657843462),
+                                    ("Thursday<time> (timezone)", -6.525029657843462),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.525029657843462),
+                                    ("Pargat Diwasyear (latent)", -5.272266689348094),
+                                    ("<datetime> - <datetime> (interval)July", -6.119564549735298),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -5.831882477283517),
+                                    ("Februaryintersect", -6.525029657843462),
+                                    ("Mother's Dayyear (latent)", -6.525029657843462),
+                                    ("Simchat Torahyear (latent)", -6.525029657843462),
+                                    ("Victoria Dayyear (latent)", -6.119564549735298),
+                                    ("minuteyear", -6.525029657843462)],
+                               n = 525},
+                   koData =
+                     ClassData{prior = -0.9652283125692465,
+                               unseen = -6.8679744089702925,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursdayhhhmm", -4.669708707125663),
+                                    ("hourday", -3.571096418457553),
+                                    ("<hour-of-day> <integer><time-of-day> am|pm",
+                                     -6.173786103901937),
+                                    ("<day-of-month> (ordinal)August", -6.173786103901937),
+                                    ("dayhour", -3.499637454475408),
+                                    ("<time> timezoneyear (latent)", -5.480638923341991),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.2574953720277815),
+                                    ("Tuesdayfrom|since|after <time>", -5.480638923341991),
+                                    ("daymonth", -3.4657359027997265),
+                                    ("hourquarter", -5.2574953720277815),
+                                    ("monthyear", -4.9210231354065685),
+                                    ("<time-of-day> am|pmyear (latent)", -5.480638923341991),
+                                    ("Thai Pongalyear (latent)", -5.480638923341991),
+                                    ("intersecthh:mm", -6.173786103901937),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.768320995793772),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.173786103901937),
+                                    ("houryear", -4.382026634673881),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -6.173786103901937),
+                                    ("<day-of-month> (ordinal)October", -6.173786103901937),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.480638923341991),
+                                    ("hournograin", -4.9210231354065685),
+                                    ("<time-of-day> am|pmintersect", -4.9210231354065685),
+                                    ("Octoberyear (latent)", -6.173786103901937),
+                                    ("Good Fridayyear (latent)", -5.768320995793772),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.768320995793772),
+                                    ("early morningat <time-of-day>", -6.173786103901937),
+                                    ("until <time>on <day>", -5.480638923341991),
+                                    ("part of days<time-of-day> - <time-of-day> (interval)",
+                                     -6.173786103901937),
+                                    ("time-of-day (latent)intersect", -5.480638923341991),
+                                    ("todayin <number> (implicit minutes)", -6.173786103901937),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.480638923341991),
+                                    ("this <part-of-day><time-of-day> - <time-of-day> (interval)",
+                                     -6.173786103901937),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -6.173786103901937),
+                                    ("hh:mmon <day>", -4.9210231354065685),
+                                    ("hhhmmintersect", -5.768320995793772),
+                                    ("absorption of , after named dayJuly", -5.2574953720277815),
+                                    ("from|since|after <time>July", -5.768320995793772),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -5.2574953720277815),
+                                    ("Clean Mondayyear (latent)", -6.173786103901937),
+                                    ("monthhour", -6.173786103901937),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.768320995793772),
+                                    ("hourmonth", -4.033719940405666),
+                                    ("todayat <time-of-day>", -6.173786103901937),
+                                    ("hhhmmyear (latent)", -4.9210231354065685),
+                                    ("from|since|after <time>December", -6.173786103901937),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -6.173786103901937),
+                                    ("<time-of-day> am|pmon <day>", -4.9210231354065685),
+                                    ("Mondayyear (latent)", -5.480638923341991),
+                                    ("dayday", -4.033719940405666),
+                                    ("mm/ddat <time-of-day>", -5.768320995793772),
+                                    ("on <day>September", -5.480638923341991),
+                                    ("time-of-day (latent)September", -5.768320995793772),
+                                    ("hourhour", -4.0943445622221),
+                                    ("time-of-day (latent)on <day>", -4.669708707125663),
+                                    ("time-of-day (latent)<cycle> after|before <time>",
+                                     -5.768320995793772),
+                                    ("dayyear", -3.1292636661785136),
+                                    ("Thursdaymm/dd", -6.173786103901937),
+                                    ("New Year's Dayyear (latent)", -5.2574953720277815),
+                                    ("time-of-day (latent)Sunday", -5.768320995793772),
+                                    ("Thursdayfrom|since|after <time>", -4.469038011663511),
+                                    ("Thursdayat <time-of-day>", -4.564348191467836),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -6.173786103901937),
+                                    ("Aprilyear (latent)", -6.173786103901937),
+                                    ("the <day-of-month> (ordinal)July", -6.173786103901937),
+                                    ("the <day-of-month> (number)July", -6.173786103901937),
+                                    ("monthminute", -6.173786103901937),
+                                    ("<time-of-day> am|pmtomorrow", -5.768320995793772),
+                                    ("Thursdayhh:mm", -5.2574953720277815),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.768320995793772),
+                                    ("minutemonth", -4.033719940405666),
+                                    ("time-of-day (latent)Friday", -5.768320995793772),
+                                    ("minutehour", -6.173786103901937),
+                                    ("part of daysat <time-of-day>", -5.075173815233827),
+                                    ("time-of-day (latent)this|last|next <cycle>",
+                                     -3.822410846738459),
+                                    ("Augustyear (latent)", -5.768320995793772),
+                                    ("week-endin|during <named-month>|year", -6.173786103901937),
+                                    ("time-of-day (latent)Tuesday", -5.768320995793772),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.768320995793772),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.173786103901937),
+                                    ("tonight<time-of-day> - <time-of-day> (interval)",
+                                     -6.173786103901937),
+                                    ("Sundayyear (latent)", -5.2574953720277815),
+                                    ("hourweek", -5.2574953720277815),
+                                    ("the <day-of-month> (ordinal)Monday", -5.480638923341991),
+                                    ("Christmasat <time-of-day>", -6.173786103901937),
+                                    ("from|since|after <time>year (latent)", -5.075173815233827),
+                                    ("hhhmmon <day>", -5.2574953720277815),
+                                    ("yesterday<time-of-day> am|pm", -6.173786103901937),
+                                    ("<day-of-month> (ordinal)July", -5.480638923341991),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -6.173786103901937),
+                                    ("mm/ddyear (latent)", -6.173786103901937),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -6.173786103901937),
+                                    ("in|during <named-month>|yearyear (latent)",
+                                     -6.173786103901937),
+                                    ("at <time-of-day>intersect", -5.2574953720277815),
+                                    ("hh:mmyear (latent)", -4.787491742782046),
+                                    ("Holiyear (latent)", -6.173786103901937),
+                                    ("until <time><time-of-day> am|pm", -6.173786103901937),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.768320995793772),
+                                    ("dayminute", -3.311585222972468),
+                                    ("yyyy-mm-ddhh:mm", -5.768320995793772),
+                                    ("intersectfrom|since|after <time>", -5.768320995793772),
+                                    ("intersectSeptember", -4.301983927000345),
+                                    ("minuteday", -3.016785682751823),
+                                    ("absorption of , after named dayintersect",
+                                     -6.173786103901937),
+                                    ("intersectyear (latent)", -6.173786103901937),
+                                    ("Februaryin|during the <part-of-day>", -6.173786103901937),
+                                    ("<duration> after|before|from|past <time>December",
+                                     -6.173786103901937),
+                                    ("time-of-day (latent)July", -5.480638923341991),
+                                    ("Saturdayyear (latent)", -6.173786103901937),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.173786103901937),
+                                    ("<day-of-month> (ordinal)Monday", -4.9210231354065685),
+                                    ("at <time-of-day>on <day>", -5.2574953720277815),
+                                    ("absorption of , after named daySeptember",
+                                     -4.9210231354065685),
+                                    ("Naraka Chaturdashiyear (latent)", -6.173786103901937),
+                                    ("from|since|after <time>on <day>", -5.2574953720277815),
+                                    ("dayweek", -6.173786103901937),
+                                    ("Easter Sundayyear (latent)", -5.768320995793772),
+                                    ("Thursday<time-of-day> am|pm", -4.9210231354065685),
+                                    ("weekyear", -5.768320995793772),
+                                    ("time-of-day (latent)Thursday", -5.768320995793772),
+                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
+                                     -6.173786103901937),
+                                    ("<day-of-month> (ordinal)April", -6.173786103901937),
+                                    ("yyyy-mm-dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.768320995793772),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
+                                     -5.480638923341991),
+                                    ("Sundayfrom|since|after <time>", -6.173786103901937),
+                                    ("absorption of , after named dayFebruary",
+                                     -5.2574953720277815),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.768320995793772),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -6.173786103901937),
+                                    ("tomorrowat <time-of-day>", -6.173786103901937),
+                                    ("daynograin", -5.768320995793772),
+                                    ("Fridayin|during <named-month>|year", -6.173786103901937),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.768320995793772),
+                                    ("last <cycle> of <time>year (latent)", -5.768320995793772),
+                                    ("tomorrow<time-of-day> am|pm", -6.173786103901937),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -5.480638923341991),
+                                    ("Diwaliyear (latent)", -5.768320995793772),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -6.173786103901937),
+                                    ("this <part-of-day>at <time-of-day>", -5.2574953720277815),
+                                    ("Fridayyear (latent)", -5.2574953720277815),
+                                    ("time-of-day (latent)April", -6.173786103901937),
+                                    ("minuteyear", -3.9765615265657175)],
+                               n = 323}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.3581234841531944,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.2972515234679316, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2411620568168881),
+                                    ("integer (0..19)", -1.540445040947149)],
+                               n = 26}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.3737155789130304, unseen = -4.532599493153256,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -3.4231762883809305),
+                                    ("minuteminute", -2.91235066461494),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("hh:mmhh:mm", -2.91235066461494),
+                                    ("dayday", -1.9568392195875037),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -3.4231762883809305),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
+                                    ("hourhour", -3.4231762883809305),
+                                    ("minutehour", -3.4231762883809305),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.828641396489095),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.29191040856130207, unseen = -5.14166355650266,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.570849079588725),
+                                    ("dayhour", -3.056356895370426),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)intersect", -4.442651256490317),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.7495040759303713),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.442651256490317),
+                                    ("hh:mmtime-of-day (latent)", -3.5263605246161616),
+                                    ("hh:mm<time-of-day> am|pm", -4.037186148382152),
+                                    ("minuteminute", -3.5263605246161616),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.5263605246161616),
+                                    ("hh:mmhh:mm", -4.442651256490317),
+                                    ("dayday", -1.916922612182061),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)intersect", -4.442651256490317),
+                                    ("hourhour", -3.1898882879949486),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("dayyear", -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("minutehour", -3.3440389678222067),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("hh:mmintersect", -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)intersect", -4.037186148382152),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect", -4.037186148382152)],
+                               n = 59}}),
+       ("Saturday",
+        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}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.845826690498331),
+                                    ("weekmonth", -1.845826690498331),
+                                    ("week (grain)October", -1.845826690498331),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.845826690498331),
+                                    ("weekday", -1.3350010667323402)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second (grain) March", -1.5040773967762742),
+                                    ("secondmonth", -1.5040773967762742)],
+                               n = 1}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.5649493574615367),
+                                    ("minuteminute", -1.8718021769015913),
+                                    ("hh:mmhh:mm", -1.8718021769015913),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.5649493574615367),
+                                    ("hourhour", -2.5649493574615367),
+                                    ("hourminute", -2.5649493574615367),
+                                    ("minutehour", -2.0541237336955462),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.9704144655697013),
+                                    ("time-of-day (latent)hh:mm", -2.9704144655697013),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.5649493574615367)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.9218125974762528),
+                                    ("hh:mm<time-of-day> am|pm", -2.6149597780361984),
+                                    ("minuteminute", -2.6149597780361984),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -1.9218125974762528),
+                                    ("hh:mmhh:mm", -3.0204248861443626),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("minutehour", -1.7676619176489945),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.0204248861443626)],
+                               n = 14}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (20..90)integer (0..19)", -0.2876820724517809)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.2231435513142097)],
+                               n = 3}}),
+       ("Global Youth Service 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}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.13828701585409087,
+                               unseen = -5.484796933490655,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.5317807984289897e-2),
+                                    ("intersect 2 numbers", -4.0943445622221)],
+                               n = 236},
+                   koData =
+                     ClassData{prior = -2.046770759390287, unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.5841201044498106),
+                                    ("negative numbers", -0.40546510810816444),
+                                    ("compose by multiplication", -2.277267285009756)],
+                               n = 35}}),
+       ("mm/dd/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Civic Holiday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.833213344056216),
+                                    ("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -2.1400661634962708),
+                                    ("dayday", -1.4469189829363254),
+                                    ("hourminute", -1.916922612182061),
+                                    ("hhhmm<integer> <unit-of-duration>", -2.833213344056216),
+                                    ("intersect<integer> <unit-of-duration>", -2.1400661634962708),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -2.4277482359480516),
+                                    ("from|since|after <time><integer> <unit-of-duration>",
+                                     -2.1400661634962708)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.540445040947149),
+                                    ("December<integer> <unit-of-duration>", -1.540445040947149)],
+                               n = 2}}),
+       ("hhhmm",
+        Classifier{okData =
+                     ClassData{prior = -2.247285585205863e-2,
+                               unseen = -3.828641396489095,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 44},
+                   koData =
+                     ClassData{prior = -3.8066624897703196,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("as soon as possible",
+        Classifier{okData =
+                     ClassData{prior = 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.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mahavir Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.21357410029805904,
+                               unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
+                   koData =
+                     ClassData{prior = -1.6486586255873816,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dayananda Saraswati Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        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}}),
+       ("first|second|third|fourth|fifth <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8649974374866046),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdaythis|last|next <cycle>",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -2.538973871058276),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.538973871058276),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6916760106710724),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.538973871058276)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -2.5649493574615367),
+                                    ("time-of-day (latent)integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer 21..99", -2.159484249353372),
+                                    ("hour", -0.8602012652231115),
+                                    ("at <time-of-day>integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer (20..90)", -1.8718021769015913)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("time-of-day (latent)integer (20..90)", -1.3862943611198906)],
+                               n = 1}}),
+       ("Rama Navami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Labour Day",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.5257286443082556),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.120263536200091),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6094379124341003),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.120263536200091)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.8718021769015913),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.466337068793427)],
+                               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.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("half a <time-grain>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("King's Day",
+        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}}),
+       ("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}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) of <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.9810014688665833),
+                                    ("integer (numeric)integer (numeric)July", -1.9810014688665833),
+                                    ("integer (numeric)ordinal (digits)July", -1.9810014688665833),
+                                    ("ordinal (digits)integer (numeric)July", -1.9810014688665833),
+                                    ("month", -0.8023464725249373)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Discovery Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.546237407675729e-2,
+                               unseen = -4.477336814478207,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 86},
+                   koData =
+                     ClassData{prior = -3.1135153092103742, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.4849066497880004),
+                                    ("part of daysintersect", -2.4849066497880004),
+                                    ("hourday", -0.9808292530117262),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.4849066497880004),
+                                    ("part of daysthis <time>", -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (ordinal or number) of <named-month>",
+                                     -2.4849066497880004),
+                                    ("part of daysChristmas", -2.0794415416798357)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayday", -1.2992829841302609),
+                                    ("hourminute", -1.7047480922384253),
+                                    ("intersect<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("one twenty two", -1.0986122886681098),
+                                    ("one eleven", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <day-of-week> from <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Fridaynow", -2.2512917986064953),
+                                    ("integer (0..19)Tuesdaynow", -2.2512917986064953),
+                                    ("integer (0..19)Sundaynow", -2.2512917986064953),
+                                    ("integer (0..19)Fridaynow", -2.2512917986064953),
+                                    ("daynograin", -0.9985288301111273),
+                                    ("integer (numeric)Sundaynow", -2.2512917986064953),
+                                    ("integer (numeric)Tuesdaynow", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7339691750802004,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6422277352570913),
+                                    ("ordinal (digits)February", -2.740840023925201),
+                                    ("integer (numeric)February", -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("ordinal (digits)March", -2.3353749158170367),
+                                    ("integer (numeric)July", -2.740840023925201)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.6539264674066639,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.550597412411167),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("month", -0.8574502318512216),
+                                    ("integer (numeric)July", -1.550597412411167)],
+                               n = 13}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> minutes to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("minutehour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rabindra Jayanti",
+        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 Twelfth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pargat Diwas",
+        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}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.740840023925201),
+                                    ("hour", -0.7259370033829361),
+                                    ("part of days", -0.7949298748698876)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("St Patrick'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}}),
+       ("tomorrow",
+        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}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0116009116784799),
+                                    ("hh:mm", -1.9924301646902063), ("hour", -1.0116009116784799),
+                                    ("minute", -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("Groundhog Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.41284521540578695,
+                               unseen = -5.262690188904886,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2685113254635072),
+                                    ("month (grain)", -2.367123614131617),
+                                    ("year (grain)", -2.4242820279715653),
+                                    ("week (grain)", -1.2685113254635072),
+                                    ("quarter", -3.648057459593681), ("year", -2.4242820279715653),
+                                    ("month", -2.367123614131617),
+                                    ("quarter (grain)", -3.648057459593681)],
+                               n = 90},
+                   koData =
+                     ClassData{prior = -1.0840134892469568, unseen = -4.653960350157523,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8111775550851565),
+                                    ("month (grain)", -2.4471663218051534),
+                                    ("year (grain)", -3.0349529867072724),
+                                    ("second", -3.0349529867072724),
+                                    ("week (grain)", -1.8111775550851565),
+                                    ("day", -2.2464956263430023), ("quarter", -3.0349529867072724),
+                                    ("year", -3.0349529867072724),
+                                    ("second (grain) ", -3.0349529867072724),
+                                    ("month", -2.4471663218051534),
+                                    ("quarter (grain)", -3.0349529867072724),
+                                    ("day (grain)", -2.2464956263430023)],
+                               n = 46}}),
+       ("Mother's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Victoria Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ratha-Yatra",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.5260563034950494),
+                                    ("ordinal (digits)", -0.24512245803298496)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.5753641449035618),
+                                    ("ordinal (digits)", -0.8266785731844679)],
+                               n = 14}}),
+       ("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.8649974374866046,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.5465437063680699,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
+       ("Guru Ravidass Jayanti",
+        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.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}}),
+       ("Chinese New Year",
+        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}}),
+       ("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 = -7.696104113612832e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -2.6026896854443837,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("Orthodox Good Friday",
+        Classifier{okData =
+                     ClassData{prior = 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.7048889984366284, unseen = -4.867534450455582,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.763846956391606e-2),
+                                    ("integer (0..19)", -2.374905754573672)],
+                               n = 127},
+                   koData =
+                     ClassData{prior = -0.6815416344396374, unseen = -4.890349128221754,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.15541410387403026),
+                                    ("integer (0..19)", -1.9383629434199303)],
+                               n = 130}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -2.0149030205422647),
+                                    ("MondayMarch", -2.0149030205422647),
+                                    ("FridayOctober", -1.6094379124341003),
+                                    ("Sundayintersect", -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6112300580920585, unseen = -5.318119993844216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6741486494265287),
+                                    ("integer (0..19)year (grain)", -3.115981401705568),
+                                    ("integer (numeric)day (grain)", -2.6741486494265287),
+                                    ("integer (0..19)second (grain) ", -3.926911617921897),
+                                    ("integer (0..19)hour (grain)", -3.115981401705568),
+                                    ("second", -3.521446509813732),
+                                    ("integer (numeric)second (grain) ", -4.214593690373678),
+                                    ("integer (numeric)year (grain)", -3.367295829986474),
+                                    ("day", -2.4228342211456226), ("year", -2.605155777939577),
+                                    ("integer (numeric)week (grain)", -3.2337644373619514),
+                                    ("integer (0..19)month (grain)", -3.703768066607687),
+                                    ("integer (20..90)minute (grain)", -4.620058798481842),
+                                    ("hour", -2.7482566215802504), ("month", -3.367295829986474),
+                                    ("integer (numeric)minute (grain)", -2.605155777939577),
+                                    ("integer (0..19)minute (grain)", -3.2337644373619514),
+                                    ("integer (numeric)month (grain)", -4.214593690373678),
+                                    ("minute", -2.1777117631126375),
+                                    ("integer (numeric)hour (grain)", -3.703768066607687),
+                                    ("integer (0..19)day (grain)", -3.703768066607687),
+                                    ("integer (0..19)week (grain)", -3.367295829986474)],
+                               n = 89},
+                   koData =
+                     ClassData{prior = -0.782378314287888, unseen = -5.170483995038151,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.5553480614894135),
+                                    ("integer (0..19)year (grain)", -4.0661736852554045),
+                                    ("integer (numeric)day (grain)", -4.0661736852554045),
+                                    ("integer (numeric)quarter (grain)", -4.0661736852554045),
+                                    ("integer (numeric)year (grain)", -4.0661736852554045),
+                                    ("day", -3.5553480614894135), ("quarter", -3.5553480614894135),
+                                    ("year", -3.5553480614894135),
+                                    ("integer (numeric)week (grain)", -4.0661736852554045),
+                                    ("integer (0..19)month (grain)", -4.0661736852554045),
+                                    ("hour", -1.157452788691043), ("month", -3.5553480614894135),
+                                    ("integer (numeric)minute (grain)", -4.471638793363569),
+                                    ("integer (numeric)month (grain)", -4.0661736852554045),
+                                    ("minute", -4.471638793363569),
+                                    ("integer (numeric)hour (grain)", -1.157452788691043),
+                                    ("integer (0..19)day (grain)", -4.0661736852554045),
+                                    ("integer (0..19)week (grain)", -4.0661736852554045),
+                                    ("integer (0..19)quarter (grain)", -4.0661736852554045)],
+                               n = 75}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.3217558399823195),
+                                    ("integer (numeric)integer (numeric)July", -1.3217558399823195),
+                                    ("month", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guru Gobind Singh Jayanti",
+        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}}),
+       ("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}}),
+       ("Krishna Janmashtami",
+        Classifier{okData =
+                     ClassData{prior = 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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2607262624632527, unseen = -5.71042701737487,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>", -3.7612001156935624),
+                                    ("integer after|past <hour-of-day>", -4.3208159036289855),
+                                    ("at <time-of-day>", -2.374905754573672),
+                                    ("<time-of-day> o'clock", -4.608497976080766),
+                                    ("half after|past <hour-of-day>", -4.608497976080766),
+                                    ("second", -5.01396308418893), ("hh:mm:ss", -5.01396308418893),
+                                    ("<hour-of-day> <integer>", -4.097672352314775),
+                                    ("<integer> minutes to|till|before <hour-of-day>",
+                                     -5.01396308418893),
+                                    ("time-of-day (latent)", -1.6997770795164049),
+                                    ("hhmm (latent)", -5.01396308418893),
+                                    ("hh:mm", -2.374905754573672),
+                                    ("quarter after|past <hour-of-day>", -3.5098856874126563),
+                                    ("until <time>", -4.3208159036289855),
+                                    ("about|exactly <time-of-day>", -5.01396308418893),
+                                    ("hour", -1.252762968495368),
+                                    ("<time-of-day> sharp|exactly", -5.01396308418893),
+                                    ("minute", -1.6817585740137264)],
+                               n = 141},
+                   koData =
+                     ClassData{prior = -1.4718165345580525,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.248434627109745),
+                                    ("from|since|after <time>", -3.248434627109745),
+                                    ("at <time-of-day>", -3.536116699561526),
+                                    ("time-of-day (latent)", -1.1689930854299093),
+                                    ("hh:mm", -3.536116699561526),
+                                    ("until <time>", -3.9415818076696905),
+                                    ("hour", -1.0238110755854113), ("minute", -2.6888188391743224)],
+                               n = 42}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <day>",
+        Classifier{okData =
+                     ClassData{prior = -0.21511137961694557, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.8803128665695), ("mm/dd", -3.3843902633457743),
+                                    ("absorption of , after named day", -2.691243082785829),
+                                    ("intersect", -2.691243082785829),
+                                    ("Saturday", -2.691243082785829),
+                                    ("Friday", -2.9789251552376097), ("day", -0.8194409058842375),
+                                    ("the <day-of-month> (ordinal)", -2.9789251552376097),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.691243082785829)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.6422277352570913,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.6582280766035324),
+                                    ("day", -1.0986122886681098),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.6582280766035324)],
+                               n = 6}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Administrative Professionals' 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}}),
+       ("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 = -1.0296194171811581,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708),
+                                    ("year (grain)", -2.4277482359480516),
+                                    ("second", -2.833213344056216),
+                                    ("week (grain)", -2.1400661634962708),
+                                    ("day", -2.1400661634962708),
+                                    ("minute (grain)", -2.833213344056216),
+                                    ("year", -2.4277482359480516),
+                                    ("second (grain) ", -2.833213344056216),
+                                    ("minute", -2.833213344056216),
+                                    ("day (grain)", -2.1400661634962708)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -2.3025850929940455),
+                                    ("quarter", -1.3470736479666092),
+                                    ("minute (grain)", -2.8134107167600364),
+                                    ("hour", -2.3025850929940455),
+                                    ("quarter (grain)", -1.3470736479666092),
+                                    ("minute", -2.8134107167600364)],
+                               n = 18}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.2237754316221157),
+                                    ("this|last|next <cycle>", -1.4469189829363254),
+                                    ("year", -0.7537718023763802)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.916290731874155),
+                                    ("year", -0.916290731874155)],
+                               n = 1}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.276666119016055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 70},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("upcoming <integer> <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rosh Hashanah",
+        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> <named-day> ago|back",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Thursday", -0.6931471805599453),
+                                    ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> upcoming <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = -0.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}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -8.961215868968717e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
+                   koData =
+                     ClassData{prior = -2.456735772821304, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from|past <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7691330875378672, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>hhhmm", -3.481240089335692),
+                                    ("a <unit-of-duration>Christmas", -3.481240089335692),
+                                    ("minuteminute", -3.481240089335692),
+                                    ("dayday", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>today", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.382627800667582),
+                                    ("minutehour", -1.7764919970972666),
+                                    ("daysecond", -3.481240089335692),
+                                    ("a <unit-of-duration>right now", -3.481240089335692),
+                                    ("minutenograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>Christmas", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -3.481240089335692),
+                                    ("secondnograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -2.5649493574615367),
+                                    ("yearday", -2.7880929087757464),
+                                    ("<integer> <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.481240089335692),
+                                    ("daynograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>now", -3.0757749812275272)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.6225296133459919, unseen = -4.276666119016055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterhour", -1.318240897874875),
+                                    ("dayhour", -3.56953269648137),
+                                    ("<integer> <unit-of-duration>intersect", -3.56953269648137),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -3.56953269648137),
+                                    ("a <unit-of-duration><time-of-day> am|pm", -2.065455299705096),
+                                    ("a <unit-of-duration>time-of-day (latent)",
+                                     -2.065455299705096),
+                                    ("dayday", -2.8763855159214247),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -3.56953269648137),
+                                    ("a <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.164067588373206),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -3.56953269648137)],
+                               n = 22}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -2.03688192726104),
+                                    ("time-of-day (latent)", -0.9382696385929302),
+                                    ("hour", -0.7375989431307791)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm",
+        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}}),
+       ("until <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -2.159484249353372),
+                                    ("time-of-day (latent)", -2.5649493574615367),
+                                    ("year", -2.159484249353372),
+                                    ("<time-of-day> am|pm", -1.8718021769015913),
+                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
+                                    ("minute", -1.6486586255873816)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.3025850929940455),
+                                    ("yesterday", -2.8134107167600364),
+                                    ("day", -2.8134107167600364),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("<time-of-day> am|pm", -3.2188758248682006),
+                                    ("hh:mm", -2.3025850929940455), ("hour", -1.4271163556401458),
+                                    ("minute", -1.8325814637483102)],
+                               n = 20}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.540445040947149),
+                                    ("Marcha <unit-of-duration>", -1.9459101490553135),
+                                    ("March<integer> <unit-of-duration>", -1.9459101490553135),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -1.9459101490553135),
+                                    ("Administrative Professionals' Day<integer> <unit-of-duration>",
+                                     -1.9459101490553135),
+                                    ("dayyear", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.5485659517488378, unseen = -5.43372200355424,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectthis|last|next <cycle>", -4.736198448394496),
+                                    ("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.736198448394496),
+                                    ("dayhour", -4.330733340286331),
+                                    ("daymonth", -2.0281482472922856),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.736198448394496),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.4834354798991276),
+                                    ("Wednesdayintersect", -4.736198448394496),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.349904087274605),
+                                    ("Black Fridaythis|last|next <cycle>", -4.736198448394496),
+                                    ("Labour Daythis|last|next <cycle>", -4.736198448394496),
+                                    ("<part-of-day> of <time>February", -4.736198448394496),
+                                    ("Saturday<time-of-day> am|pm", -4.736198448394496),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -4.330733340286331),
+                                    ("hourmonth", -4.736198448394496),
+                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
+                                     -4.04305126783455),
+                                    ("dayday", -2.4849066497880004),
+                                    ("the <day-of-month> (ordinal)February", -4.330733340286331),
+                                    ("WednesdayOctober", -4.736198448394496),
+                                    ("Wednesdaythis|last|next <cycle>", -4.330733340286331),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.4834354798991276),
+                                    ("dayyear", -3.6375861597263857),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.736198448394496),
+                                    ("Thursdayhh:mm", -4.330733340286331),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.736198448394496),
+                                    ("TuesdayOctober", -4.736198448394496),
+                                    ("the <day-of-month> (ordinal)March", -3.6375861597263857),
+                                    ("Mondaythis|last|next <cycle>", -3.8199077165203406),
+                                    ("Fridayintersect", -4.04305126783455),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -4.330733340286331),
+                                    ("intersectOctober", -4.330733340286331),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.8199077165203406),
+                                    ("Tuesdaythis|last|next <cycle>", -4.330733340286331),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.736198448394496),
+                                    ("dayminute", -2.9444389791664407),
+                                    ("minuteday", -3.4834354798991276),
+                                    ("this|last|next <cycle>Sunday", -4.736198448394496),
+                                    ("Sundaythis|last|next <cycle>", -4.736198448394496),
+                                    ("on <day><time-of-day> am|pm", -4.736198448394496),
+                                    ("intersectintersect", -4.736198448394496),
+                                    ("weekday", -4.736198448394496),
+                                    ("dayweek", -3.6375861597263857),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.330733340286331),
+                                    ("<datetime> - <datetime> (interval)July", -3.8199077165203406),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -4.04305126783455)],
+                               n = 78},
+                   koData =
+                     ClassData{prior = -0.8622235106038793, unseen = -5.231108616854587,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.532599493153256),
+                                    ("week-endOctober", -3.8394523125933104),
+                                    ("daymonth", -1.791759469228055),
+                                    ("TuesdaySeptember", -4.532599493153256),
+                                    ("Wednesdayintersect", -4.532599493153256),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.4339872044851463),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -4.532599493153256),
+                                    ("hournograin", -4.127134385045092),
+                                    ("from|since|after <time>July", -4.127134385045092),
+                                    ("hourmonth", -2.5866893440979424),
+                                    ("Fridaythis|last|next <cycle>", -4.532599493153256),
+                                    ("SundayFebruary", -4.532599493153256),
+                                    ("on <day>September", -3.8394523125933104),
+                                    ("WednesdayOctober", -4.532599493153256),
+                                    ("intersectnow", -4.127134385045092),
+                                    ("week-endintersect", -4.532599493153256),
+                                    ("dayyear", -4.532599493153256),
+                                    ("FridayJuly", -3.6163087612791007),
+                                    ("FridaySeptember", -4.127134385045092),
+                                    ("the <day-of-month> (ordinal)July", -3.6163087612791007),
+                                    ("WednesdayFebruary", -4.532599493153256),
+                                    ("minutemonth", -3.028522096376982),
+                                    ("Mondaythis|last|next <cycle>", -4.532599493153256),
+                                    ("SundayMarch", -4.532599493153256),
+                                    ("MondayFebruary", -4.127134385045092),
+                                    ("Fridayintersect", -4.532599493153256),
+                                    ("intersectOctober", -4.532599493153256),
+                                    ("dayminute", -4.532599493153256),
+                                    ("SaturdaySeptember", -4.532599493153256),
+                                    ("intersectSeptember", -3.146305132033365),
+                                    ("Tuesdaynow", -4.127134385045092),
+                                    ("MondayMarch", -4.532599493153256),
+                                    ("FridayOctober", -4.532599493153256),
+                                    ("daynograin", -4.127134385045092),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -4.532599493153256),
+                                    ("Tuesdayintersect", -4.532599493153256),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -4.532599493153256),
+                                    ("<datetime> - <datetime> (interval)July", -4.532599493153256),
+                                    ("Sundayintersect", -4.532599493153256)],
+                               n = 57}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5978370007556204, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.8622008809294686),
+                                    ("Martin Luther King's Day", -2.8622008809294686),
+                                    ("Mother's Day", -2.8622008809294686),
+                                    ("day", -1.157452788691043), ("Sunday", -2.8622008809294686),
+                                    ("Chinese New Year", -2.169053700369523),
+                                    ("Thanksgiving Day", -2.8622008809294686),
+                                    ("Easter Sunday", -2.8622008809294686),
+                                    ("hour", -2.8622008809294686), ("Tuesday", -2.8622008809294686),
+                                    ("week-end", -2.8622008809294686)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.7985076962177716,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.740840023925201), ("Friday", -2.3353749158170367),
+                                    ("day", -1.824549292051046), ("Sunday", -2.740840023925201),
+                                    ("hour", -1.6422277352570913),
+                                    ("week-end", -1.6422277352570913)],
+                               n = 9}}),
+       ("March",
+        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}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0149030205422647),
+                                    ("Thursdayordinal (digits)", -2.70805020110221),
+                                    ("day", -2.3025850929940455),
+                                    ("Augustordinal (digits)", -2.70805020110221),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.3025850929940455),
+                                    ("Tuesdayordinal (digits)", -2.70805020110221),
+                                    ("Octoberordinals (first..twentieth,thirtieth,...)",
+                                     -2.70805020110221),
+                                    ("month", -1.2039728043259361),
+                                    ("Marchordinal (digits)", -2.70805020110221)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>ordinal (digits)",
+                                     -1.9459101490553135),
+                                    ("Augustordinal (digits)", -1.9459101490553135),
+                                    ("month", -1.540445040947149)],
+                               n = 2}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6325225587435105, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.3350010667323402),
+                                    ("ordinal (digits)", -0.3053816495511819)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.7576857016975165, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.5306282510621704),
+                                    ("ordinal (digits)", -0.8873031950009028)],
+                               n = 15}}),
+       ("<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}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval) timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.8109302162163288),
+                                    ("hh:mmhh:mm", -1.5040773967762742),
+                                    ("hhhmmhhhmm", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm.dd.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -0.5679840376059393, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -3.068052935133617),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.9694406464655074),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.374905754573672),
+                                    ("integer (numeric)this|last|next <cycle>", -2.662587827025453),
+                                    ("ordinal (digits)February", -3.068052935133617),
+                                    ("integer (numeric)February", -2.662587827025453),
+                                    ("month", -0.8708283577973976),
+                                    ("ordinal (digits)March", -2.662587827025453),
+                                    ("integer (numeric)July", -3.068052935133617)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.8362480242006186, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.8622008809294686),
+                                    ("month", -0.916290731874155),
+                                    ("integer (numeric)July", -1.6094379124341003)],
+                               n = 13}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Labour Day weekend",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyyqq",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.3513752571634776),
+                                    ("Halloween", -3.044522437723423),
+                                    ("Boss's Day", -3.044522437723423),
+                                    ("Memorial Day", -3.044522437723423),
+                                    ("Monday", -2.639057329615259),
+                                    ("Discovery Day", -3.044522437723423),
+                                    ("Mother's Day", -3.044522437723423),
+                                    ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -3.044522437723423),
+                                    ("March", -3.044522437723423), ("month", -3.044522437723423),
+                                    ("Tuesday", -2.639057329615259)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.1972245773362196),
+                                    ("Saturday", -2.1972245773362196), ("day", -1.791759469228055)],
+                               n = 2}}),
+       ("<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}}),
+       ("the <ordinal> closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)Christmastoday",
+                                     -1.791759469228055),
+                                    ("dayday", -1.0986122886681098),
+                                    ("ordinal (digits)Christmastoday", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("ordinals (first..twentieth,thirtieth,...)MondayOctober",
+                                     -1.3862943611198906)],
+                               n = 1}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.652001563489282e-2),
+                                    ("integer (0..19)", -3.0910424533583156)],
+                               n = 42}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half a <time-grain>", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Purim",
+        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> 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 = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.8109302162163288),
+                                    ("year", -1.5040773967762742), ("month", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour (abbrev).",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               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 = -1.1631508098056809, unseen = -4.770684624465665,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.6635616461296463),
+                                    ("from|since|after <time>hh:mm", -3.152736022363656),
+                                    ("minuteminute", -1.5841201044498106),
+                                    ("<time> timezone<time> timezone", -3.3758795736778655),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.6635616461296463),
+                                    ("hh:mmhh:mm", -2.5649493574615367),
+                                    ("dayday", -2.5649493574615367),
+                                    ("hhhmmhhhmm", -3.152736022363656),
+                                    ("hourhour", -3.6635616461296463),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.6635616461296463),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.6635616461296463),
+                                    ("<time-of-day> am|pmhh:mm:ss", -4.069026754237811),
+                                    ("hoursecond", -3.6635616461296463),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.3758795736778655),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -3.152736022363656)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -0.3746934494414107, unseen = -5.308267697401205,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.204692619390966),
+                                    ("<time> timezonehhhmm", -4.204692619390966),
+                                    ("hourday", -3.00071981506503),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -4.61015772749913),
+                                    ("dayhour", -4.61015772749913),
+                                    ("daymonth", -3.6938669956249752),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <month>",
+                                     -3.6938669956249752),
+                                    ("<time-of-day> am|pmintersect", -4.61015772749913),
+                                    ("MondayOctober", -4.204692619390966),
+                                    ("from|since|after <time>hh:mm", -4.61015772749913),
+                                    ("hh:mm<time-of-day> am|pm", -3.5115454388310208),
+                                    ("hhhmmintersect", -4.61015772749913),
+                                    ("minuteminute", -2.167810692129926),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.917010546939185),
+                                    ("hh:mmhh:mm", -3.917010546939185),
+                                    ("dayday", -1.8067973465925955),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
+                                     -3.6938669956249752),
+                                    ("hhhmmhhhmm", -4.204692619390966),
+                                    ("hourhour", -3.6938669956249752),
+                                    ("hourminute", -4.61015772749913),
+                                    ("minutehour", -3.6938669956249752),
+                                    ("<time> timezonehh:mm", -4.61015772749913),
+                                    ("hh:mm<time> timezone", -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.61015772749913),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <named-month>",
+                                     -3.6938669956249752),
+                                    ("hh:mmintersect", -3.6938669956249752),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -4.61015772749913),
+                                    ("Christmastoday", -3.917010546939185),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.61015772749913),
+                                    ("from|since|after <time>intersect", -3.1060803307228566),
+                                    ("from|since|after <time>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.6938669956249752),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.204692619390966),
+                                    ("<time-of-day> am|pmhh:mm", -4.61015772749913),
+                                    ("from|since|after <time>the <day-of-month> (ordinal or number) of <named-month>",
+                                     -3.1060803307228566),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.61015772749913),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.204692619390966),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)intersect", -4.204692619390966)],
+                               n = 77}}),
+       ("Tuesday",
+        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}}),
+       ("New Year's Day",
+        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}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("National Patriots' Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.1340142157190256, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>hh:mm", -3.0633909220278057),
+                                    ("hh:mmtime-of-day (latent)", -3.2865344733420154),
+                                    ("minuteminute", -1.6770965609079151),
+                                    ("<time> timezone<time> timezone", -3.2865344733420154),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.979681653901961),
+                                    ("hh:mmhh:mm", -2.4756042571256867),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("hhhmmhhhmm", -3.0633909220278057),
+                                    ("hourhour", -2.4756042571256867),
+                                    ("minutehour", -2.4756042571256867),
+                                    ("<time-of-day> am|pmhh:mm:ss", -3.979681653901961),
+                                    ("hhhmmtime-of-day (latent)", -3.2865344733420154),
+                                    ("hoursecond", -3.5742165457937967),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -3.0633909220278057)],
+                               n = 37},
+                   koData =
+                     ClassData{prior = -0.38822330167365837,
+                               unseen = -5.247024072160486,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.143134726391533),
+                                    ("<time> timezonehhhmm", -4.143134726391533),
+                                    ("about|exactly <time-of-day>time-of-day (latent)",
+                                     -4.548599834499697),
+                                    ("until <time>time-of-day (latent)", -3.295836866004329),
+                                    ("from|since|after <time>hh:mm", -4.548599834499697),
+                                    ("hh:mmtime-of-day (latent)", -2.5336968139574325),
+                                    ("hh:mm<time-of-day> am|pm", -3.295836866004329),
+                                    ("minuteminute", -2.469158292819861),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.632309102625542),
+                                    ("hh:mmhh:mm", -3.855452653939752),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -4.143134726391533),
+                                    ("hhhmmhhhmm", -4.143134726391533),
+                                    ("at <time-of-day><time-of-day> am|pm", -4.548599834499697),
+                                    ("hourhour", -1.9836504770381604),
+                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
+                                     -3.855452653939752),
+                                    ("hourminute", -3.4499875458315876),
+                                    ("minutehour", -1.715386490443481),
+                                    ("<time> timezonehh:mm", -4.548599834499697),
+                                    ("hh:mm<time> timezone", -4.548599834499697),
+                                    ("hhhmmtime-of-day (latent)", -3.855452653939752),
+                                    ("until <time><time-of-day> am|pm", -4.143134726391533),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<time-of-day> am|pmhh:mm", -4.548599834499697),
+                                    ("<part-of-day> at <time-of-day>time-of-day (latent)",
+                                     -3.855452653939752),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.044522437723423),
+                                    ("at <time-of-day>time-of-day (latent)", -3.632309102625542),
+                                    ("<time> timezonetime-of-day (latent)", -3.855452653939752),
+                                    ("<integer> to|till|before <hour-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.855452653939752)],
+                               n = 78}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("Ugadi",
+        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}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.3646431135879093, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.691243082785829),
+                                    ("Marchinteger (numeric)", -2.9789251552376097),
+                                    ("Aprilinteger (numeric)", -3.3843902633457743),
+                                    ("month", -0.8194409058842375),
+                                    ("Februaryinteger (numeric)", -2.1316272948504063),
+                                    ("Septemberinteger (numeric)", -2.691243082785829),
+                                    ("Octoberinteger (numeric)", -2.691243082785829),
+                                    ("Julyinteger (numeric)", -1.9980959022258835)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.1856236656577395,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.3978952727983707),
+                                    ("Wednesday", -2.3978952727983707),
+                                    ("Saturday", -2.3978952727983707),
+                                    ("Monday", -1.7047480922384253), ("day", -0.8938178760220964),
+                                    ("Tuesday", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.143134726391533,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 61},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9924301646902063),
+                                    ("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.9924301646902063),
+                                    ("week (grain)intersect", -2.3978952727983707),
+                                    ("week (grain)September", -2.3978952727983707)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2335922215070942),
+                                    ("day (grain)May", -2.2335922215070942),
+                                    ("week (grain)year (latent)", -1.9459101490553135),
+                                    ("weekmonth", -1.7227665977411035),
+                                    ("week (grain)October", -2.2335922215070942),
+                                    ("weekyear", -1.9459101490553135),
+                                    ("week (grain)intersect", -2.2335922215070942)],
+                               n = 9}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("daymonth", -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("weekyear", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vaisakhi",
+        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.3364722366212129, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>intersect", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.2512917986064953),
+                                    ("<integer> + '\"from|since|after <time>", -2.2512917986064953),
+                                    ("dayday", -1.55814461804655),
+                                    ("minutehour", -1.845826690498331),
+                                    ("<integer> + '\"<time-of-day> am|pm", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.2512917986064953)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.8718021769015913),
+                                    ("<integer> + '\"from|since|after <time>", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.8718021769015913),
+                                    ("minutehour", -1.8718021769015913)],
+                               n = 2}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.791759469228055),
+                                    ("hh:mmhh:mm", -2.1972245773362196),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hhhmmhhhmm", -2.1972245773362196),
+                                    ("minutehour", -1.791759469228055),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.1972245773362196)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.1972245773362196),
+                                    ("hhhmmintersect", -2.1972245773362196),
+                                    ("minuteminute", -1.791759469228055),
+                                    ("minutehour", -1.791759469228055),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("hhhmmtime-of-day (latent)", -2.1972245773362196)],
+                               n = 4}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\" for year",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Black Fridaythis|last|next <cycle>", -2.9704144655697013),
+                                    ("Labour Daythis|last|next <cycle>", -2.9704144655697013),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -2.5649493574615367),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -2.277267285009756),
+                                    ("dayyear", -0.8909729238898653),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -2.9704144655697013),
+                                    ("intersectyear (latent)", -2.277267285009756),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -2.0541237336955462)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.772588722239781, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Fridaythis|last|next <cycle>", -1.7047480922384253),
+                                    ("dayyear", -1.7047480922384253)],
+                               n = 1}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -4.1672696400568074e-2,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
+                   koData =
+                     ClassData{prior = -3.1986731175506815,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime>/<datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("secondsecond", -0.916290731874155),
+                                    ("intersectintersect", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm:ssintersect", -0.916290731874155),
+                                    ("secondsecond", -0.916290731874155)],
+                               n = 1}}),
+       ("Mid-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}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)July", -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.3978952727983707),
+                                    ("integer (numeric)integer (numeric)July", -1.9924301646902063),
+                                    ("month", -0.8938178760220964),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shushan Purim",
+        Classifier{okData =
+                     ClassData{prior = 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 =
diff --git a/Duckling/Ranking/Classifiers/EN_GB.hs b/Duckling/Ranking/Classifiers/EN_GB.hs
--- a/Duckling/Ranking/Classifiers/EN_GB.hs
+++ b/Duckling/Ranking/Classifiers/EN_GB.hs
@@ -30,3236 +30,4188 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> to|till|before <hour-of-day>",
         Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = -8.961215868968717e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
-                   koData =
-                     ClassData{prior = -2.456735772821304, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.6049544685244844, unseen = -5.736572297479192,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 308},
-                   koData =
-                     ClassData{prior = -0.7898768070184965, unseen = -5.552959584921617,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 256}}),
-       ("<year> (bc|ad)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = -5.406722127027582e-2,
-                               unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -2.9444389791664407,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year", -1.5040773967762742),
-                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
-                               n = 1}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6739764335716716),
-                                    ("dayday", -1.1631508098056809),
-                                    ("day (grain)yesterday", -1.6739764335716716)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.6739764335716716),
-                                    ("year (grain)Christmas", -2.0794415416798357),
-                                    ("dayday", -2.0794415416798357),
-                                    ("day (grain)intersect", -1.6739764335716716),
-                                    ("day (grain)Easter Sunday", -2.0794415416798357),
-                                    ("yearday", -2.0794415416798357)],
-                               n = 4}}),
-       ("Easter Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Navaratri",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Shemini Atzeret",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ramadan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lazarus Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect 2 numbers",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("compose by multiplicationinteger (0..19)",
-                                     -0.2231435513142097)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
-                               n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("from|since|after <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.540445040947149, unseen = -4.248495242049359,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal or number) <named-month>",
-                                     -3.5409593240373143),
-                                    ("July", -3.5409593240373143),
-                                    ("year (latent)", -3.1354942159291497),
-                                    ("day", -3.1354942159291497),
-                                    ("time-of-day (latent)", -2.624668592163159),
-                                    ("year", -3.1354942159291497),
-                                    ("<time-of-day> am|pm", -2.624668592163159),
-                                    ("hh:mm", -2.624668592163159),
-                                    ("<day-of-month> (ordinal)", -3.5409593240373143),
-                                    ("hour", -2.03688192726104), ("month", -3.1354942159291497),
-                                    ("minute", -2.624668592163159),
-                                    ("August", -3.5409593240373143)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.2411620568168881, unseen = -5.111987788356543,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -4.007333185232471),
-                                    ("week", -4.412798293340635),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.412798293340635),
-                                    ("today", -4.412798293340635),
-                                    ("intersect", -2.540996116439044),
-                                    ("<time> for <duration>", -4.412798293340635),
-                                    ("second", -4.412798293340635), ("now", -3.71965111278069),
-                                    ("tomorrow", -4.007333185232471),
-                                    ("this|last|next <cycle>", -4.412798293340635),
-                                    ("day", -1.927891643552635),
-                                    ("time-of-day (latent)", -2.6210388241125804),
-                                    ("<time-of-day> am|pm", -4.007333185232471),
-                                    ("nograin", -3.71965111278069),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.412798293340635),
-                                    ("<day-of-month> (ordinal)", -4.007333185232471),
-                                    ("Easter Sunday", -4.412798293340635),
-                                    ("Christmas", -3.71965111278069), ("hour", -2.3978952727983707),
-                                    ("month", -4.412798293340635),
-                                    ("<datetime> - <datetime> (interval)", -3.1600353248452673),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.908720896564361),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -4.007333185232471),
-                                    ("minute", -1.927891643552635),
-                                    ("right now", -4.412798293340635),
-                                    ("<month> dd-dd (interval)", -3.71965111278069),
-                                    ("part of days", -4.412798293340635),
-                                    ("dd-dd <month> (interval)", -4.007333185232471)],
-                               n = 66}}),
-       ("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}}),
-       ("<ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.268683541318364),
-                                    ("daymonth", -2.268683541318364),
-                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.6741486494265287),
-                                    ("weekmonth", -1.7578579175523736),
-                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.6741486494265287),
-                                    ("weekyear", -1.9810014688665833),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
-                                     -2.6741486494265287)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom HaShoah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -1.6582280766035324),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)April", -2.3513752571634776),
-                                    ("month", -1.252762968495368)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.237332013101517e-2,
-                               unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("dayhour", -1.4816045409242156),
-                                    ("Mondayearly morning", -3.378724525810097),
-                                    ("time-of-day (latent)tonight", -3.378724525810097),
-                                    ("hourhour", -2.3978952727983707),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("todaypart of days", -3.784189633918261),
-                                    ("minutehour", -2.6855773452501515),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.378724525810097),
-                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
-                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
-                                    ("intersectpart of days", -3.784189633918261),
-                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("tomorrowpart of days", -2.3978952727983707),
-                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("yesterdaypart of days", -3.378724525810097),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("Mondaypart of days", -3.784189633918261)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -2.4277482359480516,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.772588722239781),
-                                    ("monthhour", -2.772588722239781),
-                                    ("hourhour", -2.772588722239781),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -2.772588722239781),
-                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.772588722239781)],
-                               n = 3}}),
-       ("dd/mm",
-        Classifier{okData =
-                     ClassData{prior = -1.2685113254635072,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -0.33024168687057687,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.4557388028063e-2, unseen = -5.003946305945459,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.898599985096005),
-                                    ("noon|midnight|EOD|end of day", -3.898599985096005),
-                                    ("integer after|past <hour-of-day>", -3.898599985096005),
-                                    ("half after|past <hour-of-day>", -4.304065093204169),
-                                    ("time-of-day (latent)", -1.6650077635889111),
-                                    ("hhmm (latent)", -3.6109179126442243),
-                                    ("<time-of-day> am|pm", -1.7783364488959144),
-                                    ("hh:mm", -3.3877743613300146),
-                                    ("about|exactly <time-of-day>", -3.898599985096005),
-                                    ("hour", -1.0459685551826876),
-                                    ("<time-of-day> sharp|exactly", -4.304065093204169),
-                                    ("minute", -2.10684051586795)],
-                               n = 68},
-                   koData =
-                     ClassData{prior = -2.512305623976115, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.4816045409242156),
-                                    ("dd/mm", -3.4965075614664802),
-                                    ("absorption of , after named day", -3.0910424533583156),
-                                    ("intersect", -3.0910424533583156),
-                                    ("Saturday", -2.803360380906535),
-                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
-                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.803360380906535),
-                                    ("hour", -3.4965075614664802)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.11122563511022437,
-                               unseen = -3.970291913552122,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 51},
-                   koData =
-                     ClassData{prior = -2.2512917986064953,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7884573603642702),
-                                    ("hh:mmhh:mm", -0.7884573603642702)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
-                                    ("minutehour", -0.7884573603642702)],
-                               n = 9}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Passover",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vesak",
-        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}}),
-       ("Earth 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}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -4.6913478822291435,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.295836866004329),
-                                    ("<integer> more <unit-of-duration>", -3.9889840465642745),
-                                    ("three-quarters of an hour", -3.0726933146901194),
-                                    ("<integer> + '\"", -3.295836866004329),
-                                    ("number.number hours", -3.9889840465642745),
-                                    ("second", -3.58351893845611),
-                                    ("half a <time-grain>", -3.0726933146901194),
-                                    ("day", -3.295836866004329), ("year", -3.9889840465642745),
-                                    ("<integer> <unit-of-duration>", -1.6376087894007967),
-                                    ("a <unit-of-duration>", -3.0726933146901194),
-                                    ("quarter of an hour", -3.0726933146901194),
-                                    ("hour", -2.6026896854443837),
-                                    ("about|exactly <duration>", -3.9889840465642745),
-                                    ("half an hour (abbrev).", -3.58351893845611),
-                                    ("<integer> and an half hour", -3.9889840465642745),
-                                    ("minute", -1.2809338454620642)],
-                               n = 45},
-                   koData =
-                     ClassData{prior = -2.3025850929940455, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -2.2335922215070942), ("year", -1.9459101490553135),
-                                    ("<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("a <unit-of-duration>", -2.2335922215070942)],
-                               n = 5}}),
-       ("January",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Mattu Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.48550781578170077,
-                               unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -0.9555114450274363,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("Shavuot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> <duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayyear", -0.6931471805599453),
-                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("Boss's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Orthodox Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("May",
-        Classifier{okData =
-                     ClassData{prior = 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.4711784874188598, unseen = -6.75343791859778,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Navaratriyear (latent)", -6.059123195581797),
-                                    ("Father's Dayyear (latent)", -6.059123195581797),
-                                    ("Ramadanyear (latent)", -6.059123195581797),
-                                    ("<datetime> - <datetime> (interval)on <date>",
-                                     -4.8063602270864285),
-                                    ("Bhai Doojyear (latent)", -6.059123195581797),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.8063602270864285),
-                                    ("hourday", -4.354375103343371),
-                                    ("dayhour", -3.2557628146752617),
-                                    ("Martin Luther King's Dayyear (latent)", -5.653658087473633),
-                                    ("Shemini Atzeretyear (latent)", -6.059123195581797),
-                                    ("daymonth", -5.1428324637076415),
-                                    ("monthday", -5.653658087473633),
-                                    ("monthyear", -4.267363726353742),
-                                    ("Yom Ha'atzmautyear (latent)", -6.059123195581797),
-                                    ("Vijayadashamiyear (latent)", -6.059123195581797),
-                                    ("Thanksgiving Dayyear (latent)", -4.9605109069136875),
-                                    ("Thai Pongalyear (latent)", -5.365976015021851),
-                                    ("Thiru Onamyear (latent)", -5.365976015021851),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.059123195581797),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -6.059123195581797),
-                                    ("houryear", -5.365976015021851),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -6.059123195581797),
-                                    ("Christmas<time-of-day> am|pm", -6.059123195581797),
-                                    ("last <day-of-week> of <time>year (latent)",
-                                     -6.059123195581797),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.365976015021851),
-                                    ("<time-of-day> am|pmintersect", -4.8063602270864285),
-                                    ("Earth Houryear (latent)", -6.059123195581797),
-                                    ("Octoberyear (latent)", -4.555045798805523),
-                                    ("intersect<time-of-day> am|pm", -6.059123195581797),
-                                    ("Mattu Pongalyear (latent)", -6.059123195581797),
-                                    ("Shavuotyear (latent)", -6.059123195581797),
-                                    ("Dhanterasin <named-month>|year", -6.059123195581797),
-                                    ("at <time-of-day>in|within|after <duration>",
-                                     -6.059123195581797),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.059123195581797),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -5.653658087473633),
-                                    ("Marchyear (latent)", -6.059123195581797),
-                                    ("Sukkotyear (latent)", -5.653658087473633),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -6.059123195581797),
-                                    ("Clean Mondayyear (latent)", -5.653658087473633),
-                                    ("monthhour", -5.653658087473633),
-                                    ("todayat <time-of-day>", -6.059123195581797),
-                                    ("Thursday<time> timezone", -4.354375103343371),
-                                    ("from|since|after <time>December", -6.059123195581797),
-                                    ("dd/mm<time-of-day> am|pm", -6.059123195581797),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -6.059123195581797),
-                                    ("Palm SundaySunday", -5.653658087473633),
-                                    ("dayday", -3.8618986182455775),
-                                    ("dd/mmat <time-of-day>", -6.059123195581797),
-                                    ("<time> <part-of-day>at <time-of-day>", -6.059123195581797),
-                                    ("tonightat <time-of-day>", -6.059123195581797),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -5.365976015021851),
-                                    ("today<time-of-day> am|pm", -6.059123195581797),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.653658087473633),
-                                    ("at <time-of-day><time> <part-of-day>", -6.059123195581797),
-                                    ("hourhour", -4.8063602270864285),
-                                    ("<time-of-day> am|pmon <date>", -4.044220175039532),
-                                    ("Wednesdaythis|last|next <cycle>", -6.059123195581797),
-                                    ("Lentyear (latent)", -6.059123195581797),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.555045798805523),
-                                    ("Boghiyear (latent)", -6.059123195581797),
-                                    ("dayyear", -1.9647786333596962),
-                                    ("Thursdayfrom|since|after <time>", -5.653658087473633),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -6.059123195581797),
-                                    ("Thursdayat <time-of-day>", -5.653658087473633),
-                                    ("Islamic New Yearyear (latent)", -5.653658087473633),
-                                    ("Laylat al-Qadryear (latent)", -5.1428324637076415),
-                                    ("Chhathin <named-month>|year", -6.059123195581797),
-                                    ("Vasant Panchamiin <named-month>|year", -6.059123195581797),
-                                    ("Diwaliin <named-month>|year", -6.059123195581797),
-                                    ("Shrove Tuesdayyear (latent)", -6.059123195581797),
-                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
-                                     -5.365976015021851),
-                                    ("<time-of-day> am|pmtomorrow", -5.365976015021851),
-                                    ("Yom Kippuryear (latent)", -6.059123195581797),
-                                    ("<part-of-day> of <time>year (latent)", -6.059123195581797),
-                                    ("minutehour", -5.1428324637076415),
-                                    ("Kaanum Pongalyear (latent)", -5.653658087473633),
-                                    ("Maha Saptamiyear (latent)", -6.059123195581797),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.653658087473633),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.354375103343371),
-                                    ("for <duration> from <time>December", -6.059123195581797),
-                                    ("tomorrow<time-of-day> sharp|exactly", -6.059123195581797),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.1428324637076415),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.653658087473633),
-                                    ("Pentecostyear (latent)", -6.059123195581797),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.1428324637076415),
-                                    ("Eid al-Fitryear (latent)", -6.059123195581797),
-                                    ("Mondayin|during the <part-of-day>", -6.059123195581797),
-                                    ("Raksha Bandhanyear (latent)", -6.059123195581797),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.653658087473633),
-                                    ("Navaratriin <named-month>|year", -6.059123195581797),
-                                    ("Ashurayear (latent)", -6.059123195581797),
-                                    ("Chinese New Yearyear (latent)", -6.059123195581797),
-                                    ("Sundayyear (latent)", -6.059123195581797),
-                                    ("Lag BaOmeryear (latent)", -6.059123195581797),
-                                    ("last weekend of <named-month>year (latent)",
-                                     -6.059123195581797),
-                                    ("Eid al-Adhayear (latent)", -5.1428324637076415),
-                                    ("intersectin|during the <part-of-day>", -6.059123195581797),
-                                    ("Christmasat <time-of-day>", -6.059123195581797),
-                                    ("Passoveryear (latent)", -6.059123195581797),
-                                    ("Lazarus Saturdayyear (latent)", -6.059123195581797),
-                                    ("dd/mmyear (latent)", -6.059123195581797),
-                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
-                                     -6.059123195581797),
-                                    ("Yom HaShoahyear (latent)", -5.653658087473633),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -5.653658087473633),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -6.059123195581797),
-                                    ("Thai Pongalin <named-month>|year", -6.059123195581797),
-                                    ("Septemberyear (latent)", -5.653658087473633),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.8063602270864285),
-                                    ("Halloweenyear (latent)", -6.059123195581797),
-                                    ("<ordinal> last <cycle> of <time>year (latent)",
-                                     -5.653658087473633),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.365976015021851),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -6.059123195581797),
-                                    ("at <time-of-day>intersect", -5.653658087473633),
-                                    ("Rosh Hashanahyear (latent)", -5.365976015021851),
-                                    ("Dhanterasyear (latent)", -6.059123195581797),
-                                    ("Tu BiShvatyear (latent)", -6.059123195581797),
-                                    ("Holiyear (latent)", -5.365976015021851),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -6.059123195581797),
-                                    ("Holika Dahanyear (latent)", -5.365976015021851),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -6.059123195581797),
-                                    ("dayminute", -3.420065865966538),
-                                    ("Mawlidyear (latent)", -6.059123195581797),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.653658087473633),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -6.059123195581797),
-                                    ("Jumu'atul-Widayear (latent)", -5.1428324637076415),
-                                    ("minuteday", -2.421537035855411),
-                                    ("absorption of , after named dayintersect",
-                                     -6.059123195581797),
-                                    ("intersectyear (latent)", -6.059123195581797),
-                                    ("Orthodox Easter Sundayyear (latent)", -6.059123195581797),
-                                    ("<ordinal> <cycle> of <time>year (latent)",
-                                     -6.059123195581797),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -6.059123195581797),
-                                    ("Mothering Sundayyear (latent)", -5.653658087473633),
-                                    ("Boss's Dayyear (latent)", -5.653658087473633),
-                                    ("Global Youth Service Dayyear (latent)", -6.059123195581797),
-                                    ("Tisha B'Avyear (latent)", -6.059123195581797),
-                                    ("Isra and Mi'rajyear (latent)", -5.1428324637076415),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -6.059123195581797),
-                                    ("Christmasyear (latent)", -5.653658087473633),
-                                    ("Naraka Chaturdashiyear (latent)", -5.653658087473633),
-                                    ("at <time-of-day>on <date>", -4.9605109069136875),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.449685283147696),
-                                    ("dayweek", -6.059123195581797),
-                                    ("Easter Sundayyear (latent)", -5.365976015021851),
-                                    ("weekyear", -4.9605109069136875),
-                                    ("hh:mmin|during the <part-of-day>", -5.365976015021851),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.653658087473633),
-                                    ("Hanukkahyear (latent)", -5.365976015021851),
-                                    ("February<time> <part-of-day>", -6.059123195581797),
-                                    ("Tuesdayin <named-month>|year", -6.059123195581797),
-                                    ("Great Lentyear (latent)", -6.059123195581797),
-                                    ("tomorrowat <time-of-day>", -5.365976015021851),
-                                    ("between <time> and <time>on <date>", -4.449685283147696),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
-                                     -6.059123195581797),
-                                    ("last <cycle> of <time>year (latent)", -5.365976015021851),
-                                    ("at <time-of-day>tomorrow", -5.653658087473633),
-                                    ("tomorrow<time-of-day> am|pm", -6.059123195581797),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -6.059123195581797),
-                                    ("Diwaliyear (latent)", -6.059123195581797),
-                                    ("Black Fridayyear (latent)", -5.653658087473633),
-                                    ("the <ordinal> last <cycle> of <time>year (latent)",
-                                     -6.059123195581797),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -6.059123195581797),
-                                    ("Chhathyear (latent)", -5.653658087473633),
-                                    ("Vasant Panchamiyear (latent)", -6.059123195581797),
-                                    ("Palm Sundayintersect", -6.059123195581797),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -6.059123195581797),
-                                    ("August Bank Holidayyear (latent)", -5.365976015021851),
-                                    ("Februaryintersect", -6.059123195581797),
-                                    ("Simchat Torahyear (latent)", -6.059123195581797),
-                                    ("minuteyear", -6.059123195581797)],
-                               n = 319},
-                   koData =
-                     ClassData{prior = -0.9788742181759229, unseen = -6.401917196727186,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.79081953287472),
-                                    ("hourday", -4.79081953287472),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.707110264748875),
-                                    ("dayhour", -3.142160907287339),
-                                    ("Tuesdayfrom|since|after <time>", -5.707110264748875),
-                                    ("daymonth", -3.567044101252605),
-                                    ("monthday", -5.301645156640712),
-                                    ("monthyear", -4.454347296253507),
-                                    ("<time-of-day> am|pmyear (latent)", -5.301645156640712),
-                                    ("Thai Pongalyear (latent)", -5.01396308418893),
-                                    ("intersecthh:mm", -5.707110264748875),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.707110264748875),
-                                    ("houryear", -4.79081953287472),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.707110264748875),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.01396308418893),
-                                    ("<time-of-day> am|pmintersect", -4.454347296253507),
-                                    ("until <time>on <date>", -5.01396308418893),
-                                    ("Octoberyear (latent)", -5.707110264748875),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.707110264748875),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -4.454347296253507),
-                                    ("about|exactly <time-of-day>year (latent)",
-                                     -5.707110264748875),
-                                    ("absorption of , after named dayJuly", -5.301645156640712),
-                                    ("from|since|after <time>July", -5.707110264748875),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -4.79081953287472),
-                                    ("Clean Mondayyear (latent)", -5.707110264748875),
-                                    ("monthhour", -5.707110264748875),
-                                    ("hourmonth", -4.79081953287472),
-                                    ("todayat <time-of-day>", -5.707110264748875),
-                                    ("Bank Holidayyear (latent)", -5.01396308418893),
-                                    ("from|since|after <time>December", -5.707110264748875),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -5.707110264748875),
-                                    ("Mondayyear (latent)", -5.01396308418893),
-                                    ("dayday", -5.301645156640712),
-                                    ("dd/mmat <time-of-day>", -5.301645156640712),
-                                    ("<time-of-day> am|pmon <date>", -4.454347296253507),
-                                    ("Thursdaydd/mm", -5.707110264748875),
-                                    ("dayyear", -2.662587827025453),
-                                    ("New Year's Dayyear (latent)", -5.301645156640712),
-                                    ("Thursdayfrom|since|after <time>", -4.00236217251045),
-                                    ("Thursdayat <time-of-day>", -4.454347296253507),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.707110264748875),
-                                    ("Aprilyear (latent)", -5.707110264748875),
-                                    ("monthminute", -5.707110264748875),
-                                    ("<time-of-day> am|pmtomorrow", -5.707110264748875),
-                                    ("Thursdayhh:mm", -4.79081953287472),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.707110264748875),
-                                    ("minutemonth", -3.915350795520821),
-                                    ("week-endin <named-month>|year", -5.707110264748875),
-                                    ("Augustyear (latent)", -5.301645156640712),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.301645156640712),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.301645156640712),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.707110264748875),
-                                    ("dd/mm<time-of-day> - <time-of-day> (interval)",
-                                     -5.301645156640712),
-                                    ("Sundayyear (latent)", -5.01396308418893),
-                                    ("Christmasat <time-of-day>", -5.707110264748875),
-                                    ("from|since|after <time>year (latent)", -4.454347296253507),
-                                    ("dd/mmyear (latent)", -5.707110264748875),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.707110264748875),
-                                    ("yesterday<time-of-day> am|pm", -5.707110264748875),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -5.707110264748875),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.01396308418893),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.707110264748875),
-                                    ("at <time-of-day>intersect", -5.301645156640712),
-                                    ("hh:mmyear (latent)", -4.608497976080766),
-                                    ("Holiyear (latent)", -5.707110264748875),
-                                    ("until <time><time-of-day> am|pm", -5.707110264748875),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.707110264748875),
-                                    ("dayminute", -3.1813816204406202),
-                                    ("intersectSeptember", -4.203032867972602),
-                                    ("minuteday", -2.639057329615259),
-                                    ("absorption of , after named dayintersect",
-                                     -5.707110264748875),
-                                    ("Februaryin|during the <part-of-day>", -5.707110264748875),
-                                    ("hh:mmon <date>", -3.692207244206611),
-                                    ("Saturdayyear (latent)", -5.707110264748875),
-                                    ("from|since|after <time>on <date>", -4.79081953287472),
-                                    ("absorption of , after named daySeptember", -4.79081953287472),
-                                    ("Naraka Chaturdashiyear (latent)", -5.707110264748875),
-                                    ("on <date>September", -5.301645156640712),
-                                    ("at <time-of-day>on <date>", -5.301645156640712),
-                                    ("in <named-month>|yearyear (latent)", -5.707110264748875),
-                                    ("dayweek", -5.707110264748875),
-                                    ("Easter Sundayyear (latent)", -5.301645156640712),
-                                    ("Thursday<time-of-day> am|pm", -5.01396308418893),
-                                    ("weekyear", -5.301645156640712),
-                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
-                                     -5.707110264748875),
-                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
-                                     -5.01396308418893),
-                                    ("Sundayfrom|since|after <time>", -5.707110264748875),
-                                    ("absorption of , after named dayFebruary", -4.79081953287472),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.707110264748875),
-                                    ("tomorrowat <time-of-day>", -5.707110264748875),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.707110264748875),
-                                    ("last <cycle> of <time>year (latent)", -5.301645156640712),
-                                    ("tomorrow<time-of-day> am|pm", -5.707110264748875),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -5.01396308418893),
-                                    ("Diwaliyear (latent)", -5.301645156640712),
-                                    ("<time-of-day> - <time-of-day> (interval)July",
-                                     -5.707110264748875),
-                                    ("Fridayyear (latent)", -5.301645156640712),
-                                    ("minuteyear", -4.454347296253507)],
-                               n = 192}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.2367626271489267,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.3429447511268303,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.1823215567939546),
-                                    ("integer (0..19)", -1.791759469228055)],
-                               n = 22}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.791759469228055),
-                                    ("ordinal (digits)quarter (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("quarteryear", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
-                                     -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.295836866004329,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("Global Youth Service 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}}),
-       ("Tisha B'Av",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Mothering Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.15219181534192538,
-                               unseen = -5.017279836814924,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -4.0821994520255166e-2),
-                                    ("intersect 2 numbers", -3.624340932976365)],
-                               n = 146},
-                   koData =
-                     ClassData{prior = -1.957744606702316, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1349799328389845),
-                                    ("negative numbers", -0.6931471805599453),
-                                    ("compose by multiplication", -1.9459101490553135)],
-                               n = 24}}),
-       ("Bank Holiday",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -1.0296194171811581),
-                                    ("intersect<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -1.540445040947149),
-                                    ("from|since|after <time><integer> <unit-of-duration>",
-                                     -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.2039728043259361),
-                                    ("December<integer> <unit-of-duration>", -1.2039728043259361)],
-                               n = 2}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.2237754316221157,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("dd/mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Hanukkah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -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}}),
-       ("half a <time-grain>",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maha Saptami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -3.822121282019774e-2,
-                               unseen = -4.3694478524670215,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 77},
-                   koData =
-                     ClassData{prior = -3.283414346005772, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.3513752571634776),
-                                    ("part of daysintersect", -2.3513752571634776),
-                                    ("hourday", -0.9650808960435872),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -2.3513752571634776),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -2.3513752571634776),
-                                    ("part of daysthis <time>", -2.3513752571634776),
-                                    ("part of daysChristmas", -1.9459101490553135)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Shrove Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Kaanum Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom Kippur",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("powers of tens",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15790302944580878,
-                               unseen = -5.093750200806762,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.1173044216802621),
-                                    ("month (grain)", -2.7850112422383386),
-                                    ("year (grain)", -2.6026896854443837),
-                                    ("week (grain)", -1.1173044216802621),
-                                    ("quarter", -3.4781584227982836), ("year", -2.6026896854443837),
-                                    ("month", -2.7850112422383386),
-                                    ("quarter (grain)", -3.4781584227982836)],
-                               n = 76},
-                   koData =
-                     ClassData{prior = -1.9236870122706031,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2809338454620642),
-                                    ("week (grain)", -1.2809338454620642),
-                                    ("day", -1.9740810260220096),
-                                    ("day (grain)", -1.9740810260220096)],
-                               n = 13}}),
-       ("Simchat Torah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("August Bank Holiday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Raksha Bandhan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ashura",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Palm Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Adha",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
-                                    ("time-of-day (latent)", -1.9459101490553135),
-                                    ("<time-of-day> am|pm", -1.9459101490553135),
-                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
-                                    ("minute", -1.540445040947149)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -0.9808292530117262),
-                                    ("ordinal (digits)", -0.4700036292457356)],
-                               n = 6}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lag BaOmer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("Chinese New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|this|next <season>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.635159922909596, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.11441035117774422),
-                                    ("integer (0..19)", -2.3581549441488563)],
-                               n = 71},
-                   koData =
-                     ClassData{prior = -0.7547050735593787, unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.878087785311434e-2),
-                                    ("integer (0..19)", -3.0910424533583156),
-                                    ("integer 21..99", -3.4965075614664802)],
-                               n = 63}}),
-       ("beginning of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.1351747783682526, unseen = -5.170483995038151,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5257286443082556),
-                                    ("integer (0..19)year (grain)", -3.0853444322436783),
-                                    ("integer (numeric)day (grain)", -2.5998366164619773),
-                                    ("integer (0..19)second (grain) ", -3.7784916128036232),
-                                    ("integer (0..19)hour (grain)", -3.0853444322436783),
-                                    ("second", -3.373026504695459),
-                                    ("integer (numeric)second (grain) ", -4.0661736852554045),
-                                    ("integer (numeric)year (grain)", -3.373026504695459),
-                                    ("day", -2.331572629867298), ("year", -2.5998366164619773),
-                                    ("integer (numeric)week (grain)", -3.0853444322436783),
-                                    ("integer (0..19)month (grain)", -3.5553480614894135),
-                                    ("hour", -2.6798793241355137), ("month", -3.2188758248682006),
-                                    ("integer (numeric)minute (grain)", -3.2188758248682006),
-                                    ("integer (0..19)minute (grain)", -3.0853444322436783),
-                                    ("integer (numeric)month (grain)", -4.0661736852554045),
-                                    ("minute", -2.5257286443082556),
-                                    ("integer (numeric)hour (grain)", -3.5553480614894135),
-                                    ("integer (0..19)day (grain)", -3.5553480614894135),
-                                    ("integer (0..19)week (grain)", -3.2188758248682006)],
-                               n = 76},
-                   koData =
-                     ClassData{prior = -2.068012845856213, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2546422183735807, unseen = -5.37989735354046,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>", -3.765840495250065),
-                                    ("integer after|past <hour-of-day>", -3.9889840465642745),
-                                    ("at <time-of-day>", -2.1564025828159643),
-                                    ("<time-of-day> o'clock", -4.276666119016055),
-                                    ("half after|past <hour-of-day>", -4.276666119016055),
-                                    ("time-of-day (latent)", -1.7117167615545186),
-                                    ("hhmm (latent)", -4.68213122712422),
-                                    ("hh:mm", -2.330755969960742),
-                                    ("quarter after|past <hour-of-day>", -4.68213122712422),
-                                    ("until <time>", -3.9889840465642745),
-                                    ("about|exactly <time-of-day>", -4.68213122712422),
-                                    ("hour", -1.1856236656577395),
-                                    ("<time-of-day> sharp|exactly", -4.68213122712422),
-                                    ("minute", -1.791759469228055)],
-                               n = 100},
-                   koData =
-                     ClassData{prior = -1.492516574375198, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.20545280453606),
-                                    ("from|since|after <time>", -3.20545280453606),
-                                    ("<hour-of-day> <integer>", -3.6109179126442243),
-                                    ("time-of-day (latent)", -1.085189268335969),
-                                    ("hour", -1.0459685551826876), ("minute", -2.6946271807700692)],
-                               n = 29}}),
-       ("Yom Ha'atzmaut",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thiru Onam",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thai Pongal",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Vijayadashami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Guy Fawkes Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5306282510621704,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.1400661634962708),
-                                    ("year (grain)", -2.4277482359480516),
-                                    ("second", -2.833213344056216),
-                                    ("week (grain)", -2.1400661634962708),
-                                    ("day", -2.1400661634962708),
-                                    ("minute (grain)", -2.833213344056216),
-                                    ("year", -2.4277482359480516),
-                                    ("second (grain) ", -2.833213344056216),
-                                    ("minute", -2.833213344056216),
-                                    ("day (grain)", -2.1400661634962708)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.8873031950009028, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("at the beginning|end of <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -0.6931471805599453),
-                                    ("year", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Dhanteras",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Tu BiShvat",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Whit Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -4.255961441879589e-2,
-                               unseen = -4.2626798770413155,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
-                   koData =
-                     ClassData{prior = -3.1780538303479458,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Holi",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Rosh Hashanah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <named-day> ago|back",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)Thursday", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Holika Dahan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -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}}),
-       ("Mawlid",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Jumu'atul-Wida",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.1786549963416462, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -2.159484249353372),
-                                    ("time-of-day (latent)", -2.5649493574615367),
-                                    ("year", -2.159484249353372),
-                                    ("<time-of-day> am|pm", -1.8718021769015913),
-                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
-                                    ("minute", -1.6486586255873816)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.2192034840549946),
-                                    ("yesterday", -2.7300291078209855),
-                                    ("day", -2.7300291078209855),
-                                    ("time-of-day (latent)", -1.6314168191528755),
-                                    ("hh:mm", -2.2192034840549946), ("hour", -1.5260563034950494),
-                                    ("minute", -1.749199854809259)],
-                               n = 18}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
-                                    ("this|last|next <cycle>", -1.791759469228055),
-                                    ("day", -2.4849066497880004),
-                                    ("time-of-day (latent)", -2.890371757896165),
-                                    ("hhmm (latent)", -2.4849066497880004),
-                                    ("<time-of-day> am|pm", -2.890371757896165),
-                                    ("hour", -2.1972245773362196),
-                                    ("next <time>", -2.890371757896165),
-                                    ("this|next <day-of-week>", -2.890371757896165),
-                                    ("minute", -2.4849066497880004)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dd/mm", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("Sukkot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthyear", -1.2992829841302609),
-                                    ("Marcha <unit-of-duration>", -1.7047480922384253),
-                                    ("March<integer> <unit-of-duration>", -1.7047480922384253),
-                                    ("Vijayadashami<integer> <unit-of-duration>",
-                                     -1.7047480922384253),
-                                    ("dayyear", -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("World Vegan Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.5389965007326869, unseen = -4.948759890378168,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.248495242049359),
-                                    ("dayhour", -3.8430301339411947),
-                                    ("daymonth", -2.995732273553991),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.248495242049359),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.5553480614894135),
-                                    ("Wednesdayintersect", -4.248495242049359),
-                                    ("Black Fridaythis|last|next <cycle>", -4.248495242049359),
-                                    ("<part-of-day> of <time>February", -4.248495242049359),
-                                    ("Saturday<time-of-day> am|pm", -4.248495242049359),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -3.8430301339411947),
-                                    ("on <date><time-of-day> am|pm", -4.248495242049359),
-                                    ("hourmonth", -4.248495242049359),
-                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
-                                     -4.248495242049359),
-                                    ("dayday", -2.3766930651477676),
-                                    ("the <day-of-month> (ordinal)February", -3.8430301339411947),
-                                    ("WednesdayOctober", -4.248495242049359),
-                                    ("Wednesdaythis|last|next <cycle>", -3.8430301339411947),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.332204510175204),
-                                    ("dayyear", -3.332204510175204),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.248495242049359),
-                                    ("Thursdayhh:mm", -3.8430301339411947),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.248495242049359),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -3.8430301339411947),
-                                    ("TuesdayOctober", -4.248495242049359),
-                                    ("the <day-of-month> (ordinal)March", -4.248495242049359),
-                                    ("Mondaythis|last|next <cycle>", -4.248495242049359),
-                                    ("Fridayintersect", -4.248495242049359),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.8430301339411947),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.8430301339411947),
-                                    ("Tuesdaythis|last|next <cycle>", -4.248495242049359),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.248495242049359),
-                                    ("dayminute", -2.8622008809294686),
-                                    ("minuteday", -3.332204510175204),
-                                    ("this|last|next <cycle>Sunday", -4.248495242049359),
-                                    ("Sundaythis|last|next <cycle>", -4.248495242049359),
-                                    ("weekday", -4.248495242049359),
-                                    ("dayweek", -3.1498829533812494),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -3.8430301339411947)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -0.8754687373538999, unseen = -4.762173934797756,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.060443010546419),
-                                    ("week-endOctober", -3.367295829986474),
-                                    ("daymonth", -1.8632184332102),
-                                    ("TuesdaySeptember", -4.060443010546419),
-                                    ("Wednesdayintersect", -4.060443010546419),
-                                    ("hourmonth", -2.9618307218783095),
-                                    ("Fridaythis|last|next <cycle>", -4.060443010546419),
-                                    ("SundayFebruary", -4.060443010546419),
-                                    ("WednesdayOctober", -4.060443010546419),
-                                    ("week-endintersect", -4.060443010546419),
-                                    ("dayyear", -4.060443010546419),
-                                    ("FridayJuly", -3.654977902438255),
-                                    ("FridaySeptember", -4.060443010546419),
-                                    ("WednesdayFebruary", -4.060443010546419),
-                                    ("minutemonth", -3.144152278672264),
-                                    ("SundayMarch", -4.060443010546419),
-                                    ("MondayFebruary", -3.654977902438255),
-                                    ("Fridayintersect", -4.060443010546419),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.654977902438255),
-                                    ("dayminute", -3.367295829986474),
-                                    ("SaturdaySeptember", -4.060443010546419),
-                                    ("intersectSeptember", -3.144152278672264),
-                                    ("MondayMarch", -4.060443010546419),
-                                    ("on <date>September", -3.654977902438255),
-                                    ("Tuesdayintersect", -4.060443010546419),
-                                    ("Sundayintersect", -4.060443010546419)],
-                               n = 30}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5306282510621704,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.772588722239781),
-                                    ("Martin Luther King's Day", -2.772588722239781),
-                                    ("Mothering Sunday", -2.772588722239781),
-                                    ("day", -1.1631508098056809), ("Sunday", -2.772588722239781),
-                                    ("Chinese New Year", -2.367123614131617),
-                                    ("Thanksgiving Day", -2.772588722239781),
-                                    ("Easter Sunday", -2.772588722239781),
-                                    ("hour", -2.772588722239781), ("Tuesday", -2.772588722239781),
-                                    ("week-end", -2.772588722239781)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.8873031950009028, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.5649493574615367), ("day", -2.159484249353372),
-                                    ("Sunday", -2.5649493574615367), ("hour", -1.466337068793427),
-                                    ("week-end", -1.466337068793427)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Clean Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd.mm.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Isra and Mi'raj",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.3184537311185346,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.803360380906535),
-                                    ("a <unit-of-duration>Christmas", -2.803360380906535),
-                                    ("dayday", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>today", -2.803360380906535),
-                                    ("daysecond", -2.803360380906535),
-                                    ("a <unit-of-duration>right now", -2.803360380906535),
-                                    ("minutenograin", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>Christmas", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>Easter Sunday",
-                                     -2.803360380906535),
-                                    ("secondnograin", -2.803360380906535),
-                                    ("yearday", -2.1102132003465894),
-                                    ("daynograin", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>now", -2.3978952727983707)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.4423470353692043),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.4423470353692043),
-                                    ("dayday", -2.03688192726104),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.4423470353692043),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.4423470353692043)],
-                               n = 3}}),
-       ("<day-of-month> (ordinal or number) of <month>",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.803360380906535),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.803360380906535),
-                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
-                                    ("integer (numeric)this|last|next <cycle>",
-                                     -2.3978952727983707),
-                                    ("ordinal (digits)February", -2.803360380906535),
-                                    ("integer (numeric)February", -2.3978952727983707),
-                                    ("month", -0.9315582040049435),
-                                    ("ordinal (digits)March", -2.803360380906535),
-                                    ("integer (numeric)July", -2.803360380906535)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.7047480922384253),
-                                    ("month", -1.7047480922384253)],
-                               n = 1}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Naraka Chaturdashi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("beginning of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.803360380906535),
-                                    ("Halloween", -2.803360380906535),
-                                    ("Wednesday", -2.803360380906535),
-                                    ("Boss's Day", -2.803360380906535),
-                                    ("Mothering Sunday", -2.803360380906535),
-                                    ("Monday", -2.803360380906535), ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.803360380906535),
-                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
-                                    ("Tuesday", -2.1102132003465894)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>|year",
-        Classifier{okData =
-                     ClassData{prior = -0.2719337154836418,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<year> (bc|ad)", -1.845826690498331),
-                                    ("October", -2.9444389791664407),
-                                    ("year (latent)", -1.3350010667323402),
-                                    ("year", -0.9295359586241757), ("March", -2.9444389791664407),
-                                    ("month", -2.538973871058276)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.4350845252893227, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.6739764335716716),
-                                    ("year (latent)", -1.3862943611198906),
-                                    ("year", -1.3862943611198906), ("month", -1.6739764335716716)],
-                               n = 5}}),
-       ("Islamic New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half a <time-grain>", -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}}),
-       ("half an hour (abbrev).",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               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.5596157879354228, unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.012261575505202),
-                                    ("from|since|after <time>hh:mm", -2.501435951739211),
-                                    ("minuteminute", -1.2776605201170952),
-                                    ("hh:mmhh:mm", -1.9136492868370918),
-                                    ("dayday", -3.012261575505202),
-                                    ("hourhour", -3.012261575505202),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.012261575505202),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.012261575505202),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.012261575505202)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.2386784521643803),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.2386784521643803),
-                                    ("daymonth", -2.833213344056216),
-                                    ("<time-of-day> am|pmintersect", -3.2386784521643803),
-                                    ("hh:mm<time-of-day> am|pm", -2.833213344056216),
-                                    ("minuteminute", -1.9859154836690123),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("dayday", -3.2386784521643803),
-                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
-                                     -2.833213344056216),
-                                    ("hourhour", -2.5455312716044354),
-                                    ("minutehour", -2.833213344056216),
-                                    ("hh:mmintersect", -2.322387720290225),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.2386784521643803),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("from|since|after <time>intersect", -2.833213344056216)],
-                               n = 15}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Laylat al-Qadr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Boghi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("at the beginning|end of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("January", -1.3862943611198906),
-                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.0986122886681098),
-                                    ("month", -1.0986122886681098)],
-                               n = 1}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>hh:mm", -2.4849066497880004),
-                                    ("minuteminute", -1.529395204760564),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -1.8971199848858813),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.4418327522790392, unseen = -4.532599493153256,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.828641396489095),
-                                    ("until <time>time-of-day (latent)", -2.575878427993727),
-                                    ("hh:mmtime-of-day (latent)", -2.12389330425067),
-                                    ("hh:mm<time-of-day> am|pm", -3.4231762883809305),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.828641396489095),
-                                    ("hourhour", -1.6314168191528755),
-                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
-                                     -3.828641396489095),
-                                    ("hourminute", -3.828641396489095),
-                                    ("minutehour", -1.5773495978825998),
-                                    ("until <time><time-of-day> am|pm", -3.4231762883809305),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -2.575878427993727),
-                                    ("at <time-of-day>time-of-day (latent)", -3.4231762883809305),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.4231762883809305)],
-                               n = 36}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("Diwali",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("last night",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   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.916290731874155, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.9924301646902063),
-                                    ("daymonth", -1.4816045409242156),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.9924301646902063),
-                                    ("week (grain)intersect", -2.3978952727983707),
-                                    ("week (grain)September", -2.3978952727983707)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.2335922215070942),
-                                    ("day (grain)May", -2.2335922215070942),
-                                    ("week (grain)year (latent)", -1.9459101490553135),
-                                    ("weekmonth", -1.7227665977411035),
-                                    ("week (grain)October", -2.2335922215070942),
-                                    ("weekyear", -1.9459101490553135),
-                                    ("week (grain)intersect", -2.2335922215070942)],
-                               n = 9}}),
-       ("Chhath",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vasant Panchami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("daymonth", -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("weekyear", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("Great Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maundy Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("compose by multiplication",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.832909122935104),
-                                    ("hh:mmhh:mm", -0.832909122935104)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
-                                    ("minuteminute", -1.410986973710262),
-                                    ("minutehour", -1.410986973710262),
-                                    ("hh:mmintersect", -1.410986973710262)],
-                               n = 18}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\" for year",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Black Fridaythis|last|next <cycle>", -2.4849066497880004),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -2.0794415416798357),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -2.4849066497880004),
-                                    ("dayyear", -0.9808292530117262),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -2.4849066497880004),
-                                    ("intersectyear (latent)", -2.4849066497880004),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -2.0794415416798357)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Fridaythis|last|next <cycle>", -1.6094379124341003),
-                                    ("dayyear", -1.6094379124341003)],
-                               n = 1}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("at the beginning|end of <week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.330733340286331,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.706570200892086),
-                                    ("this|last|next <cycle>", -0.8209805520698302),
-                                    ("about|exactly <time-of-day>", -2.70805020110221)],
-                               n = 36},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Fitr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("Trinity Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Pentecost",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.639057329615259),
-                                    ("Martin Luther King's Day", -2.639057329615259),
-                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
-                                    ("Thanksgiving Day", -2.639057329615259),
-                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
-                                    ("winter", -2.639057329615259),
-                                    ("week-end", -2.639057329615259),
-                                    ("summer", -2.2335922215070942)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                     ClassData{prior = -2.5649493574615367, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7308875085427924),
+                                    ("integer (numeric)time-of-day (latent)", -0.7308875085427924)],
+                               n = 12}}),
+       ("week",
+        Classifier{okData =
+                     ClassData{prior = 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> timezone",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.23410650459726,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.4277482359480516),
+                                    ("hhhmm", -1.65455834771457),
+                                    ("<time-of-day> am|pm", -2.0222831278398874),
+                                    ("hh:mm", -2.2735975561207935), ("hour", -1.821612432377736),
+                                    ("minute", -1.128465251817791)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm", -1.3862943611198906), ("hh:mm", -1.791759469228055),
+                                    ("minute", -1.0986122886681098)],
+                               n = 3}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5607671985404645, unseen = -6.210600077024653,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 496},
+                   koData =
+                     ClassData{prior = -0.8457647056215765, unseen = -5.926926025970411,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 373}}),
+       ("<year> (bc|ad)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.5040773967762742),
+                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
+                               n = 1}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   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}}),
+       ("Karva Chauth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Father's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        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}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -0.9808292530117262)],
+                               n = 2}}),
+       ("Maha Shivaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("from|since|after <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.701375407759786, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal or number) <named-month>",
+                                     -3.8066624897703196),
+                                    ("July", -3.8066624897703196),
+                                    ("intersect", -3.8066624897703196),
+                                    ("year (latent)", -3.4011973816621555),
+                                    ("day", -2.4203681286504293),
+                                    ("the <day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("the <day-of-month> (number)", -3.8066624897703196),
+                                    ("time-of-day (latent)", -2.5538995212749516),
+                                    ("year", -3.4011973816621555),
+                                    ("<time-of-day> am|pm", -2.5538995212749516),
+                                    ("hh:mm", -2.890371757896165),
+                                    ("<day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("hour", -1.9348603128687285), ("month", -3.4011973816621555),
+                                    ("minute", -2.890371757896165),
+                                    ("August", -3.8066624897703196)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.201421728167374, unseen = -5.631211781821365,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -4.018183201256536),
+                                    ("week", -4.9344739331306915),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.9344739331306915),
+                                    ("today", -4.9344739331306915),
+                                    ("intersect", -2.9885637840753785),
+                                    ("<time> for <duration>", -4.241326752570746),
+                                    ("second", -4.9344739331306915), ("now", -3.3250360206965914),
+                                    ("tomorrow", -4.529008825022527),
+                                    ("this|last|next <cycle>", -4.9344739331306915),
+                                    ("day", -1.7774735119805785),
+                                    ("the <day-of-month> (ordinal)", -4.529008825022527),
+                                    ("the <day-of-month> (number)", -3.548179572010801),
+                                    ("time-of-day (latent)", -2.492126897761487),
+                                    ("<time-of-day> am|pm", -4.241326752570746),
+                                    ("hh:mm", -4.529008825022527), ("nograin", -3.3250360206965914),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.529008825022527),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.9344739331306915),
+                                    ("<day-of-month> (ordinal)", -3.835861644462582),
+                                    ("Easter Sunday", -4.9344739331306915),
+                                    ("Christmas", -4.241326752570746),
+                                    ("hour", -2.3317842476863078), ("month", -4.9344739331306915),
+                                    ("<datetime> - <datetime> (interval)", -2.7372493557944724),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.9885637840753785),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -4.529008825022527),
+                                    ("minute", -1.9900349539642512),
+                                    ("right now", -4.9344739331306915),
+                                    ("<month> dd-dd (interval)", -4.241326752570746),
+                                    ("part of days", -4.9344739331306915),
+                                    ("dd-dd <month> (interval)", -4.529008825022527)],
+                               n = 121}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("integer (numeric)time-of-day (latent)", -1.3862943611198906),
+                                    ("integer (20..90)time-of-day (latent)", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.268683541318364),
+                                    ("daymonth", -2.268683541318364),
+                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.6741486494265287),
+                                    ("weekmonth", -1.7578579175523736),
+                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.6741486494265287),
+                                    ("weekyear", -1.9810014688665833),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
+                                     -2.6741486494265287)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.1631508098056809, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.3025850929940455),
+                                    ("integer (numeric)April", -2.3025850929940455),
+                                    ("month", -1.2039728043259361)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.3746934494414107,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.772588722239781),
+                                    ("ordinal (digits)July", -2.0794415416798357),
+                                    ("integer (numeric)September", -2.367123614131617),
+                                    ("ordinal (digits)August", -2.772588722239781),
+                                    ("ordinal (digits)April", -2.772588722239781),
+                                    ("month", -0.9808292530117262),
+                                    ("integer (numeric)July", -2.0794415416798357)],
+                               n = 11}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.19105523676270922,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("dayhour", -1.499234772300486),
+                                    ("Mondayearly morning", -3.536116699561526),
+                                    ("time-of-day (latent)tonight", -3.536116699561526),
+                                    ("hourhour", -2.236833715431265),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("todaypart of days", -3.9415818076696905),
+                                    ("minutehour", -2.6888188391743224),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.536116699561526),
+                                    ("time-of-day (latent)this <part-of-day>", -3.9415818076696905),
+                                    ("Mondayin|during the <part-of-day>", -3.9415818076696905),
+                                    ("intersectpart of days", -3.0252910757955354),
+                                    ("Saturdaypart of days", -3.9415818076696905),
+                                    ("intersectin|during the <part-of-day>", -3.9415818076696905),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("tomorrowpart of days", -2.33214389523559),
+                                    ("hh:mmin|during the <part-of-day>", -3.0252910757955354),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("yesterdaypart of days", -3.536116699561526),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("Mondaypart of days", -3.9415818076696905)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -1.749199854809259, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.068052935133617),
+                                    ("yearhour", -3.068052935133617),
+                                    ("monthhour", -3.068052935133617),
+                                    ("hourhour", -1.9694406464655074),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("Februaryin|during the <part-of-day>", -3.068052935133617),
+                                    ("tomorrowpart of days", -3.068052935133617),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.151762203259462)],
+                               n = 8}}),
+       ("dd/mm",
+        Classifier{okData =
+                     ClassData{prior = -1.5841201044498106,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -0.22957444164450025,
+                               unseen = -3.4965075614664802,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 31}}),
+       ("today",
+        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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2336148511815052, unseen = -5.327876168789581,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.9367156180185177),
+                                    ("noon|midnight|EOD|end of day", -4.2243976904702984),
+                                    ("integer after|past <hour-of-day>", -3.9367156180185177),
+                                    ("<time-of-day> o'clock", -4.629862798578463),
+                                    ("half after|past <hour-of-day>", -4.629862798578463),
+                                    ("hhhmm", -3.713572066704308),
+                                    ("<hour-of-day> <integer>", -3.9367156180185177),
+                                    ("time-of-day (latent)", -1.6594483330087617),
+                                    ("hhmm (latent)", -3.9367156180185177),
+                                    ("<time-of-day> am|pm", -1.9908054689632042),
+                                    ("hh:mm", -3.2435684374585723),
+                                    ("about|exactly <time-of-day>", -4.2243976904702984),
+                                    ("hour", -1.1333552371119826),
+                                    ("<time-of-day> sharp|exactly", -4.629862798578463),
+                                    ("minute", -1.889022774653262)],
+                               n = 95},
+                   koData =
+                     ClassData{prior = -1.5686159179138452, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9963334395476915),
+                                    ("<time-of-day> am|pm", -3.0757749812275272),
+                                    ("hour", -0.916290731874155)],
+                               n = 25}}),
+       ("December",
+        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}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.8622008809294686),
+                                    ("Saturday", -2.8622008809294686),
+                                    ("Monday", -2.456735772821304), ("Friday", -1.6094379124341003),
+                                    ("day", -0.8472978603872037), ("Sunday", -2.8622008809294686),
+                                    ("on <day>", -2.169053700369523)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = -3.17486983145803e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -3.4657359027997265,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("hour", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("the <day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7621400520468967, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6094379124341003),
+                                    ("ordinal (digits)February", -1.8971199848858813),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)March", -1.8971199848858813)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.6286086594223742,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.4816045409242156),
+                                    ("month", -0.8938178760220964),
+                                    ("integer (numeric)July", -1.4816045409242156)],
+                               n = 8}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -1.227009259181436e-2,
+                               unseen = -4.418840607796598,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 81},
+                   koData =
+                     ClassData{prior = -4.406719247264253, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("in|during <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2744368457017603,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<year> (bc|ad)", -1.9924301646902063),
+                                    ("October", -3.0910424533583156),
+                                    ("year (latent)", -1.2992829841302609),
+                                    ("year", -0.9509762898620451), ("March", -2.6855773452501515),
+                                    ("month", -2.3978952727983707)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -1.4271163556401458,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.5040773967762742),
+                                    ("year (latent)", -1.5040773967762742),
+                                    ("year", -1.5040773967762742), ("month", -1.5040773967762742)],
+                               n = 6}}),
+       ("<part-of-day> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.223809823697212e-2,
+                               unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this <part-of-day>hh:mm", -3.7013019741124937),
+                                    ("tonighthh:mm", -3.7013019741124937),
+                                    ("hourhour", -0.8979415932059586),
+                                    ("hourminute", -3.0081547935525483),
+                                    ("in|during the <part-of-day>time-of-day (latent)",
+                                     -3.7013019741124937),
+                                    ("this <part-of-day>time-of-day (latent)", -1.9965538818740682),
+                                    ("early morningtime-of-day (latent)", -3.7013019741124937),
+                                    ("tonight<time-of-day> o'clock", -3.7013019741124937),
+                                    ("tonighttime-of-day (latent)", -2.7850112422383386),
+                                    ("part of dayshh:mm", -3.7013019741124937),
+                                    ("part of daystime-of-day (latent)", -1.6218604324326575)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -2.538973871058276, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.4469189829363254),
+                                    ("this <part-of-day>time-of-day (latent)", -2.1400661634962708),
+                                    ("tonighttime-of-day (latent)", -2.1400661634962708),
+                                    ("part of daystime-of-day (latent)", -2.1400661634962708)],
+                               n = 3}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -2.0794415416798357),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.0794415416798357),
+                                    ("hhhmmhhhmm", -2.0794415416798357),
+                                    ("minutehour", -1.6739764335716716),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("minutehour", -1.3862943611198906),
+                                    ("hhhmmtime-of-day (latent)", -1.791759469228055)],
+                               n = 2}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Good Friday",
+        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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.12136085700426748,
+                               unseen = -3.4965075614664802,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 31},
+                   koData =
+                     ClassData{prior = -2.169053700369523, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<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.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.0794415416798357),
+                                    ("<part-of-day> at <time-of-day>", -2.0794415416798357),
+                                    ("time-of-day (latent)", -1.1631508098056809),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vesak",
+        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}}),
+       ("Earth 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}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.12260232209233239,
+                               unseen = -4.709530201312334,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.3141860046725258),
+                                    ("<integer> more <unit-of-duration>", -4.007333185232471),
+                                    ("three-quarters of an hour", -3.0910424533583156),
+                                    ("<integer> + '\"", -3.3141860046725258),
+                                    ("number.number hours", -4.007333185232471),
+                                    ("second", -3.6018680771243066),
+                                    ("half a <time-grain>", -3.0910424533583156),
+                                    ("day", -3.3141860046725258), ("year", -4.007333185232471),
+                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("a <unit-of-duration>", -3.0910424533583156),
+                                    ("quarter of an hour", -3.0910424533583156),
+                                    ("hour", -2.503255788456197),
+                                    ("about|exactly <duration>", -4.007333185232471),
+                                    ("half an hour (abbrev).", -3.6018680771243066),
+                                    ("<integer> and an half hour", -4.007333185232471),
+                                    ("minute", -1.2992829841302609)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -2.159484249353372, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.70805020110221), ("quarter", -2.70805020110221),
+                                    ("year", -1.791759469228055),
+                                    ("<integer> <unit-of-duration>", -1.791759469228055),
+                                    ("a <unit-of-duration>", -2.3025850929940455)],
+                               n = 6}}),
+       ("the closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.0986122886681098),
+                                    ("Christmastoday", -1.791759469228055),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.791759469228055),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("MondayOctober", -1.3862943611198906)],
+                               n = 1}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4},
+                   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}}),
+       ("Ganesh Chaturthi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        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}}),
+       ("<time-of-day> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)tonight", -2.5649493574615367),
+                                    ("hourhour", -1.3609765531356008),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -2.9704144655697013),
+                                    ("minutehour", -1.717651497074333),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("time-of-day (latent)this <part-of-day>", -2.9704144655697013),
+                                    ("hh:mmin|during the <part-of-day>", -2.0541237336955462),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -2.9704144655697013)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.466337068793427),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -1.466337068793427)],
+                               n = 2}}),
+       ("the nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.6931471805599453),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.3723081191451507, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -0.2923879634891936, unseen = -4.007333185232471,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 53}}),
+       ("Parsi New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -0.6931471805599453),
+                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("May",
+        Classifier{okData =
+                     ClassData{prior = 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.4975337939883182, unseen = -7.203405521083095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.509514015963292),
+                                    ("Father's Dayyear (latent)", -6.509514015963292),
+                                    ("Karva Chauthyear (latent)", -6.509514015963292),
+                                    ("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.509514015963292),
+                                    ("Maha Shivaratriyear (latent)", -6.509514015963292),
+                                    ("Ramadanyear (latent)", -5.256751047467924),
+                                    ("<datetime> - <datetime> (interval)on <day>",
+                                     -5.1232196548434015),
+                                    ("Bhai Doojyear (latent)", -6.509514015963292),
+                                    ("hourday", -4.494610995421027),
+                                    ("dayhour", -3.4649915782398693),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.1232196548434015),
+                                    ("Martin Luther King's Dayyear (latent)", -6.104048907855128),
+                                    ("Shemini Atzeretyear (latent)", -6.509514015963292),
+                                    ("daymonth", -4.494610995421027),
+                                    ("monthday", -6.104048907855128),
+                                    ("monthyear", -4.717754546735237),
+                                    ("Yom Ha'atzmautyear (latent)", -6.509514015963292),
+                                    ("Orthodox Good Fridayyear (latent)", -6.104048907855128),
+                                    ("Vijayadashamiyear (latent)", -6.509514015963292),
+                                    ("Thanksgiving Dayyear (latent)", -5.410901727295182),
+                                    ("Thai Pongalyear (latent)", -5.816366835403347),
+                                    ("Thiru Onamyear (latent)", -5.816366835403347),
+                                    ("hhhmmabsorption of , after named day", -6.509514015963292),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.509514015963292),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.593223284089137),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.509514015963292),
+                                    ("Krishna Janmashtamiyear (latent)", -6.104048907855128),
+                                    ("Guru Gobind Singh Jayantiyear (latent)", -6.509514015963292),
+                                    ("houryear", -5.593223284089137),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.509514015963292),
+                                    ("Christmas<time-of-day> am|pm", -6.509514015963292),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.509514015963292),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.816366835403347),
+                                    ("intersectin|during <named-month>|year", -6.509514015963292),
+                                    ("<time-of-day> am|pmintersect", -5.256751047467924),
+                                    ("Earth Houryear (latent)", -6.509514015963292),
+                                    ("Ganesh Chaturthiyear (latent)", -6.509514015963292),
+                                    ("Octoberyear (latent)", -5.0054366191870185),
+                                    ("intersect<time-of-day> am|pm", -6.509514015963292),
+                                    ("Mattu Pongalyear (latent)", -6.509514015963292),
+                                    ("Saturday<part-of-day> at <time-of-day>", -6.509514015963292),
+                                    ("Shavuotyear (latent)", -6.509514015963292),
+                                    ("Parsi New Yearyear (latent)", -5.593223284089137),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.509514015963292),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.509514015963292),
+                                    ("todayin|within|after <duration>", -6.509514015963292),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -6.104048907855128),
+                                    ("Marchyear (latent)", -6.509514015963292),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hhhmm",
+                                     -6.104048907855128),
+                                    ("Sukkotyear (latent)", -6.104048907855128),
+                                    ("hhhmmintersect", -6.104048907855128),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.104048907855128),
+                                    ("Clean Mondayyear (latent)", -6.104048907855128),
+                                    ("monthhour", -6.104048907855128),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.593223284089137),
+                                    ("todayat <time-of-day>", -6.509514015963292),
+                                    ("Thursday<time> timezone", -4.111618743164922),
+                                    ("tonight<time-of-day> am|pm", -6.509514015963292),
+                                    ("time-of-day (latent)tonight", -6.104048907855128),
+                                    ("from|since|after <time>December", -6.509514015963292),
+                                    ("dd/mm<time-of-day> am|pm", -6.509514015963292),
+                                    ("<time-of-day> am|pmon <day>", -4.494610995421027),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.509514015963292),
+                                    ("yyyy-mm-ddhh:mm:ss", -6.104048907855128),
+                                    ("dayday", -3.736925293723511),
+                                    ("dd/mmat <time-of-day>", -6.509514015963292),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.104048907855128),
+                                    ("tonightat <time-of-day>", -5.410901727295182),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.816366835403347),
+                                    ("Dayananda Saraswati Jayantiyear (latent)",
+                                     -6.509514015963292),
+                                    ("today<time-of-day> am|pm", -6.509514015963292),
+                                    ("Februarythe <day-of-month> (ordinal)", -6.104048907855128),
+                                    ("at <time-of-day><time> <part-of-day>", -6.509514015963292),
+                                    ("<day-of-month> (ordinal)intersect", -6.104048907855128),
+                                    ("hourhour", -3.539099550393591),
+                                    ("Mahavir Jayantiyear (latent)", -6.104048907855128),
+                                    ("Navaratriin|during <named-month>|year", -6.509514015963292),
+                                    ("Wednesdaythis|last|next <cycle>", -6.509514015963292),
+                                    ("Lentyear (latent)", -6.509514015963292),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.6377118390617005),
+                                    ("Boghiyear (latent)", -6.509514015963292),
+                                    ("dayyear", -1.8943934991220328),
+                                    ("Karva Chauthin|during <named-month>|year",
+                                     -6.509514015963292),
+                                    ("Thursdayfrom|since|after <time>", -6.104048907855128),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.509514015963292),
+                                    ("Thursdayat <time-of-day>", -5.816366835403347),
+                                    ("Islamic New Yearyear (latent)", -6.104048907855128),
+                                    ("Laylat al-Qadryear (latent)", -5.593223284089137),
+                                    ("part of days<time-of-day> am|pm", -6.509514015963292),
+                                    ("Shrove Tuesdayyear (latent)", -6.509514015963292),
+                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
+                                     -5.816366835403347),
+                                    ("hourminute", -6.104048907855128),
+                                    ("<time-of-day> am|pmtomorrow", -5.593223284089137),
+                                    ("Yom Kippuryear (latent)", -6.509514015963292),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.816366835403347),
+                                    ("<part-of-day> of <time>year (latent)", -6.509514015963292),
+                                    ("minutehour", -5.256751047467924),
+                                    ("Kaanum Pongalyear (latent)", -6.104048907855128),
+                                    ("Maha Saptamiyear (latent)", -6.509514015963292),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.816366835403347),
+                                    ("time-of-day (latent)tomorrow", -5.593223284089137),
+                                    ("part of daysat <time-of-day>", -4.900076103529192),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.494610995421027),
+                                    ("for <duration> from <time>December", -6.509514015963292),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.509514015963292),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.256751047467924),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhhhmm",
+                                     -5.256751047467924),
+                                    ("time-of-day (latent)this <part-of-day>", -6.509514015963292),
+                                    ("Pentecostyear (latent)", -6.509514015963292),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.256751047467924),
+                                    ("<day-of-month> (ordinal)February", -6.509514015963292),
+                                    ("Eid al-Fitryear (latent)", -5.1232196548434015),
+                                    ("Vasant Panchamiin|during <named-month>|year",
+                                     -6.509514015963292),
+                                    ("Mondayin|during the <part-of-day>", -6.509514015963292),
+                                    ("Chhathin|during <named-month>|year", -6.509514015963292),
+                                    ("Diwaliin|during <named-month>|year", -6.509514015963292),
+                                    ("this <part-of-day><time-of-day> am|pm", -6.509514015963292),
+                                    ("Vaisakhiin|during <named-month>|year", -6.509514015963292),
+                                    ("Guru Ravidass Jayantiyear (latent)", -5.256751047467924),
+                                    ("Raksha Bandhanyear (latent)", -6.509514015963292),
+                                    ("daysecond", -6.104048907855128),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.104048907855128),
+                                    ("Ratha-Yatrayear (latent)", -6.509514015963292),
+                                    ("Ashurayear (latent)", -6.509514015963292),
+                                    ("Tuesdayin|during <named-month>|year", -6.509514015963292),
+                                    ("Chinese New Yearyear (latent)", -6.509514015963292),
+                                    ("tomorrowintersect", -6.509514015963292),
+                                    ("Lag BaOmeryear (latent)", -6.509514015963292),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.509514015963292),
+                                    ("Eid al-Adhayear (latent)", -4.3694478524670215),
+                                    ("intersectin|during the <part-of-day>", -6.509514015963292),
+                                    ("Palm Sundayyear (latent)", -6.509514015963292),
+                                    ("Christmasat <time-of-day>", -6.509514015963292),
+                                    ("Passoveryear (latent)", -6.509514015963292),
+                                    ("Lazarus Saturdayyear (latent)", -6.509514015963292),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.509514015963292),
+                                    ("hhhmmon <day>", -5.593223284089137),
+                                    ("Yom HaShoahyear (latent)", -6.104048907855128),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -6.104048907855128),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.509514015963292),
+                                    ("Septemberyear (latent)", -6.104048907855128),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.0054366191870185),
+                                    ("Halloweenyear (latent)", -6.509514015963292),
+                                    ("<ordinal> last <cycle> of <time>year (latent)",
+                                     -6.104048907855128),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.816366835403347),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -6.509514015963292),
+                                    ("at <time-of-day>intersect", -5.593223284089137),
+                                    ("Rosh Hashanahyear (latent)", -5.816366835403347),
+                                    ("Dhanterasyear (latent)", -6.509514015963292),
+                                    ("Tu BiShvatyear (latent)", -6.509514015963292),
+                                    ("<day-of-month> (ordinal)December", -5.816366835403347),
+                                    ("Holiyear (latent)", -5.816366835403347),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.509514015963292),
+                                    ("Holika Dahanyear (latent)", -5.816366835403347),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.104048907855128),
+                                    ("dayminute", -3.1596099286886874),
+                                    ("Mawlidyear (latent)", -6.509514015963292),
+                                    ("from <datetime> - <datetime> (interval)on <day>",
+                                     -6.104048907855128),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.509514015963292),
+                                    ("Jumu'atul-Widayear (latent)", -5.593223284089137),
+                                    ("minuteday", -2.760009940032921),
+                                    ("absorption of , after named dayintersect",
+                                     -5.816366835403347),
+                                    ("intersectyear (latent)", -6.509514015963292),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.509514015963292),
+                                    ("time-of-day (latent)in|within|after <duration>",
+                                     -6.509514015963292),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.509514015963292),
+                                    ("intersecthhhmm", -6.104048907855128),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.509514015963292),
+                                    ("Mothering Sundayyear (latent)", -6.104048907855128),
+                                    ("Boss's Dayyear (latent)", -6.104048907855128),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.509514015963292),
+                                    ("Global Youth Service Dayyear (latent)", -6.509514015963292),
+                                    ("Dhanterasin|during <named-month>|year", -6.509514015963292),
+                                    ("tonight<time-of-day> o'clock", -6.509514015963292),
+                                    ("Tisha B'Avyear (latent)", -6.509514015963292),
+                                    ("Isra and Mi'rajyear (latent)", -5.593223284089137),
+                                    ("at <time-of-day>on <day>", -4.900076103529192),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.104048907855128),
+                                    ("time-of-day (latent)<time> <part-of-day>",
+                                     -5.816366835403347),
+                                    ("Christmasyear (latent)", -6.104048907855128),
+                                    ("Saturdayintersect", -6.509514015963292),
+                                    ("Naraka Chaturdashiyear (latent)", -6.104048907855128),
+                                    ("Thai Pongalin|during <named-month>|year", -6.509514015963292),
+                                    ("dayweek", -6.509514015963292),
+                                    ("Easter Sundayyear (latent)", -5.816366835403347),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <day>",
+                                     -6.104048907855128),
+                                    ("weekyear", -5.410901727295182),
+                                    ("King's Dayyear (latent)", -5.0054366191870185),
+                                    ("hh:mmin|during the <part-of-day>", -5.593223284089137),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -6.104048907855128),
+                                    ("first|second|third|fourth|fifth <day-of-week> of <time>year (latent)",
+                                     -5.816366835403347),
+                                    ("Hanukkahyear (latent)", -5.816366835403347),
+                                    ("Rama Navamiyear (latent)", -6.509514015963292),
+                                    ("February<time> <part-of-day>", -6.509514015963292),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.816366835403347),
+                                    ("Great Lentyear (latent)", -6.509514015963292),
+                                    ("tomorrowat <time-of-day>", -5.816366835403347),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -6.509514015963292),
+                                    ("tomorrow<part-of-day> at <time-of-day>", -6.104048907855128),
+                                    ("Ugadiyear (latent)", -5.1232196548434015),
+                                    ("Vaisakhiyear (latent)", -5.816366835403347),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
+                                     -5.816366835403347),
+                                    ("last <cycle> of <time>year (latent)", -5.816366835403347),
+                                    ("at <time-of-day>tomorrow", -6.104048907855128),
+                                    ("tomorrow<time-of-day> am|pm", -6.509514015963292),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.509514015963292),
+                                    ("Diwaliyear (latent)", -6.509514015963292),
+                                    ("between <time> and <time>on <day>", -6.104048907855128),
+                                    ("Black Fridayyear (latent)", -6.104048907855128),
+                                    ("the <ordinal> last <cycle> of <time>year (latent)",
+                                     -6.509514015963292),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.509514015963292),
+                                    ("Chhathyear (latent)", -6.104048907855128),
+                                    ("Vasant Panchamiyear (latent)", -6.509514015963292),
+                                    ("Rabindra Jayantiyear (latent)", -5.256751047467924),
+                                    ("this <part-of-day>at <time-of-day>", -5.256751047467924),
+                                    ("St Patrick's Dayyear (latent)", -6.509514015963292),
+                                    ("Thursday<time> (timezone)", -6.509514015963292),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.509514015963292),
+                                    ("Pargat Diwasyear (latent)", -5.256751047467924),
+                                    ("August Bank Holidayyear (latent)", -5.816366835403347),
+                                    ("<datetime> - <datetime> (interval)July", -6.104048907855128),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -5.816366835403347),
+                                    ("Februaryintersect", -6.509514015963292),
+                                    ("Simchat Torahyear (latent)", -6.509514015963292),
+                                    ("minuteyear", -6.509514015963292)],
+                               n = 515},
+                   koData =
+                     ClassData{prior = -0.936565725735566, unseen = -6.885509670034817,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursdayhhhmm", -4.687262074706563),
+                                    ("time-of-day (latent)<time-of-day> - <time-of-day> (interval)",
+                                     -5.785874363374673),
+                                    ("hourday", -3.5886497860384536),
+                                    ("<hour-of-day> <integer><time-of-day> am|pm",
+                                     -6.191339471482838),
+                                    ("<day-of-month> (ordinal)August", -6.191339471482838),
+                                    ("dayhour", -3.5171908220563086),
+                                    ("<time> timezoneyear (latent)", -5.498192290922892),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.275048739608683),
+                                    ("Tuesdayfrom|since|after <time>", -5.498192290922892),
+                                    ("daymonth", -3.4832892703806273),
+                                    ("hourquarter", -5.275048739608683),
+                                    ("monthyear", -4.93857650298747),
+                                    ("<time-of-day> am|pmyear (latent)", -5.498192290922892),
+                                    ("Thai Pongalyear (latent)", -5.498192290922892),
+                                    ("intersecthh:mm", -6.191339471482838),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.785874363374673),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.191339471482838),
+                                    ("houryear", -4.399580002254782),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -6.191339471482838),
+                                    ("<day-of-month> (ordinal)October", -6.191339471482838),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.498192290922892),
+                                    ("hournograin", -4.93857650298747),
+                                    ("<time-of-day> am|pmintersect", -4.93857650298747),
+                                    ("Octoberyear (latent)", -6.191339471482838),
+                                    ("Good Fridayyear (latent)", -5.785874363374673),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.785874363374673),
+                                    ("early morningat <time-of-day>", -6.191339471482838),
+                                    ("until <time>on <day>", -5.498192290922892),
+                                    ("part of days<time-of-day> - <time-of-day> (interval)",
+                                     -6.191339471482838),
+                                    ("time-of-day (latent)intersect", -5.498192290922892),
+                                    ("todayin <number> (implicit minutes)", -6.191339471482838),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.498192290922892),
+                                    ("this <part-of-day><time-of-day> - <time-of-day> (interval)",
+                                     -6.191339471482838),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -6.191339471482838),
+                                    ("hh:mmon <day>", -4.93857650298747),
+                                    ("hhhmmintersect", -5.785874363374673),
+                                    ("absorption of , after named dayJuly", -5.275048739608683),
+                                    ("from|since|after <time>July", -5.785874363374673),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -5.275048739608683),
+                                    ("Clean Mondayyear (latent)", -6.191339471482838),
+                                    ("monthhour", -6.191339471482838),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.785874363374673),
+                                    ("hourmonth", -4.051273307986567),
+                                    ("todayat <time-of-day>", -6.191339471482838),
+                                    ("Bank Holidayyear (latent)", -5.498192290922892),
+                                    ("hhhmmyear (latent)", -4.93857650298747),
+                                    ("from|since|after <time>December", -6.191339471482838),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -6.191339471482838),
+                                    ("<time-of-day> am|pmon <day>", -4.93857650298747),
+                                    ("Mondayyear (latent)", -5.498192290922892),
+                                    ("dayday", -4.051273307986567),
+                                    ("dd/mmat <time-of-day>", -5.785874363374673),
+                                    ("on <day>September", -5.498192290922892),
+                                    ("time-of-day (latent)September", -5.785874363374673),
+                                    ("hourhour", -3.9400476728763425),
+                                    ("time-of-day (latent)on <day>", -4.687262074706563),
+                                    ("Thursdaydd/mm", -6.191339471482838),
+                                    ("time-of-day (latent)<cycle> after|before <time>",
+                                     -5.785874363374673),
+                                    ("dayyear", -3.077824162272463),
+                                    ("New Year's Dayyear (latent)", -5.275048739608683),
+                                    ("time-of-day (latent)Sunday", -5.785874363374673),
+                                    ("Thursdayfrom|since|after <time>", -4.4865913792444125),
+                                    ("Thursdayat <time-of-day>", -4.581901559048737),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -6.191339471482838),
+                                    ("Aprilyear (latent)", -6.191339471482838),
+                                    ("the <day-of-month> (ordinal)July", -6.191339471482838),
+                                    ("the <day-of-month> (number)July", -6.191339471482838),
+                                    ("monthminute", -6.191339471482838),
+                                    ("hourminute", -5.498192290922892),
+                                    ("<time-of-day> am|pmtomorrow", -5.785874363374673),
+                                    ("Thursdayhh:mm", -5.275048739608683),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.785874363374673),
+                                    ("minutemonth", -4.051273307986567),
+                                    ("time-of-day (latent)Friday", -5.785874363374673),
+                                    ("minutehour", -6.191339471482838),
+                                    ("part of daysat <time-of-day>", -5.092727182814728),
+                                    ("time-of-day (latent)this|last|next <cycle>",
+                                     -3.8399642143193597),
+                                    ("Augustyear (latent)", -5.785874363374673),
+                                    ("week-endin|during <named-month>|year", -6.191339471482838),
+                                    ("time-of-day (latent)Tuesday", -5.785874363374673),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.191339471482838),
+                                    ("tonight<time-of-day> - <time-of-day> (interval)",
+                                     -6.191339471482838),
+                                    ("dd/mm<time-of-day> - <time-of-day> (interval)",
+                                     -5.785874363374673),
+                                    ("Sundayyear (latent)", -5.275048739608683),
+                                    ("hourweek", -5.275048739608683),
+                                    ("the <day-of-month> (ordinal)Monday", -5.498192290922892),
+                                    ("Christmasat <time-of-day>", -6.191339471482838),
+                                    ("from|since|after <time>year (latent)", -5.092727182814728),
+                                    ("dd/mmyear (latent)", -6.191339471482838),
+                                    ("hhhmmon <day>", -5.275048739608683),
+                                    ("yesterday<time-of-day> am|pm", -6.191339471482838),
+                                    ("<day-of-month> (ordinal)July", -5.498192290922892),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -6.191339471482838),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -6.191339471482838),
+                                    ("in|during <named-month>|yearyear (latent)",
+                                     -6.191339471482838),
+                                    ("at <time-of-day>intersect", -5.275048739608683),
+                                    ("hh:mmyear (latent)", -4.805045110362947),
+                                    ("Holiyear (latent)", -6.191339471482838),
+                                    ("until <time><time-of-day> am|pm", -6.191339471482838),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.785874363374673),
+                                    ("dayminute", -3.329138590553369),
+                                    ("yyyy-mm-ddhh:mm", -5.785874363374673),
+                                    ("intersectfrom|since|after <time>", -5.785874363374673),
+                                    ("intersectSeptember", -4.319537294581246),
+                                    ("minuteday", -3.0343390503327243),
+                                    ("absorption of , after named dayintersect",
+                                     -6.191339471482838),
+                                    ("intersectyear (latent)", -6.191339471482838),
+                                    ("Februaryin|during the <part-of-day>", -6.191339471482838),
+                                    ("<duration> after|before|from|past <time>December",
+                                     -6.191339471482838),
+                                    ("time-of-day (latent)July", -5.498192290922892),
+                                    ("Saturdayyear (latent)", -6.191339471482838),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.191339471482838),
+                                    ("<day-of-month> (ordinal)Monday", -4.93857650298747),
+                                    ("at <time-of-day>on <day>", -5.275048739608683),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -6.191339471482838),
+                                    ("absorption of , after named daySeptember", -4.93857650298747),
+                                    ("Naraka Chaturdashiyear (latent)", -6.191339471482838),
+                                    ("from|since|after <time>on <day>", -5.275048739608683),
+                                    ("dayweek", -6.191339471482838),
+                                    ("Easter Sundayyear (latent)", -5.785874363374673),
+                                    ("time-of-day (latent)at <time-of-day>", -5.498192290922892),
+                                    ("Thursday<time-of-day> am|pm", -4.93857650298747),
+                                    ("weekyear", -5.785874363374673),
+                                    ("time-of-day (latent)Thursday", -5.785874363374673),
+                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
+                                     -6.191339471482838),
+                                    ("<day-of-month> (ordinal)April", -6.191339471482838),
+                                    ("yyyy-mm-dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.785874363374673),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
+                                     -5.498192290922892),
+                                    ("Sundayfrom|since|after <time>", -6.191339471482838),
+                                    ("absorption of , after named dayFebruary", -5.275048739608683),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.785874363374673),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -6.191339471482838),
+                                    ("tomorrowat <time-of-day>", -6.191339471482838),
+                                    ("daynograin", -5.785874363374673),
+                                    ("Fridayin|during <named-month>|year", -6.191339471482838),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.785874363374673),
+                                    ("last <cycle> of <time>year (latent)", -5.785874363374673),
+                                    ("tomorrow<time-of-day> am|pm", -6.191339471482838),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -5.498192290922892),
+                                    ("Diwaliyear (latent)", -5.785874363374673),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -6.191339471482838),
+                                    ("this <part-of-day>at <time-of-day>", -5.275048739608683),
+                                    ("Fridayyear (latent)", -5.275048739608683),
+                                    ("time-of-day (latent)April", -6.191339471482838),
+                                    ("minuteyear", -3.9941148941466182)],
+                               n = 332}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.329135947279942, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.30748469974796055,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.20479441264601328),
+                                    ("integer (0..19)", -1.6863989535702288)],
+                               n = 25}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.3737155789130304, unseen = -4.532599493153256,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -3.4231762883809305),
+                                    ("minuteminute", -2.91235066461494),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("hh:mmhh:mm", -2.91235066461494),
+                                    ("dayday", -1.9568392195875037),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -3.4231762883809305),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
+                                    ("hourhour", -3.4231762883809305),
+                                    ("minutehour", -3.4231762883809305),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.828641396489095),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.29191040856130207, unseen = -5.14166355650266,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.570849079588725),
+                                    ("dayhour", -3.056356895370426),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)intersect", -4.442651256490317),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.7495040759303713),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.442651256490317),
+                                    ("hh:mmtime-of-day (latent)", -3.5263605246161616),
+                                    ("hh:mm<time-of-day> am|pm", -4.037186148382152),
+                                    ("minuteminute", -3.5263605246161616),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.5263605246161616),
+                                    ("hh:mmhh:mm", -4.442651256490317),
+                                    ("dayday", -1.916922612182061),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)intersect", -4.442651256490317),
+                                    ("hourhour", -3.1898882879949486),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("dayyear", -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("minutehour", -3.3440389678222067),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("hh:mmintersect", -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)intersect", -4.037186148382152),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect", -4.037186148382152)],
+                               n = 59}}),
+       ("Saturday",
+        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}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.845826690498331),
+                                    ("weekmonth", -1.845826690498331),
+                                    ("week (grain)October", -1.845826690498331),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.845826690498331),
+                                    ("weekday", -1.3350010667323402)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second (grain) March", -1.5040773967762742),
+                                    ("secondmonth", -1.5040773967762742)],
+                               n = 1}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.5649493574615367),
+                                    ("minuteminute", -1.8718021769015913),
+                                    ("hh:mmhh:mm", -1.8718021769015913),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.5649493574615367),
+                                    ("hourhour", -2.5649493574615367),
+                                    ("hourminute", -2.5649493574615367),
+                                    ("minutehour", -2.0541237336955462),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.9704144655697013),
+                                    ("time-of-day (latent)hh:mm", -2.9704144655697013),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.5649493574615367)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.9218125974762528),
+                                    ("hh:mm<time-of-day> am|pm", -2.6149597780361984),
+                                    ("minuteminute", -2.6149597780361984),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -1.9218125974762528),
+                                    ("hh:mmhh:mm", -3.0204248861443626),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("minutehour", -1.7676619176489945),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.0204248861443626)],
+                               n = 14}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (20..90)integer (0..19)", -0.2876820724517809)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.2231435513142097)],
+                               n = 3}}),
+       ("Global Youth Service 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}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mothering Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.14398540805040755,
+                               unseen = -5.442417710521793,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.6433257068155483e-2),
+                                    ("intersect 2 numbers", -4.051784947803305)],
+                               n = 226},
+                   koData =
+                     ClassData{prior = -2.0091723458332797,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.5841201044498106),
+                                    ("negative numbers", -0.40546510810816444),
+                                    ("compose by multiplication", -2.277267285009756)],
+                               n = 35}}),
+       ("Bank Holiday",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.833213344056216),
+                                    ("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -2.1400661634962708),
+                                    ("dayday", -1.4469189829363254),
+                                    ("hourminute", -1.916922612182061),
+                                    ("hhhmm<integer> <unit-of-duration>", -2.833213344056216),
+                                    ("intersect<integer> <unit-of-duration>", -2.1400661634962708),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -2.4277482359480516),
+                                    ("from|since|after <time><integer> <unit-of-duration>",
+                                     -2.1400661634962708)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.540445040947149),
+                                    ("December<integer> <unit-of-duration>", -1.540445040947149)],
+                               n = 2}}),
+       ("hhhmm",
+        Classifier{okData =
+                     ClassData{prior = -2.247285585205863e-2,
+                               unseen = -3.828641396489095,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 44},
+                   koData =
+                     ClassData{prior = -3.8066624897703196,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("as soon as possible",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mahavir Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.21357410029805904,
+                               unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
+                   koData =
+                     ClassData{prior = -1.6486586255873816,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("dd/mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dayananda Saraswati Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        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}}),
+       ("first|second|third|fourth|fifth <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8649974374866046),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdaythis|last|next <cycle>",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -2.538973871058276),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.538973871058276),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6916760106710724),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.538973871058276)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -2.5649493574615367),
+                                    ("time-of-day (latent)integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer 21..99", -2.159484249353372),
+                                    ("hour", -0.8602012652231115),
+                                    ("at <time-of-day>integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer (20..90)", -1.8718021769015913)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("time-of-day (latent)integer (20..90)", -1.3862943611198906)],
+                               n = 1}}),
+       ("Rama Navami",
+        Classifier{okData =
+                     ClassData{prior = 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.2876820724517809, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.5257286443082556),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.120263536200091),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6094379124341003),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.120263536200091)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.8718021769015913),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.466337068793427)],
+                               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.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("half a <time-grain>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("King's Day",
+        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}}),
+       ("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}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) of <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.9810014688665833),
+                                    ("integer (numeric)integer (numeric)July", -1.9810014688665833),
+                                    ("integer (numeric)ordinal (digits)July", -1.9810014688665833),
+                                    ("ordinal (digits)integer (numeric)July", -1.9810014688665833),
+                                    ("month", -0.8023464725249373)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.546237407675729e-2,
+                               unseen = -4.477336814478207,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 86},
+                   koData =
+                     ClassData{prior = -3.1135153092103742, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.4849066497880004),
+                                    ("part of daysintersect", -2.4849066497880004),
+                                    ("hourday", -0.9808292530117262),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.4849066497880004),
+                                    ("part of daysthis <time>", -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (ordinal or number) of <named-month>",
+                                     -2.4849066497880004),
+                                    ("part of daysChristmas", -2.0794415416798357)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayday", -1.2992829841302609),
+                                    ("hourminute", -1.7047480922384253),
+                                    ("intersect<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("one twenty two", -1.0986122886681098),
+                                    ("one eleven", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <day-of-week> from <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Fridaynow", -2.2512917986064953),
+                                    ("integer (0..19)Tuesdaynow", -2.2512917986064953),
+                                    ("integer (0..19)Sundaynow", -2.2512917986064953),
+                                    ("integer (0..19)Fridaynow", -2.2512917986064953),
+                                    ("daynograin", -0.9985288301111273),
+                                    ("integer (numeric)Sundaynow", -2.2512917986064953),
+                                    ("integer (numeric)Tuesdaynow", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7339691750802004,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6422277352570913),
+                                    ("ordinal (digits)February", -2.740840023925201),
+                                    ("integer (numeric)February", -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("ordinal (digits)March", -2.3353749158170367),
+                                    ("integer (numeric)July", -2.740840023925201)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.6539264674066639,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.550597412411167),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("month", -0.8574502318512216),
+                                    ("integer (numeric)July", -1.550597412411167)],
+                               n = 13}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> minutes to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("minutehour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rabindra Jayanti",
+        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}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pargat Diwas",
+        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}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.740840023925201),
+                                    ("hour", -0.7259370033829361),
+                                    ("part of days", -0.7949298748698876)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("St Patrick'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}}),
+       ("tomorrow",
+        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}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0116009116784799),
+                                    ("hh:mm", -1.9924301646902063), ("hour", -1.0116009116784799),
+                                    ("minute", -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.4166384087062897, unseen = -5.25227342804663,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2580400255962119),
+                                    ("month (grain)", -2.356652314264321),
+                                    ("year (grain)", -2.474435349920705),
+                                    ("week (grain)", -1.2580400255962119),
+                                    ("quarter", -3.6375861597263857), ("year", -2.474435349920705),
+                                    ("month", -2.356652314264321),
+                                    ("quarter (grain)", -3.6375861597263857)],
+                               n = 89},
+                   koData =
+                     ClassData{prior = -1.0766333819493346, unseen = -4.653960350157523,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8111775550851565),
+                                    ("month (grain)", -2.4471663218051534),
+                                    ("year (grain)", -3.0349529867072724),
+                                    ("second", -3.0349529867072724),
+                                    ("week (grain)", -1.8111775550851565),
+                                    ("day", -2.2464956263430023), ("quarter", -3.0349529867072724),
+                                    ("year", -3.0349529867072724),
+                                    ("second (grain) ", -3.0349529867072724),
+                                    ("month", -2.4471663218051534),
+                                    ("quarter (grain)", -3.0349529867072724),
+                                    ("day (grain)", -2.2464956263430023)],
+                               n = 46}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August Bank Holiday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ratha-Yatra",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.4818380868927383,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.5260563034950494),
+                                    ("ordinal (digits)", -0.24512245803298496)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.9614111671546247, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.6286086594223742),
+                                    ("ordinal (digits)", -0.7621400520468967)],
+                               n = 13}}),
+       ("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.8649974374866046,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.5465437063680699,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21}}),
+       ("Guru Ravidass Jayanti",
+        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.4700036292457356,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("Chinese New Year",
+        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}}),
+       ("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 = -7.696104113612832e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -2.6026896854443837,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("Orthodox Good Friday",
+        Classifier{okData =
+                     ClassData{prior = 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.7087724984630261, unseen = -4.867534450455582,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.763846956391606e-2),
+                                    ("integer (0..19)", -2.374905754573672)],
+                               n = 127},
+                   koData =
+                     ClassData{prior = -0.6777622617204658, unseen = -4.897839799950911,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.15415067982725836),
+                                    ("integer (0..19)", -1.9459101490553135)],
+                               n = 131}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -2.0149030205422647),
+                                    ("MondayMarch", -2.0149030205422647),
+                                    ("FridayOctober", -1.6094379124341003),
+                                    ("Sundayintersect", -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6164133863285559, unseen = -5.308267697401205,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6642475784438173),
+                                    ("integer (0..19)year (grain)", -3.22386336637924),
+                                    ("integer (numeric)day (grain)", -2.6642475784438173),
+                                    ("integer (0..19)second (grain) ", -3.917010546939185),
+                                    ("integer (0..19)hour (grain)", -3.1060803307228566),
+                                    ("second", -3.5115454388310208),
+                                    ("integer (numeric)second (grain) ", -4.204692619390966),
+                                    ("integer (numeric)year (grain)", -3.3573947590037623),
+                                    ("day", -2.412933150162911), ("year", -2.6642475784438173),
+                                    ("integer (numeric)week (grain)", -3.22386336637924),
+                                    ("integer (0..19)month (grain)", -3.6938669956249752),
+                                    ("integer (20..90)minute (grain)", -4.61015772749913),
+                                    ("hour", -2.738355550597539), ("month", -3.3573947590037623),
+                                    ("integer (numeric)minute (grain)", -2.5952547069568657),
+                                    ("integer (0..19)minute (grain)", -3.22386336637924),
+                                    ("integer (numeric)month (grain)", -4.204692619390966),
+                                    ("minute", -2.167810692129926),
+                                    ("integer (numeric)hour (grain)", -3.6938669956249752),
+                                    ("integer (0..19)day (grain)", -3.6938669956249752),
+                                    ("integer (0..19)week (grain)", -3.3573947590037623)],
+                               n = 88},
+                   koData =
+                     ClassData{prior = -0.7762620872704519, unseen = -5.170483995038151,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.5553480614894135),
+                                    ("integer (0..19)year (grain)", -4.0661736852554045),
+                                    ("integer (numeric)day (grain)", -4.0661736852554045),
+                                    ("integer (numeric)quarter (grain)", -4.0661736852554045),
+                                    ("integer (numeric)year (grain)", -4.0661736852554045),
+                                    ("day", -3.5553480614894135), ("quarter", -3.5553480614894135),
+                                    ("year", -3.5553480614894135),
+                                    ("integer (numeric)week (grain)", -4.0661736852554045),
+                                    ("integer (0..19)month (grain)", -4.0661736852554045),
+                                    ("hour", -1.157452788691043), ("month", -3.5553480614894135),
+                                    ("integer (numeric)minute (grain)", -4.471638793363569),
+                                    ("integer (numeric)month (grain)", -4.0661736852554045),
+                                    ("minute", -4.471638793363569),
+                                    ("integer (numeric)hour (grain)", -1.157452788691043),
+                                    ("integer (0..19)day (grain)", -4.0661736852554045),
+                                    ("integer (0..19)week (grain)", -4.0661736852554045),
+                                    ("integer (0..19)quarter (grain)", -4.0661736852554045)],
+                               n = 75}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.3217558399823195),
+                                    ("integer (numeric)integer (numeric)July", -1.3217558399823195),
+                                    ("month", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guru Gobind Singh Jayanti",
+        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}}),
+       ("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}}),
+       ("Krishna Janmashtami",
+        Classifier{okData =
+                     ClassData{prior = 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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2607262624632527, unseen = -5.71042701737487,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>", -3.7612001156935624),
+                                    ("integer after|past <hour-of-day>", -4.3208159036289855),
+                                    ("at <time-of-day>", -2.374905754573672),
+                                    ("<time-of-day> o'clock", -4.608497976080766),
+                                    ("half after|past <hour-of-day>", -4.608497976080766),
+                                    ("second", -5.01396308418893), ("hh:mm:ss", -5.01396308418893),
+                                    ("<hour-of-day> <integer>", -4.097672352314775),
+                                    ("<integer> minutes to|till|before <hour-of-day>",
+                                     -5.01396308418893),
+                                    ("time-of-day (latent)", -1.6997770795164049),
+                                    ("hhmm (latent)", -5.01396308418893),
+                                    ("hh:mm", -2.374905754573672),
+                                    ("quarter after|past <hour-of-day>", -3.5098856874126563),
+                                    ("until <time>", -4.3208159036289855),
+                                    ("about|exactly <time-of-day>", -5.01396308418893),
+                                    ("hour", -1.252762968495368),
+                                    ("<time-of-day> sharp|exactly", -5.01396308418893),
+                                    ("minute", -1.6817585740137264)],
+                               n = 141},
+                   koData =
+                     ClassData{prior = -1.4718165345580525,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.248434627109745),
+                                    ("from|since|after <time>", -3.248434627109745),
+                                    ("at <time-of-day>", -3.536116699561526),
+                                    ("time-of-day (latent)", -1.1689930854299093),
+                                    ("hh:mm", -3.536116699561526),
+                                    ("until <time>", -3.9415818076696905),
+                                    ("hour", -1.0238110755854113), ("minute", -2.6888188391743224)],
+                               n = 42}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <day>",
+        Classifier{okData =
+                     ClassData{prior = -0.21511137961694557, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.8803128665695), ("dd/mm", -3.3843902633457743),
+                                    ("absorption of , after named day", -2.691243082785829),
+                                    ("intersect", -2.691243082785829),
+                                    ("Saturday", -2.691243082785829),
+                                    ("Friday", -2.9789251552376097), ("day", -0.8194409058842375),
+                                    ("the <day-of-month> (ordinal)", -2.9789251552376097),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.691243082785829)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.6422277352570913,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.6582280766035324),
+                                    ("day", -1.0986122886681098),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.6582280766035324)],
+                               n = 6}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thanksgiving Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guy Fawkes Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708),
+                                    ("year (grain)", -2.4277482359480516),
+                                    ("second", -2.833213344056216),
+                                    ("week (grain)", -2.1400661634962708),
+                                    ("day", -2.1400661634962708),
+                                    ("minute (grain)", -2.833213344056216),
+                                    ("year", -2.4277482359480516),
+                                    ("second (grain) ", -2.833213344056216),
+                                    ("minute", -2.833213344056216),
+                                    ("day (grain)", -2.1400661634962708)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -2.3025850929940455),
+                                    ("quarter", -1.3470736479666092),
+                                    ("minute (grain)", -2.8134107167600364),
+                                    ("hour", -2.3025850929940455),
+                                    ("quarter (grain)", -1.3470736479666092),
+                                    ("minute", -2.8134107167600364)],
+                               n = 18}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.2237754316221157),
+                                    ("this|last|next <cycle>", -1.4469189829363254),
+                                    ("year", -0.7537718023763802)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.916290731874155),
+                                    ("year", -0.916290731874155)],
+                               n = 1}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.12095261041766256,
+                               unseen = -4.276666119016055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 70},
+                   koData =
+                     ClassData{prior = -2.172223275130802, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("upcoming <integer> <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rosh Hashanah",
+        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> <named-day> ago|back",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Thursday", -0.6931471805599453),
+                                    ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> upcoming <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = -0.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}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -3.077165866675366e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
+                   koData =
+                     ClassData{prior = -3.4965075614664802,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from|past <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7691330875378672, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>hhhmm", -3.481240089335692),
+                                    ("a <unit-of-duration>Christmas", -3.481240089335692),
+                                    ("minuteminute", -3.481240089335692),
+                                    ("dayday", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>today", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.382627800667582),
+                                    ("minutehour", -1.7764919970972666),
+                                    ("daysecond", -3.481240089335692),
+                                    ("a <unit-of-duration>right now", -3.481240089335692),
+                                    ("minutenograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>Christmas", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -3.481240089335692),
+                                    ("secondnograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -2.5649493574615367),
+                                    ("yearday", -2.7880929087757464),
+                                    ("<integer> <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.481240089335692),
+                                    ("daynograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>now", -3.0757749812275272)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.6225296133459919, unseen = -4.276666119016055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterhour", -1.318240897874875),
+                                    ("dayhour", -3.56953269648137),
+                                    ("<integer> <unit-of-duration>intersect", -3.56953269648137),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -3.56953269648137),
+                                    ("a <unit-of-duration><time-of-day> am|pm", -2.065455299705096),
+                                    ("a <unit-of-duration>time-of-day (latent)",
+                                     -2.065455299705096),
+                                    ("dayday", -2.8763855159214247),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -3.56953269648137),
+                                    ("a <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.164067588373206),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -3.56953269648137)],
+                               n = 22}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -2.03688192726104),
+                                    ("time-of-day (latent)", -0.9382696385929302),
+                                    ("hour", -0.7375989431307791)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm",
+        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}}),
+       ("until <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -2.159484249353372),
+                                    ("time-of-day (latent)", -2.5649493574615367),
+                                    ("year", -2.159484249353372),
+                                    ("<time-of-day> am|pm", -1.8718021769015913),
+                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
+                                    ("minute", -1.6486586255873816)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.3025850929940455),
+                                    ("yesterday", -2.8134107167600364),
+                                    ("day", -2.8134107167600364),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("<time-of-day> am|pm", -3.2188758248682006),
+                                    ("hh:mm", -2.3025850929940455), ("hour", -1.4271163556401458),
+                                    ("minute", -1.8325814637483102)],
+                               n = 20}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dd/mm", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.2992829841302609),
+                                    ("Marcha <unit-of-duration>", -1.7047480922384253),
+                                    ("March<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayyear", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.5540343780972276, unseen = -5.420534999272286,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectthis|last|next <cycle>", -4.722953221644475),
+                                    ("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.722953221644475),
+                                    ("dayhour", -4.31748811353631),
+                                    ("daymonth", -2.0149030205422647),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.722953221644475),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.4701902531491067),
+                                    ("Wednesdayintersect", -4.722953221644475),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.3366588605245844),
+                                    ("Black Fridaythis|last|next <cycle>", -4.722953221644475),
+                                    ("<part-of-day> of <time>February", -4.722953221644475),
+                                    ("Saturday<time-of-day> am|pm", -4.722953221644475),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -4.31748811353631),
+                                    ("hourmonth", -4.722953221644475),
+                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
+                                     -4.029806041084529),
+                                    ("dayday", -2.4716614230379794),
+                                    ("the <day-of-month> (ordinal)February", -4.31748811353631),
+                                    ("WednesdayOctober", -4.722953221644475),
+                                    ("Wednesdaythis|last|next <cycle>", -4.31748811353631),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.4701902531491067),
+                                    ("dayyear", -3.8066624897703196),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.722953221644475),
+                                    ("Thursdayhh:mm", -4.31748811353631),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.722953221644475),
+                                    ("TuesdayOctober", -4.722953221644475),
+                                    ("the <day-of-month> (ordinal)March", -3.624340932976365),
+                                    ("Mondaythis|last|next <cycle>", -3.8066624897703196),
+                                    ("Fridayintersect", -4.029806041084529),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -4.31748811353631),
+                                    ("intersectOctober", -4.31748811353631),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.8066624897703196),
+                                    ("Tuesdaythis|last|next <cycle>", -4.31748811353631),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.722953221644475),
+                                    ("dayminute", -2.9311937524164198),
+                                    ("minuteday", -3.4701902531491067),
+                                    ("this|last|next <cycle>Sunday", -4.722953221644475),
+                                    ("Sundaythis|last|next <cycle>", -4.722953221644475),
+                                    ("on <day><time-of-day> am|pm", -4.722953221644475),
+                                    ("intersectintersect", -4.722953221644475),
+                                    ("weekday", -4.722953221644475),
+                                    ("dayweek", -3.624340932976365),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.31748811353631),
+                                    ("<datetime> - <datetime> (interval)July", -3.8066624897703196),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -4.029806041084529)],
+                               n = 77},
+                   koData =
+                     ClassData{prior = -0.8547885321163612, unseen = -5.225746673713201,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.527208644518379),
+                                    ("week-endOctober", -3.834061463958434),
+                                    ("daymonth", -1.7863686205931786),
+                                    ("TuesdaySeptember", -4.527208644518379),
+                                    ("Wednesdayintersect", -4.527208644518379),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.42859635585027),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -4.527208644518379),
+                                    ("hournograin", -4.121743536410215),
+                                    ("from|since|after <time>July", -4.121743536410215),
+                                    ("hourmonth", -2.581298495463066),
+                                    ("Fridaythis|last|next <cycle>", -4.527208644518379),
+                                    ("SundayFebruary", -4.527208644518379),
+                                    ("on <day>September", -3.834061463958434),
+                                    ("WednesdayOctober", -4.527208644518379),
+                                    ("intersectnow", -4.121743536410215),
+                                    ("week-endintersect", -4.527208644518379),
+                                    ("dayyear", -4.527208644518379),
+                                    ("FridayJuly", -3.6109179126442243),
+                                    ("FridaySeptember", -4.121743536410215),
+                                    ("the <day-of-month> (ordinal)July", -3.6109179126442243),
+                                    ("WednesdayFebruary", -4.527208644518379),
+                                    ("minutemonth", -3.0231312477421053),
+                                    ("Mondaythis|last|next <cycle>", -4.527208644518379),
+                                    ("SundayMarch", -4.527208644518379),
+                                    ("MondayFebruary", -4.121743536410215),
+                                    ("Fridayintersect", -4.527208644518379),
+                                    ("intersectOctober", -4.527208644518379),
+                                    ("dayminute", -4.527208644518379),
+                                    ("SaturdaySeptember", -4.527208644518379),
+                                    ("intersectSeptember", -3.1409142833984887),
+                                    ("Tuesdaynow", -4.121743536410215),
+                                    ("MondayMarch", -4.527208644518379),
+                                    ("FridayOctober", -4.527208644518379),
+                                    ("daynograin", -4.121743536410215),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -4.527208644518379),
+                                    ("Tuesdayintersect", -4.527208644518379),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -4.527208644518379),
+                                    ("<datetime> - <datetime> (interval)July", -4.527208644518379),
+                                    ("Sundayintersect", -4.527208644518379)],
+                               n = 57}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5978370007556204, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.8622008809294686),
+                                    ("Martin Luther King's Day", -2.8622008809294686),
+                                    ("Mothering Sunday", -2.8622008809294686),
+                                    ("day", -1.157452788691043), ("Sunday", -2.8622008809294686),
+                                    ("Chinese New Year", -2.169053700369523),
+                                    ("Thanksgiving Day", -2.8622008809294686),
+                                    ("Easter Sunday", -2.8622008809294686),
+                                    ("hour", -2.8622008809294686), ("Tuesday", -2.8622008809294686),
+                                    ("week-end", -2.8622008809294686)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.7985076962177716,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.740840023925201), ("Friday", -2.3353749158170367),
+                                    ("day", -1.824549292051046), ("Sunday", -2.740840023925201),
+                                    ("hour", -1.6422277352570913),
+                                    ("week-end", -1.6422277352570913)],
+                               n = 9}}),
+       ("March",
+        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}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0149030205422647),
+                                    ("Thursdayordinal (digits)", -2.70805020110221),
+                                    ("day", -2.3025850929940455),
+                                    ("Augustordinal (digits)", -2.70805020110221),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.3025850929940455),
+                                    ("Tuesdayordinal (digits)", -2.70805020110221),
+                                    ("Octoberordinals (first..twentieth,thirtieth,...)",
+                                     -2.70805020110221),
+                                    ("month", -1.2039728043259361),
+                                    ("Marchordinal (digits)", -2.70805020110221)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>ordinal (digits)",
+                                     -1.9459101490553135),
+                                    ("Augustordinal (digits)", -1.9459101490553135),
+                                    ("month", -1.540445040947149)],
+                               n = 2}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6325225587435105, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.3350010667323402),
+                                    ("ordinal (digits)", -0.3053816495511819)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.7576857016975165, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.5306282510621704),
+                                    ("ordinal (digits)", -0.8873031950009028)],
+                               n = 15}}),
+       ("<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}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval) timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.8109302162163288),
+                                    ("hh:mmhh:mm", -1.5040773967762742),
+                                    ("hhhmmhhhmm", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               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}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -0.5679840376059393, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -3.068052935133617),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.9694406464655074),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.374905754573672),
+                                    ("integer (numeric)this|last|next <cycle>", -2.662587827025453),
+                                    ("ordinal (digits)February", -3.068052935133617),
+                                    ("integer (numeric)February", -2.662587827025453),
+                                    ("month", -0.8708283577973976),
+                                    ("ordinal (digits)March", -2.662587827025453),
+                                    ("integer (numeric)July", -3.068052935133617)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.8362480242006186, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.8622008809294686),
+                                    ("month", -0.916290731874155),
+                                    ("integer (numeric)July", -1.6094379124341003)],
+                               n = 13}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyyqq",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.1972245773362196),
+                                    ("Halloween", -2.890371757896165),
+                                    ("Boss's Day", -2.890371757896165),
+                                    ("Mothering Sunday", -2.890371757896165),
+                                    ("Monday", -2.4849066497880004), ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -2.890371757896165),
+                                    ("March", -2.890371757896165), ("month", -2.890371757896165),
+                                    ("Tuesday", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.0794415416798357),
+                                    ("Saturday", -2.0794415416798357),
+                                    ("day", -1.6739764335716716)],
+                               n = 2}}),
+       ("<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}}),
+       ("the <ordinal> closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)Christmastoday",
+                                     -1.791759469228055),
+                                    ("dayday", -1.0986122886681098),
+                                    ("ordinal (digits)Christmastoday", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("ordinals (first..twentieth,thirtieth,...)MondayOctober",
+                                     -1.3862943611198906)],
+                               n = 1}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.652001563489282e-2),
+                                    ("integer (0..19)", -3.0910424533583156)],
+                               n = 42}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half a <time-grain>", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Purim",
+        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> 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 = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.8109302162163288),
+                                    ("year", -1.5040773967762742), ("month", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour (abbrev).",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               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 = -1.1631508098056809, unseen = -4.770684624465665,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.6635616461296463),
+                                    ("from|since|after <time>hh:mm", -3.152736022363656),
+                                    ("minuteminute", -1.5841201044498106),
+                                    ("<time> timezone<time> timezone", -3.3758795736778655),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.6635616461296463),
+                                    ("hh:mmhh:mm", -2.5649493574615367),
+                                    ("dayday", -2.5649493574615367),
+                                    ("hhhmmhhhmm", -3.152736022363656),
+                                    ("hourhour", -3.6635616461296463),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.6635616461296463),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.6635616461296463),
+                                    ("<time-of-day> am|pmhh:mm:ss", -4.069026754237811),
+                                    ("hoursecond", -3.6635616461296463),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.3758795736778655),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -3.152736022363656)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -0.3746934494414107, unseen = -5.308267697401205,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.204692619390966),
+                                    ("<time> timezonehhhmm", -4.204692619390966),
+                                    ("hourday", -3.00071981506503),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -4.61015772749913),
+                                    ("dayhour", -4.61015772749913),
+                                    ("daymonth", -3.6938669956249752),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <month>",
+                                     -3.6938669956249752),
+                                    ("<time-of-day> am|pmintersect", -4.61015772749913),
+                                    ("MondayOctober", -4.204692619390966),
+                                    ("from|since|after <time>hh:mm", -4.61015772749913),
+                                    ("hh:mm<time-of-day> am|pm", -3.5115454388310208),
+                                    ("hhhmmintersect", -4.61015772749913),
+                                    ("minuteminute", -2.167810692129926),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.917010546939185),
+                                    ("hh:mmhh:mm", -3.917010546939185),
+                                    ("dayday", -1.8067973465925955),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
+                                     -3.6938669956249752),
+                                    ("hhhmmhhhmm", -4.204692619390966),
+                                    ("hourhour", -3.6938669956249752),
+                                    ("hourminute", -4.61015772749913),
+                                    ("minutehour", -3.6938669956249752),
+                                    ("<time> timezonehh:mm", -4.61015772749913),
+                                    ("hh:mm<time> timezone", -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.61015772749913),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <named-month>",
+                                     -3.6938669956249752),
+                                    ("hh:mmintersect", -3.6938669956249752),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -4.61015772749913),
+                                    ("Christmastoday", -3.917010546939185),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.61015772749913),
+                                    ("from|since|after <time>intersect", -3.1060803307228566),
+                                    ("from|since|after <time>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.6938669956249752),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.204692619390966),
+                                    ("<time-of-day> am|pmhh:mm", -4.61015772749913),
+                                    ("from|since|after <time>the <day-of-month> (ordinal or number) of <named-month>",
+                                     -3.1060803307228566),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.61015772749913),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.204692619390966),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)intersect", -4.204692619390966)],
+                               n = 77}}),
+       ("Tuesday",
+        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}}),
+       ("New Year's Day",
+        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}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.1340142157190256, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>hh:mm", -3.0633909220278057),
+                                    ("hh:mmtime-of-day (latent)", -3.2865344733420154),
+                                    ("minuteminute", -1.6770965609079151),
+                                    ("<time> timezone<time> timezone", -3.2865344733420154),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.979681653901961),
+                                    ("hh:mmhh:mm", -2.4756042571256867),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("hhhmmhhhmm", -3.0633909220278057),
+                                    ("hourhour", -2.4756042571256867),
+                                    ("minutehour", -2.4756042571256867),
+                                    ("<time-of-day> am|pmhh:mm:ss", -3.979681653901961),
+                                    ("hhhmmtime-of-day (latent)", -3.2865344733420154),
+                                    ("hoursecond", -3.5742165457937967),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -3.0633909220278057)],
+                               n = 37},
+                   koData =
+                     ClassData{prior = -0.38822330167365837,
+                               unseen = -5.247024072160486,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.143134726391533),
+                                    ("<time> timezonehhhmm", -4.143134726391533),
+                                    ("about|exactly <time-of-day>time-of-day (latent)",
+                                     -4.548599834499697),
+                                    ("until <time>time-of-day (latent)", -3.295836866004329),
+                                    ("from|since|after <time>hh:mm", -4.548599834499697),
+                                    ("hh:mmtime-of-day (latent)", -2.5336968139574325),
+                                    ("hh:mm<time-of-day> am|pm", -3.295836866004329),
+                                    ("minuteminute", -2.469158292819861),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.632309102625542),
+                                    ("hh:mmhh:mm", -3.855452653939752),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -4.143134726391533),
+                                    ("hhhmmhhhmm", -4.143134726391533),
+                                    ("at <time-of-day><time-of-day> am|pm", -4.548599834499697),
+                                    ("hourhour", -1.9836504770381604),
+                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
+                                     -3.855452653939752),
+                                    ("hourminute", -3.4499875458315876),
+                                    ("minutehour", -1.715386490443481),
+                                    ("<time> timezonehh:mm", -4.548599834499697),
+                                    ("hh:mm<time> timezone", -4.548599834499697),
+                                    ("hhhmmtime-of-day (latent)", -3.855452653939752),
+                                    ("until <time><time-of-day> am|pm", -4.143134726391533),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<time-of-day> am|pmhh:mm", -4.548599834499697),
+                                    ("<part-of-day> at <time-of-day>time-of-day (latent)",
+                                     -3.855452653939752),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.044522437723423),
+                                    ("at <time-of-day>time-of-day (latent)", -3.632309102625542),
+                                    ("<time> timezonetime-of-day (latent)", -3.855452653939752),
+                                    ("<integer> to|till|before <hour-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.855452653939752)],
+                               n = 78}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("Ugadi",
+        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}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.3646431135879093, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.691243082785829),
+                                    ("Marchinteger (numeric)", -2.9789251552376097),
+                                    ("Aprilinteger (numeric)", -3.3843902633457743),
+                                    ("month", -0.8194409058842375),
+                                    ("Februaryinteger (numeric)", -2.1316272948504063),
+                                    ("Septemberinteger (numeric)", -2.691243082785829),
+                                    ("Octoberinteger (numeric)", -2.691243082785829),
+                                    ("Julyinteger (numeric)", -1.9980959022258835)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.1856236656577395,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.3978952727983707),
+                                    ("Wednesday", -2.3978952727983707),
+                                    ("Saturday", -2.3978952727983707),
+                                    ("Monday", -1.7047480922384253), ("day", -0.8938178760220964),
+                                    ("Tuesday", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.143134726391533,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 61},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9924301646902063),
+                                    ("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.9924301646902063),
+                                    ("week (grain)intersect", -2.3978952727983707),
+                                    ("week (grain)September", -2.3978952727983707)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2335922215070942),
+                                    ("day (grain)May", -2.2335922215070942),
+                                    ("week (grain)year (latent)", -1.9459101490553135),
+                                    ("weekmonth", -1.7227665977411035),
+                                    ("week (grain)October", -2.2335922215070942),
+                                    ("weekyear", -1.9459101490553135),
+                                    ("week (grain)intersect", -2.2335922215070942)],
+                               n = 9}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("daymonth", -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("weekyear", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vaisakhi",
+        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.3364722366212129, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>intersect", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.2512917986064953),
+                                    ("<integer> + '\"from|since|after <time>", -2.2512917986064953),
+                                    ("dayday", -1.55814461804655),
+                                    ("minutehour", -1.845826690498331),
+                                    ("<integer> + '\"<time-of-day> am|pm", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.2512917986064953)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.8718021769015913),
+                                    ("<integer> + '\"from|since|after <time>", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.8718021769015913),
+                                    ("minutehour", -1.8718021769015913)],
+                               n = 2}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.791759469228055),
+                                    ("hh:mmhh:mm", -2.1972245773362196),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hhhmmhhhmm", -2.1972245773362196),
+                                    ("minutehour", -1.791759469228055),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.1972245773362196)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.1972245773362196),
+                                    ("hhhmmintersect", -2.1972245773362196),
+                                    ("minuteminute", -1.791759469228055),
+                                    ("minutehour", -1.791759469228055),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("hhhmmtime-of-day (latent)", -2.1972245773362196)],
+                               n = 4}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\" for year",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Black Fridaythis|last|next <cycle>", -2.890371757896165),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -2.4849066497880004),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -2.1972245773362196),
+                                    ("dayyear", -0.8754687373538999),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -2.890371757896165),
+                                    ("intersectyear (latent)", -2.1972245773362196),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -1.9740810260220096)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Fridaythis|last|next <cycle>", -1.6094379124341003),
+                                    ("dayyear", -1.6094379124341003)],
+                               n = 1}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -4.1672696400568074e-2,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
+                   koData =
+                     ClassData{prior = -3.1986731175506815,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime>/<datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("secondsecond", -0.916290731874155),
+                                    ("intersectintersect", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm:ssintersect", -0.916290731874155),
+                                    ("secondsecond", -0.916290731874155)],
+                               n = 1}}),
+       ("Mid-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}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)July", -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.3978952727983707),
+                                    ("integer (numeric)integer (numeric)July", -1.9924301646902063),
+                                    ("month", -0.8938178760220964),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shushan Purim",
+        Classifier{okData =
+                     ClassData{prior = 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 =
diff --git a/Duckling/Ranking/Classifiers/EN_US.hs b/Duckling/Ranking/Classifiers/EN_US.hs
--- a/Duckling/Ranking/Classifiers/EN_US.hs
+++ b/Duckling/Ranking/Classifiers/EN_US.hs
@@ -37,3361 +37,4471 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> to|till|before <hour-of-day>",
         Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = -8.961215868968717e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
-                   koData =
-                     ClassData{prior = -2.456735772821304, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5682888691888516, unseen = -5.799092654460526,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 328},
-                   koData =
-                     ClassData{prior = -0.8358495384412113, unseen = -5.53338948872752,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 251}}),
-       ("<year> (bc|ad)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year", -1.2992829841302609),
-                                    ("<integer> <unit-of-duration>", -1.2992829841302609)],
-                               n = 2}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6739764335716716),
-                                    ("dayday", -1.1631508098056809),
-                                    ("day (grain)yesterday", -1.6739764335716716)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.6739764335716716),
-                                    ("year (grain)Christmas", -2.0794415416798357),
-                                    ("dayday", -2.0794415416798357),
-                                    ("day (grain)intersect", -1.6739764335716716),
-                                    ("day (grain)Easter Sunday", -2.0794415416798357),
-                                    ("yearday", -2.0794415416798357)],
-                               n = 4}}),
-       ("Easter Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Navaratri",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Shemini Atzeret",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ramadan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lazarus Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect 2 numbers",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("compose by multiplicationinteger (0..19)",
-                                     -0.2231435513142097)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
-                               n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("from|since|after <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.540445040947149, unseen = -4.248495242049359,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal or number) <named-month>",
-                                     -3.5409593240373143),
-                                    ("July", -3.5409593240373143),
-                                    ("year (latent)", -3.1354942159291497),
-                                    ("day", -3.1354942159291497),
-                                    ("time-of-day (latent)", -2.624668592163159),
-                                    ("year", -3.1354942159291497),
-                                    ("<time-of-day> am|pm", -2.624668592163159),
-                                    ("hh:mm", -2.624668592163159),
-                                    ("<day-of-month> (ordinal)", -3.5409593240373143),
-                                    ("hour", -2.03688192726104), ("month", -3.1354942159291497),
-                                    ("minute", -2.624668592163159),
-                                    ("August", -3.5409593240373143)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.2411620568168881, unseen = -5.111987788356543,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -4.007333185232471),
-                                    ("week", -4.412798293340635),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.412798293340635),
-                                    ("today", -4.412798293340635),
-                                    ("intersect", -2.540996116439044),
-                                    ("<time> for <duration>", -4.412798293340635),
-                                    ("second", -4.412798293340635), ("now", -3.71965111278069),
-                                    ("tomorrow", -4.007333185232471),
-                                    ("this|last|next <cycle>", -4.412798293340635),
-                                    ("day", -1.927891643552635),
-                                    ("time-of-day (latent)", -2.6210388241125804),
-                                    ("<time-of-day> am|pm", -4.007333185232471),
-                                    ("nograin", -3.71965111278069),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.412798293340635),
-                                    ("<day-of-month> (ordinal)", -4.007333185232471),
-                                    ("Easter Sunday", -4.412798293340635),
-                                    ("Christmas", -3.71965111278069), ("hour", -2.3978952727983707),
-                                    ("month", -4.412798293340635),
-                                    ("<datetime> - <datetime> (interval)", -3.1600353248452673),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.908720896564361),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -4.007333185232471),
-                                    ("minute", -1.927891643552635),
-                                    ("right now", -4.412798293340635),
-                                    ("<month> dd-dd (interval)", -3.71965111278069),
-                                    ("part of days", -4.412798293340635),
-                                    ("dd-dd <month> (interval)", -4.007333185232471)],
-                               n = 66}}),
-       ("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}}),
-       ("<ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.268683541318364),
-                                    ("daymonth", -2.268683541318364),
-                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.6741486494265287),
-                                    ("weekmonth", -1.7578579175523736),
-                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.6741486494265287),
-                                    ("weekyear", -1.9810014688665833),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
-                                     -2.6741486494265287)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom HaShoah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -1.6582280766035324),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)April", -2.3513752571634776),
-                                    ("month", -1.252762968495368)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.237332013101517e-2,
-                               unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("dayhour", -1.4816045409242156),
-                                    ("Mondayearly morning", -3.378724525810097),
-                                    ("time-of-day (latent)tonight", -3.378724525810097),
-                                    ("hourhour", -2.3978952727983707),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("todaypart of days", -3.784189633918261),
-                                    ("minutehour", -2.6855773452501515),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.378724525810097),
-                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
-                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
-                                    ("intersectpart of days", -3.784189633918261),
-                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("tomorrowpart of days", -2.3978952727983707),
-                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("yesterdaypart of days", -3.378724525810097),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("Mondaypart of days", -3.784189633918261)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -2.4277482359480516,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.772588722239781),
-                                    ("monthhour", -2.772588722239781),
-                                    ("hourhour", -2.772588722239781),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -2.772588722239781),
-                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.772588722239781)],
-                               n = 3}}),
-       ("Cyber Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -1.2729656758128873,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.3285040669720361, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.4557388028063e-2, unseen = -5.003946305945459,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.898599985096005),
-                                    ("noon|midnight|EOD|end of day", -3.898599985096005),
-                                    ("integer after|past <hour-of-day>", -3.898599985096005),
-                                    ("half after|past <hour-of-day>", -4.304065093204169),
-                                    ("time-of-day (latent)", -1.6650077635889111),
-                                    ("hhmm (latent)", -3.6109179126442243),
-                                    ("<time-of-day> am|pm", -1.7783364488959144),
-                                    ("hh:mm", -3.3877743613300146),
-                                    ("about|exactly <time-of-day>", -3.898599985096005),
-                                    ("hour", -1.0459685551826876),
-                                    ("<time-of-day> sharp|exactly", -4.304065093204169),
-                                    ("minute", -2.10684051586795)],
-                               n = 68},
-                   koData =
-                     ClassData{prior = -2.512305623976115, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.4816045409242156),
-                                    ("mm/dd", -3.4965075614664802),
-                                    ("absorption of , after named day", -3.0910424533583156),
-                                    ("intersect", -3.0910424533583156),
-                                    ("Saturday", -2.803360380906535),
-                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
-                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.803360380906535),
-                                    ("hour", -3.4965075614664802)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.10919929196499197,
-                               unseen = -3.9889840465642745,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 52},
-                   koData =
-                     ClassData{prior = -2.268683541318364, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7884573603642702),
-                                    ("hh:mmhh:mm", -0.7884573603642702)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
-                                    ("minutehour", -0.7884573603642702)],
-                               n = 9}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Passover",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vesak",
-        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}}),
-       ("Earth 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}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.12516314295400605,
-                               unseen = -4.6913478822291435,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.295836866004329),
-                                    ("<integer> more <unit-of-duration>", -3.9889840465642745),
-                                    ("three-quarters of an hour", -3.0726933146901194),
-                                    ("<integer> + '\"", -3.295836866004329),
-                                    ("number.number hours", -3.9889840465642745),
-                                    ("second", -3.58351893845611),
-                                    ("half a <time-grain>", -3.0726933146901194),
-                                    ("day", -3.295836866004329), ("year", -3.9889840465642745),
-                                    ("<integer> <unit-of-duration>", -1.6376087894007967),
-                                    ("a <unit-of-duration>", -3.0726933146901194),
-                                    ("quarter of an hour", -3.0726933146901194),
-                                    ("hour", -2.6026896854443837),
-                                    ("about|exactly <duration>", -3.9889840465642745),
-                                    ("half an hour (abbrev).", -3.58351893845611),
-                                    ("<integer> and an half hour", -3.9889840465642745),
-                                    ("minute", -1.2809338454620642)],
-                               n = 45},
-                   koData =
-                     ClassData{prior = -2.1400661634962708,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -2.3025850929940455), ("year", -1.791759469228055),
-                                    ("<integer> <unit-of-duration>", -1.791759469228055),
-                                    ("a <unit-of-duration>", -2.3025850929940455)],
-                               n = 6}}),
-       ("January",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Mattu Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.48550781578170077,
-                               unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -0.9555114450274363,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("Shavuot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> <duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayyear", -0.8472978603872037),
-                                    ("Tax Day<integer> <unit-of-duration>", -1.252762968495368),
-                                    ("Diwali<integer> <unit-of-duration>", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("Boss's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Orthodox Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("May",
-        Classifier{okData =
-                     ClassData{prior = 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.4479425363752806, unseen = -6.806829360392176,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Navaratriyear (latent)", -6.11257537285704),
-                                    ("Father's Dayyear (latent)", -6.11257537285704),
-                                    ("Ramadanyear (latent)", -6.11257537285704),
-                                    ("<datetime> - <datetime> (interval)on <date>",
-                                     -4.859812404361672),
-                                    ("Military Spouse Dayyear (latent)", -6.11257537285704),
-                                    ("Bhai Doojyear (latent)", -6.11257537285704),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.859812404361672),
-                                    ("hourday", -4.407827280618615),
-                                    ("dayhour", -3.309214991950505),
-                                    ("Martin Luther King's Dayyear (latent)", -5.707110264748875),
-                                    ("Shemini Atzeretyear (latent)", -6.11257537285704),
-                                    ("daymonth", -5.196284640982885),
-                                    ("monthday", -5.707110264748875),
-                                    ("monthyear", -4.3208159036289855),
-                                    ("Yom Ha'atzmautyear (latent)", -6.11257537285704),
-                                    ("Vijayadashamiyear (latent)", -6.11257537285704),
-                                    ("Administrative Professionals' Dayyear (latent)",
-                                     -4.726281011737149),
-                                    ("Thanksgiving Dayyear (latent)", -5.01396308418893),
-                                    ("Thai Pongalyear (latent)", -5.419428192297095),
-                                    ("Thiru Onamyear (latent)", -5.419428192297095),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.11257537285704),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -6.11257537285704),
-                                    ("houryear", -5.419428192297095),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -6.11257537285704),
-                                    ("Christmas<time-of-day> am|pm", -6.11257537285704),
-                                    ("last <day-of-week> of <time>year (latent)",
-                                     -6.11257537285704),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.419428192297095),
-                                    ("<time-of-day> am|pmintersect", -4.859812404361672),
-                                    ("Earth Houryear (latent)", -6.11257537285704),
-                                    ("Octoberyear (latent)", -4.608497976080766),
-                                    ("intersect<time-of-day> am|pm", -6.11257537285704),
-                                    ("Mattu Pongalyear (latent)", -6.11257537285704),
-                                    ("Shavuotyear (latent)", -6.11257537285704),
-                                    ("Dhanterasin <named-month>|year", -6.11257537285704),
-                                    ("at <time-of-day>in|within|after <duration>",
-                                     -6.11257537285704),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.11257537285704),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -5.707110264748875),
-                                    ("Marchyear (latent)", -6.11257537285704),
-                                    ("Sukkotyear (latent)", -5.707110264748875),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -6.11257537285704),
-                                    ("Clean Mondayyear (latent)", -5.707110264748875),
-                                    ("monthhour", -5.707110264748875),
-                                    ("todayat <time-of-day>", -6.11257537285704),
-                                    ("Thursday<time> timezone", -4.407827280618615),
-                                    ("from|since|after <time>December", -6.11257537285704),
-                                    ("Emergency Medical Services for Children Dayyear (latent)",
-                                     -6.11257537285704),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm", -6.11257537285704),
-                                    ("Palm SundaySunday", -5.707110264748875),
-                                    ("Tax Daythis|last|next <cycle>", -6.11257537285704),
-                                    ("dayday", -3.915350795520821),
-                                    ("<time> <part-of-day>at <time-of-day>", -6.11257537285704),
-                                    ("mm/ddat <time-of-day>", -6.11257537285704),
-                                    ("tonightat <time-of-day>", -6.11257537285704),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -5.419428192297095),
-                                    ("today<time-of-day> am|pm", -6.11257537285704),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.707110264748875),
-                                    ("at <time-of-day><time> <part-of-day>", -6.11257537285704),
-                                    ("mm/dd<time-of-day> am|pm", -6.11257537285704),
-                                    ("hourhour", -4.859812404361672),
-                                    ("<time-of-day> am|pmon <date>", -4.097672352314775),
-                                    ("Wednesdaythis|last|next <cycle>", -6.11257537285704),
-                                    ("Lentyear (latent)", -6.11257537285704),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.608497976080766),
-                                    ("Boghiyear (latent)", -6.11257537285704),
-                                    ("dayyear", -1.8712486202862937),
-                                    ("Thursdayfrom|since|after <time>", -5.707110264748875),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -6.11257537285704),
-                                    ("Thursdayat <time-of-day>", -5.707110264748875),
-                                    ("Islamic New Yearyear (latent)", -5.707110264748875),
-                                    ("Laylat al-Qadryear (latent)", -5.196284640982885),
-                                    ("Chhathin <named-month>|year", -6.11257537285704),
-                                    ("Vasant Panchamiin <named-month>|year", -6.11257537285704),
-                                    ("Diwaliin <named-month>|year", -6.11257537285704),
-                                    ("Shrove Tuesdayyear (latent)", -6.11257537285704),
-                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
-                                     -5.419428192297095),
-                                    ("<time-of-day> am|pmtomorrow", -5.419428192297095),
-                                    ("Yom Kippuryear (latent)", -6.11257537285704),
-                                    ("<part-of-day> of <time>year (latent)", -6.11257537285704),
-                                    ("minutehour", -5.196284640982885),
-                                    ("Kaanum Pongalyear (latent)", -5.707110264748875),
-                                    ("Maha Saptamiyear (latent)", -6.11257537285704),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.707110264748875),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.407827280618615),
-                                    ("for <duration> from <time>December", -6.11257537285704),
-                                    ("tomorrow<time-of-day> sharp|exactly", -6.11257537285704),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.196284640982885),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.707110264748875),
-                                    ("Pentecostyear (latent)", -6.11257537285704),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.196284640982885),
-                                    ("Eid al-Fitryear (latent)", -6.11257537285704),
-                                    ("Mondayin|during the <part-of-day>", -6.11257537285704),
-                                    ("Raksha Bandhanyear (latent)", -6.11257537285704),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.707110264748875),
-                                    ("Emancipation Dayyear (latent)", -5.419428192297095),
-                                    ("Navaratriin <named-month>|year", -6.11257537285704),
-                                    ("Ashurayear (latent)", -6.11257537285704),
-                                    ("Chinese New Yearyear (latent)", -6.11257537285704),
-                                    ("Sundayyear (latent)", -6.11257537285704),
-                                    ("Lag BaOmeryear (latent)", -6.11257537285704),
-                                    ("last weekend of <named-month>year (latent)",
-                                     -6.11257537285704),
-                                    ("Eid al-Adhayear (latent)", -5.196284640982885),
-                                    ("intersectin|during the <part-of-day>", -6.11257537285704),
-                                    ("Christmasat <time-of-day>", -6.11257537285704),
-                                    ("Passoveryear (latent)", -6.11257537285704),
-                                    ("Lazarus Saturdayyear (latent)", -6.11257537285704),
-                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
-                                     -6.11257537285704),
-                                    ("Cyber Mondayyear (latent)", -5.707110264748875),
-                                    ("Yom HaShoahyear (latent)", -5.707110264748875),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -5.707110264748875),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -6.11257537285704),
-                                    ("Thai Pongalin <named-month>|year", -6.11257537285704),
-                                    ("Septemberyear (latent)", -5.707110264748875),
-                                    ("mm/ddyear (latent)", -6.11257537285704),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.859812404361672),
-                                    ("Halloweenyear (latent)", -6.11257537285704),
-                                    ("<ordinal> last <cycle> of <time>year (latent)",
-                                     -5.707110264748875),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.419428192297095),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -6.11257537285704),
-                                    ("at <time-of-day>intersect", -5.707110264748875),
-                                    ("Rosh Hashanahyear (latent)", -5.419428192297095),
-                                    ("Dhanterasyear (latent)", -6.11257537285704),
-                                    ("Tu BiShvatyear (latent)", -6.11257537285704),
-                                    ("Holiyear (latent)", -5.419428192297095),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -6.11257537285704),
-                                    ("Holika Dahanyear (latent)", -5.419428192297095),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -6.11257537285704),
-                                    ("dayminute", -3.4735180432417816),
-                                    ("Mawlidyear (latent)", -6.11257537285704),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.707110264748875),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -6.11257537285704),
-                                    ("Jumu'atul-Widayear (latent)", -5.196284640982885),
-                                    ("minuteday", -2.4749892131306543),
-                                    ("absorption of , after named dayintersect", -6.11257537285704),
-                                    ("intersectyear (latent)", -6.11257537285704),
-                                    ("Orthodox Easter Sundayyear (latent)", -6.11257537285704),
-                                    ("<ordinal> <cycle> of <time>year (latent)", -6.11257537285704),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -6.11257537285704),
-                                    ("Boss's Dayyear (latent)", -5.707110264748875),
-                                    ("Global Youth Service Dayyear (latent)", -6.11257537285704),
-                                    ("Tisha B'Avyear (latent)", -6.11257537285704),
-                                    ("Isra and Mi'rajyear (latent)", -5.196284640982885),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -6.11257537285704),
-                                    ("Christmasyear (latent)", -5.707110264748875),
-                                    ("Naraka Chaturdashiyear (latent)", -5.707110264748875),
-                                    ("at <time-of-day>on <date>", -5.01396308418893),
-                                    ("Emergency Medical Services Weekyear (latent)",
-                                     -6.11257537285704),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.5031374604229395),
-                                    ("dayweek", -6.11257537285704),
-                                    ("Easter Sundayyear (latent)", -5.419428192297095),
-                                    ("weekyear", -5.01396308418893),
-                                    ("hh:mmin|during the <part-of-day>", -5.419428192297095),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.707110264748875),
-                                    ("Hanukkahyear (latent)", -5.419428192297095),
-                                    ("February<time> <part-of-day>", -6.11257537285704),
-                                    ("National Grandparents Dayyear (latent)", -6.11257537285704),
-                                    ("Tuesdayin <named-month>|year", -6.11257537285704),
-                                    ("Great Lentyear (latent)", -6.11257537285704),
-                                    ("tomorrowat <time-of-day>", -5.419428192297095),
-                                    ("Labor Dayyear (latent)", -6.11257537285704),
-                                    ("between <time> and <time>on <date>", -4.5031374604229395),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
-                                     -6.11257537285704),
-                                    ("last <cycle> of <time>year (latent)", -5.419428192297095),
-                                    ("at <time-of-day>tomorrow", -5.707110264748875),
-                                    ("tomorrow<time-of-day> am|pm", -6.11257537285704),
-                                    ("President's Dayyear (latent)", -6.11257537285704),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -6.11257537285704),
-                                    ("Diwaliyear (latent)", -6.11257537285704),
-                                    ("Black Fridayyear (latent)", -5.707110264748875),
-                                    ("the <ordinal> last <cycle> of <time>year (latent)",
-                                     -6.11257537285704),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -6.11257537285704),
-                                    ("Chhathyear (latent)", -5.707110264748875),
-                                    ("Vasant Panchamiyear (latent)", -6.11257537285704),
-                                    ("Palm Sundayintersect", -6.11257537285704),
-                                    ("Tax Dayyear (latent)", -5.196284640982885),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -6.11257537285704),
-                                    ("Februaryintersect", -6.11257537285704),
-                                    ("Mother's Dayyear (latent)", -6.11257537285704),
-                                    ("Simchat Torahyear (latent)", -6.11257537285704),
-                                    ("minuteyear", -6.11257537285704)],
-                               n = 338},
-                   koData =
-                     ClassData{prior = -1.0187150038116695, unseen = -6.413458957167357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.802380355275797),
-                                    ("hourday", -4.802380355275797),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.718671087149952),
-                                    ("dayhour", -3.153721729688415),
-                                    ("Tuesdayfrom|since|after <time>", -5.718671087149952),
-                                    ("daymonth", -3.578604923653681),
-                                    ("monthday", -5.313205979041787),
-                                    ("monthyear", -4.465908118654584),
-                                    ("<time-of-day> am|pmyear (latent)", -5.313205979041787),
-                                    ("Thai Pongalyear (latent)", -5.025523906590006),
-                                    ("intersecthh:mm", -5.718671087149952),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.718671087149952),
-                                    ("houryear", -4.802380355275797),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.718671087149952),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.025523906590006),
-                                    ("<time-of-day> am|pmintersect", -4.465908118654584),
-                                    ("until <time>on <date>", -5.025523906590006),
-                                    ("Octoberyear (latent)", -5.718671087149952),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.718671087149952),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -4.465908118654584),
-                                    ("about|exactly <time-of-day>year (latent)",
-                                     -5.718671087149952),
-                                    ("absorption of , after named dayJuly", -5.313205979041787),
-                                    ("from|since|after <time>July", -5.718671087149952),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -4.802380355275797),
-                                    ("Clean Mondayyear (latent)", -5.718671087149952),
-                                    ("monthhour", -5.718671087149952),
-                                    ("hourmonth", -4.802380355275797),
-                                    ("todayat <time-of-day>", -5.718671087149952),
-                                    ("from|since|after <time>December", -5.718671087149952),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -5.718671087149952),
-                                    ("Mondayyear (latent)", -4.620058798481842),
-                                    ("dayday", -5.313205979041787),
-                                    ("mm/ddat <time-of-day>", -5.313205979041787),
-                                    ("<time-of-day> am|pmon <date>", -4.465908118654584),
-                                    ("dayyear", -2.698246201005589),
-                                    ("Thursdaymm/dd", -5.718671087149952),
-                                    ("New Year's Dayyear (latent)", -5.313205979041787),
-                                    ("Thursdayfrom|since|after <time>", -4.0139229949115265),
-                                    ("Thursdayat <time-of-day>", -4.465908118654584),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.718671087149952),
-                                    ("Aprilyear (latent)", -5.718671087149952),
-                                    ("monthminute", -5.718671087149952),
-                                    ("<time-of-day> am|pmtomorrow", -5.718671087149952),
-                                    ("Thursdayhh:mm", -4.802380355275797),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.718671087149952),
-                                    ("minutemonth", -3.926911617921897),
-                                    ("week-endin <named-month>|year", -5.718671087149952),
-                                    ("Augustyear (latent)", -5.313205979041787),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.313205979041787),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.313205979041787),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -5.313205979041787),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.718671087149952),
-                                    ("Sundayyear (latent)", -5.025523906590006),
-                                    ("Christmasat <time-of-day>", -5.718671087149952),
-                                    ("from|since|after <time>year (latent)", -4.465908118654584),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.718671087149952),
-                                    ("yesterday<time-of-day> am|pm", -5.718671087149952),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -5.718671087149952),
-                                    ("mm/ddyear (latent)", -5.718671087149952),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.025523906590006),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.718671087149952),
-                                    ("at <time-of-day>intersect", -5.313205979041787),
-                                    ("hh:mmyear (latent)", -4.620058798481842),
-                                    ("Holiyear (latent)", -5.718671087149952),
-                                    ("until <time><time-of-day> am|pm", -5.718671087149952),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.718671087149952),
-                                    ("dayminute", -3.192942442841696),
-                                    ("intersectSeptember", -4.214593690373678),
-                                    ("minuteday", -2.6506181520163348),
-                                    ("absorption of , after named dayintersect",
-                                     -5.718671087149952),
-                                    ("Februaryin|during the <part-of-day>", -5.718671087149952),
-                                    ("hh:mmon <date>", -3.703768066607687),
-                                    ("Saturdayyear (latent)", -5.718671087149952),
-                                    ("from|since|after <time>on <date>", -4.802380355275797),
-                                    ("absorption of , after named daySeptember",
-                                     -4.802380355275797),
-                                    ("Naraka Chaturdashiyear (latent)", -5.718671087149952),
-                                    ("on <date>September", -5.313205979041787),
-                                    ("at <time-of-day>on <date>", -5.313205979041787),
-                                    ("in <named-month>|yearyear (latent)", -5.718671087149952),
-                                    ("dayweek", -5.718671087149952),
-                                    ("Easter Sundayyear (latent)", -5.313205979041787),
-                                    ("Thursday<time-of-day> am|pm", -5.025523906590006),
-                                    ("weekyear", -5.313205979041787),
-                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
-                                     -5.718671087149952),
-                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
-                                     -5.025523906590006),
-                                    ("Sundayfrom|since|after <time>", -5.718671087149952),
-                                    ("absorption of , after named dayFebruary", -4.802380355275797),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.718671087149952),
-                                    ("tomorrowat <time-of-day>", -5.718671087149952),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.718671087149952),
-                                    ("last <cycle> of <time>year (latent)", -5.313205979041787),
-                                    ("tomorrow<time-of-day> am|pm", -5.718671087149952),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -5.025523906590006),
-                                    ("Diwaliyear (latent)", -5.313205979041787),
-                                    ("<time-of-day> - <time-of-day> (interval)July",
-                                     -5.718671087149952),
-                                    ("Fridayyear (latent)", -5.313205979041787),
-                                    ("minuteyear", -4.465908118654584)],
-                               n = 191}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.2685113254635072,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.33024168687057687,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.1743533871447778),
-                                    ("integer (0..19)", -1.8325814637483102)],
-                               n = 23}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.791759469228055),
-                                    ("ordinal (digits)quarter (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("quarteryear", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
-                                     -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("Global Youth Service 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}}),
-       ("Tisha B'Av",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.13580154115906176,
-                               unseen = -5.135798437050262,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -3.614851411631109e-2),
-                                    ("intersect 2 numbers", -3.7436043538031827)],
-                               n = 165},
-                   koData =
-                     ClassData{prior = -2.063693184711697, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1349799328389845),
-                                    ("negative numbers", -0.6931471805599453),
-                                    ("compose by multiplication", -1.9459101490553135)],
-                               n = 24}}),
-       ("mm/dd/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -1.0296194171811581),
-                                    ("intersect<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -1.540445040947149),
-                                    ("from|since|after <time><integer> <unit-of-duration>",
-                                     -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.2039728043259361),
-                                    ("December<integer> <unit-of-duration>", -1.2039728043259361)],
-                               n = 2}}),
-       ("Memorial Day",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lincoln's Birthday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Emergency Medical Services for Children 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}}),
-       ("Hanukkah",
-        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}}),
-       ("Siblings 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}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.9808292530117262),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -2.0794415416798357),
-                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
-                                     -1.6739764335716716),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
-                                     -1.6739764335716716)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.0986122886681098),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
-                                     -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("National Grandparents Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half a <time-grain>",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maha Saptami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -3.822121282019774e-2,
-                               unseen = -4.3694478524670215,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 77},
-                   koData =
-                     ClassData{prior = -3.283414346005772, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.3513752571634776),
-                                    ("part of daysintersect", -2.3513752571634776),
-                                    ("hourday", -0.9650808960435872),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -2.3513752571634776),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -2.3513752571634776),
-                                    ("part of daysthis <time>", -2.3513752571634776),
-                                    ("part of daysChristmas", -1.9459101490553135)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Loyalty Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Shrove Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Kaanum Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom Kippur",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Tax 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}}),
-       ("powers of tens",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Groundhog Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15234072458201878,
-                               unseen = -5.1298987149230735,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.153672065851137),
-                                    ("month (grain)", -2.8213788864092133),
-                                    ("year (grain)", -2.4159137783010487),
-                                    ("week (grain)", -1.153672065851137),
-                                    ("quarter", -3.5145260669691587), ("year", -2.4159137783010487),
-                                    ("month", -2.8213788864092133),
-                                    ("quarter (grain)", -3.5145260669691587)],
-                               n = 79},
-                   koData =
-                     ClassData{prior = -1.9568392195875037,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2809338454620642),
-                                    ("week (grain)", -1.2809338454620642),
-                                    ("day", -1.9740810260220096),
-                                    ("day (grain)", -1.9740810260220096)],
-                               n = 13}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Simchat Torah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Raksha Bandhan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ashura",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Palm Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Adha",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
-                                    ("time-of-day (latent)", -1.9459101490553135),
-                                    ("<time-of-day> am|pm", -1.9459101490553135),
-                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
-                                    ("minute", -1.540445040947149)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -0.9808292530117262),
-                                    ("ordinal (digits)", -0.4700036292457356)],
-                               n = 6}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lag BaOmer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.262364264467491, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -1.466337068793427, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Chinese New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Emancipation 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}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|this|next <season>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.635159922909596, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.11441035117774422),
-                                    ("integer (0..19)", -2.3581549441488563)],
-                               n = 71},
-                   koData =
-                     ClassData{prior = -0.7547050735593787, unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.878087785311434e-2),
-                                    ("integer (0..19)", -3.0910424533583156),
-                                    ("integer 21..99", -3.4965075614664802)],
-                               n = 63}}),
-       ("beginning of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.13192754304254806, unseen = -5.19295685089021,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5483284762254965),
-                                    ("integer (0..19)year (grain)", -2.9901612285045354),
-                                    ("integer (numeric)day (grain)", -2.622436448379218),
-                                    ("integer (0..19)second (grain) ", -3.801091444720864),
-                                    ("integer (0..19)hour (grain)", -3.107944264160919),
-                                    ("second", -3.3956263366127),
-                                    ("integer (numeric)second (grain) ", -4.088773517172645),
-                                    ("integer (numeric)year (grain)", -3.2414756567854415),
-                                    ("day", -2.3541724617845388), ("year", -2.479335604738545),
-                                    ("integer (numeric)week (grain)", -3.107944264160919),
-                                    ("integer (0..19)month (grain)", -3.577947893406655),
-                                    ("hour", -2.7024791560527546), ("month", -3.2414756567854415),
-                                    ("integer (numeric)minute (grain)", -3.2414756567854415),
-                                    ("integer (0..19)minute (grain)", -3.107944264160919),
-                                    ("integer (numeric)month (grain)", -4.088773517172645),
-                                    ("minute", -2.5483284762254965),
-                                    ("integer (numeric)hour (grain)", -3.577947893406655),
-                                    ("integer (0..19)day (grain)", -3.577947893406655),
-                                    ("integer (0..19)week (grain)", -3.2414756567854415)],
-                               n = 78},
-                   koData =
-                     ClassData{prior = -2.0907410969337694, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2546422183735807, unseen = -5.37989735354046,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>", -3.765840495250065),
-                                    ("integer after|past <hour-of-day>", -3.9889840465642745),
-                                    ("at <time-of-day>", -2.1564025828159643),
-                                    ("<time-of-day> o'clock", -4.276666119016055),
-                                    ("half after|past <hour-of-day>", -4.276666119016055),
-                                    ("time-of-day (latent)", -1.7117167615545186),
-                                    ("hhmm (latent)", -4.68213122712422),
-                                    ("hh:mm", -2.330755969960742),
-                                    ("quarter after|past <hour-of-day>", -4.68213122712422),
-                                    ("until <time>", -3.9889840465642745),
-                                    ("about|exactly <time-of-day>", -4.68213122712422),
-                                    ("hour", -1.1856236656577395),
-                                    ("<time-of-day> sharp|exactly", -4.68213122712422),
-                                    ("minute", -1.791759469228055)],
-                               n = 100},
-                   koData =
-                     ClassData{prior = -1.492516574375198, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.20545280453606),
-                                    ("from|since|after <time>", -3.20545280453606),
-                                    ("<hour-of-day> <integer>", -3.6109179126442243),
-                                    ("time-of-day (latent)", -1.085189268335969),
-                                    ("hour", -1.0459685551826876), ("minute", -2.6946271807700692)],
-                               n = 29}}),
-       ("Yom Ha'atzmaut",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thiru Onam",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thai Pongal",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Vijayadashami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Administrative Professionals' 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}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5306282510621704,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.1400661634962708),
-                                    ("year (grain)", -2.4277482359480516),
-                                    ("second", -2.833213344056216),
-                                    ("week (grain)", -2.1400661634962708),
-                                    ("day", -2.1400661634962708),
-                                    ("minute (grain)", -2.833213344056216),
-                                    ("year", -2.4277482359480516),
-                                    ("second (grain) ", -2.833213344056216),
-                                    ("minute", -2.833213344056216),
-                                    ("day (grain)", -2.1400661634962708)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.8873031950009028, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("at the beginning|end of <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -0.6931471805599453),
-                                    ("year", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Dhanteras",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Tu BiShvat",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Whit Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -5.6352936551131744e-2,
-                               unseen = -4.2626798770413155,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
-                   koData =
-                     ClassData{prior = -2.9041650800285006, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("Holi",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Rosh Hashanah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <named-day> ago|back",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)Thursday", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Holika Dahan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -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}}),
-       ("Mawlid",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Jumu'atul-Wida",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.1786549963416462, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -2.159484249353372),
-                                    ("time-of-day (latent)", -2.5649493574615367),
-                                    ("year", -2.159484249353372),
-                                    ("<time-of-day> am|pm", -1.8718021769015913),
-                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
-                                    ("minute", -1.6486586255873816)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.2192034840549946),
-                                    ("yesterday", -2.7300291078209855),
-                                    ("day", -2.7300291078209855),
-                                    ("time-of-day (latent)", -1.6314168191528755),
-                                    ("hh:mm", -2.2192034840549946), ("hour", -1.5260563034950494),
-                                    ("minute", -1.749199854809259)],
-                               n = 18}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
-                                    ("this|last|next <cycle>", -1.791759469228055),
-                                    ("day", -2.4849066497880004),
-                                    ("time-of-day (latent)", -2.890371757896165),
-                                    ("hhmm (latent)", -2.4849066497880004),
-                                    ("<time-of-day> am|pm", -2.890371757896165),
-                                    ("hour", -2.1972245773362196),
-                                    ("next <time>", -2.890371757896165),
-                                    ("this|next <day-of-week>", -2.890371757896165),
-                                    ("minute", -2.4849066497880004)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("Sukkot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthyear", -1.540445040947149),
-                                    ("Marcha <unit-of-duration>", -1.9459101490553135),
-                                    ("March<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("Vijayadashami<integer> <unit-of-duration>",
-                                     -1.9459101490553135),
-                                    ("dayyear", -1.540445040947149),
-                                    ("Tax Day<integer> <unit-of-duration>", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("World Vegan Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.5198754592859085, unseen = -4.990432586778736,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.290459441148391),
-                                    ("dayhour", -3.884994333040227),
-                                    ("daymonth", -3.0376964726530233),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.290459441148391),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.597312260588446),
-                                    ("Wednesdayintersect", -4.290459441148391),
-                                    ("Labor Daythis|last|next <cycle>", -4.290459441148391),
-                                    ("Black Fridaythis|last|next <cycle>", -4.290459441148391),
-                                    ("<part-of-day> of <time>February", -4.290459441148391),
-                                    ("Saturday<time-of-day> am|pm", -4.290459441148391),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -3.884994333040227),
-                                    ("on <date><time-of-day> am|pm", -4.290459441148391),
-                                    ("hourmonth", -4.290459441148391),
-                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
-                                     -4.290459441148391),
-                                    ("dayday", -2.4186572642467996),
-                                    ("the <day-of-month> (ordinal)February", -3.884994333040227),
-                                    ("WednesdayOctober", -4.290459441148391),
-                                    ("Wednesdaythis|last|next <cycle>", -3.884994333040227),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.3741687092742363),
-                                    ("dayyear", -3.0376964726530233),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.290459441148391),
-                                    ("Thursdayhh:mm", -3.884994333040227),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.290459441148391),
-                                    ("Memorial Daythis|last|next <cycle>", -4.290459441148391),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -3.884994333040227),
-                                    ("TuesdayOctober", -4.290459441148391),
-                                    ("the <day-of-month> (ordinal)March", -4.290459441148391),
-                                    ("Mondaythis|last|next <cycle>", -4.290459441148391),
-                                    ("Fridayintersect", -4.290459441148391),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.884994333040227),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.884994333040227),
-                                    ("Tuesdaythis|last|next <cycle>", -4.290459441148391),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.290459441148391),
-                                    ("dayminute", -2.9041650800285006),
-                                    ("minuteday", -3.3741687092742363),
-                                    ("this|last|next <cycle>Sunday", -4.290459441148391),
-                                    ("Sundaythis|last|next <cycle>", -4.290459441148391),
-                                    ("weekday", -4.290459441148391),
-                                    ("dayweek", -3.1918471524802814),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -3.884994333040227)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -0.9028677115420143, unseen = -4.77912349311153,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.07753744390572),
-                                    ("week-endOctober", -3.3843902633457743),
-                                    ("daymonth", -1.8803128665695),
-                                    ("TuesdaySeptember", -4.07753744390572),
-                                    ("Wednesdayintersect", -4.07753744390572),
-                                    ("hourmonth", -2.9789251552376097),
-                                    ("Fridaythis|last|next <cycle>", -4.07753744390572),
-                                    ("SundayFebruary", -4.07753744390572),
-                                    ("WednesdayOctober", -4.07753744390572),
-                                    ("week-endintersect", -4.07753744390572),
-                                    ("dayyear", -4.07753744390572),
-                                    ("FridayJuly", -3.672072335797555),
-                                    ("FridaySeptember", -4.07753744390572),
-                                    ("WednesdayFebruary", -4.07753744390572),
-                                    ("minutemonth", -3.1612467120315646),
-                                    ("SundayMarch", -4.07753744390572),
-                                    ("MondayFebruary", -3.672072335797555),
-                                    ("Fridayintersect", -4.07753744390572),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.672072335797555),
-                                    ("dayminute", -3.3843902633457743),
-                                    ("SaturdaySeptember", -4.07753744390572),
-                                    ("intersectSeptember", -3.1612467120315646),
-                                    ("MondayMarch", -4.07753744390572),
-                                    ("on <date>September", -3.672072335797555),
-                                    ("Tuesdayintersect", -4.07753744390572),
-                                    ("Sundayintersect", -4.07753744390572)],
-                               n = 30}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4595323293784402,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.9444389791664407),
-                                    ("Martin Luther King's Day", -2.9444389791664407),
-                                    ("Cyber Monday", -2.9444389791664407),
-                                    ("Memorial Day", -2.9444389791664407),
-                                    ("Mother's Day", -2.9444389791664407),
-                                    ("day", -1.1526795099383855), ("Sunday", -2.9444389791664407),
-                                    ("Chinese New Year", -2.538973871058276),
-                                    ("Thanksgiving Day", -2.9444389791664407),
-                                    ("Easter Sunday", -2.9444389791664407),
-                                    ("hour", -2.9444389791664407), ("Tuesday", -2.9444389791664407),
-                                    ("week-end", -2.9444389791664407)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.9985288301111273, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.639057329615259), ("day", -2.2335922215070942),
-                                    ("Sunday", -2.639057329615259), ("hour", -1.540445040947149),
-                                    ("week-end", -1.540445040947149)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Labor Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Clean Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Emergency Medical Services Week",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Veterans Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm.dd.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Isra and Mi'raj",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.3184537311185346,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.803360380906535),
-                                    ("a <unit-of-duration>Christmas", -2.803360380906535),
-                                    ("dayday", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>today", -2.803360380906535),
-                                    ("daysecond", -2.803360380906535),
-                                    ("a <unit-of-duration>right now", -2.803360380906535),
-                                    ("minutenograin", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>Christmas", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>Easter Sunday",
-                                     -2.803360380906535),
-                                    ("secondnograin", -2.803360380906535),
-                                    ("yearday", -2.1102132003465894),
-                                    ("daynograin", -2.803360380906535),
-                                    ("<integer> <unit-of-duration>now", -2.3978952727983707)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.4423470353692043),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.4423470353692043),
-                                    ("dayday", -2.03688192726104),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.4423470353692043),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.4423470353692043)],
-                               n = 3}}),
-       ("<day-of-month> (ordinal or number) of <month>",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.803360380906535),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.803360380906535),
-                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
-                                    ("integer (numeric)this|last|next <cycle>",
-                                     -2.3978952727983707),
-                                    ("ordinal (digits)February", -2.803360380906535),
-                                    ("integer (numeric)February", -2.3978952727983707),
-                                    ("month", -0.9315582040049435),
-                                    ("ordinal (digits)March", -2.803360380906535),
-                                    ("integer (numeric)July", -2.803360380906535)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.7047480922384253),
-                                    ("month", -1.7047480922384253)],
-                               n = 1}}),
-       ("Independence Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Naraka Chaturdashi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("beginning of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.9704144655697013),
-                                    ("Halloween", -2.9704144655697013),
-                                    ("Wednesday", -2.9704144655697013),
-                                    ("Boss's Day", -2.9704144655697013),
-                                    ("Memorial Day", -2.9704144655697013),
-                                    ("Monday", -2.9704144655697013),
-                                    ("Tax Day", -2.9704144655697013),
-                                    ("Mother's Day", -2.9704144655697013),
-                                    ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.9704144655697013),
-                                    ("March", -2.9704144655697013), ("month", -2.9704144655697013),
-                                    ("Tuesday", -2.277267285009756)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>|year",
-        Classifier{okData =
-                     ClassData{prior = -0.2719337154836418,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<year> (bc|ad)", -1.845826690498331),
-                                    ("October", -2.9444389791664407),
-                                    ("year (latent)", -1.3350010667323402),
-                                    ("year", -0.9295359586241757), ("March", -2.9444389791664407),
-                                    ("month", -2.538973871058276)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.4350845252893227, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.6739764335716716),
-                                    ("year (latent)", -1.3862943611198906),
-                                    ("year", -1.3862943611198906), ("month", -1.6739764335716716)],
-                               n = 5}}),
-       ("Islamic New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half a <time-grain>", -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}}),
-       ("half an hour (abbrev).",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               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.5596157879354228, unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.012261575505202),
-                                    ("from|since|after <time>hh:mm", -2.501435951739211),
-                                    ("minuteminute", -1.2776605201170952),
-                                    ("hh:mmhh:mm", -1.9136492868370918),
-                                    ("dayday", -3.012261575505202),
-                                    ("hourhour", -3.012261575505202),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.012261575505202),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.012261575505202),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.012261575505202)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.2386784521643803),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.2386784521643803),
-                                    ("daymonth", -2.833213344056216),
-                                    ("<time-of-day> am|pmintersect", -3.2386784521643803),
-                                    ("hh:mm<time-of-day> am|pm", -2.833213344056216),
-                                    ("minuteminute", -1.9859154836690123),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("dayday", -3.2386784521643803),
-                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
-                                     -2.833213344056216),
-                                    ("hourhour", -2.5455312716044354),
-                                    ("minutehour", -2.833213344056216),
-                                    ("hh:mmintersect", -2.322387720290225),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.2386784521643803),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("from|since|after <time>intersect", -2.833213344056216)],
-                               n = 15}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Laylat al-Qadr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Boghi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("at the beginning|end of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("January", -1.3862943611198906),
-                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.0986122886681098),
-                                    ("month", -1.0986122886681098)],
-                               n = 1}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>hh:mm", -2.4849066497880004),
-                                    ("minuteminute", -1.529395204760564),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -1.8971199848858813),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.4418327522790392, unseen = -4.532599493153256,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.828641396489095),
-                                    ("until <time>time-of-day (latent)", -2.575878427993727),
-                                    ("hh:mmtime-of-day (latent)", -2.12389330425067),
-                                    ("hh:mm<time-of-day> am|pm", -3.4231762883809305),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.828641396489095),
-                                    ("hourhour", -1.6314168191528755),
-                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
-                                     -3.828641396489095),
-                                    ("hourminute", -3.828641396489095),
-                                    ("minutehour", -1.5773495978825998),
-                                    ("until <time><time-of-day> am|pm", -3.4231762883809305),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -2.575878427993727),
-                                    ("at <time-of-day>time-of-day (latent)", -3.4231762883809305),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.4231762883809305)],
-                               n = 36}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("President's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Diwali",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("last night",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   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.916290731874155, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.9924301646902063),
-                                    ("daymonth", -1.4816045409242156),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.9924301646902063),
-                                    ("week (grain)intersect", -2.3978952727983707),
-                                    ("week (grain)September", -2.3978952727983707)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.2335922215070942),
-                                    ("day (grain)May", -2.2335922215070942),
-                                    ("week (grain)year (latent)", -1.9459101490553135),
-                                    ("weekmonth", -1.7227665977411035),
-                                    ("week (grain)October", -2.2335922215070942),
-                                    ("weekyear", -1.9459101490553135),
-                                    ("week (grain)intersect", -2.2335922215070942)],
-                               n = 9}}),
-       ("Chhath",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vasant Panchami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("daymonth", -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("weekyear", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Labor Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("Great Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maundy Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("compose by multiplication",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.832909122935104),
-                                    ("hh:mmhh:mm", -0.832909122935104)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
-                                    ("minuteminute", -1.410986973710262),
-                                    ("minutehour", -1.410986973710262),
-                                    ("hh:mmintersect", -1.410986973710262)],
-                               n = 18}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\" for year",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Labor Daythis|last|next <cycle>", -2.803360380906535),
-                                    ("Administrative Professionals' Dayyear (latent)",
-                                     -2.803360380906535),
-                                    ("Black Fridaythis|last|next <cycle>", -2.803360380906535),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -2.3978952727983707),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -2.803360380906535),
-                                    ("dayyear", -1.0116009116784799),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -2.803360380906535),
-                                    ("Memorial Daythis|last|next <cycle>", -2.803360380906535),
-                                    ("intersectyear (latent)", -2.803360380906535),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -2.3978952727983707)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Fridaythis|last|next <cycle>", -1.8718021769015913),
-                                    ("dayyear", -1.8718021769015913)],
-                               n = 1}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("at the beginning|end of <week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.330733340286331,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.706570200892086),
-                                    ("this|last|next <cycle>", -0.8209805520698302),
-                                    ("about|exactly <time-of-day>", -2.70805020110221)],
-                               n = 36},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Fitr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Trinity Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Pentecost",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.639057329615259),
-                                    ("Martin Luther King's Day", -2.639057329615259),
-                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
-                                    ("Thanksgiving Day", -2.639057329615259),
-                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
-                                    ("winter", -2.639057329615259),
-                                    ("week-end", -2.639057329615259),
-                                    ("summer", -2.2335922215070942)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                     ClassData{prior = -2.5649493574615367, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7308875085427924),
+                                    ("integer (numeric)time-of-day (latent)", -0.7308875085427924)],
+                               n = 12}}),
+       ("week",
+        Classifier{okData =
+                     ClassData{prior = 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> timezone",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.23410650459726,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.4277482359480516),
+                                    ("hhhmm", -1.65455834771457),
+                                    ("<time-of-day> am|pm", -2.0222831278398874),
+                                    ("hh:mm", -2.2735975561207935), ("hour", -1.821612432377736),
+                                    ("minute", -1.128465251817791)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm", -1.3862943611198906), ("hh:mm", -1.791759469228055),
+                                    ("minute", -1.0986122886681098)],
+                               n = 3}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5249051449721773,
+                               unseen = -6.2878585601617845,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 536},
+                   koData =
+                     ClassData{prior = -0.8955363004047092, unseen = -5.918893854273146,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 370}}),
+       ("<year> (bc|ad)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -0.10008345855698253,
+                               unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003), ("day", -1.8607523407150064),
+                                    ("year", -2.4203681286504293),
+                                    ("<integer> <unit-of-duration>", -1.0340737675305385),
+                                    ("a <unit-of-duration>", -2.70805020110221),
+                                    ("month", -2.70805020110221), ("fortnight", -2.70805020110221)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -2.3513752571634776,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.2992829841302609),
+                                    ("<integer> <unit-of-duration>", -1.2992829841302609)],
+                               n = 2}}),
+       ("noon|midnight|EOD|end 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}}),
+       ("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}}),
+       ("Karva Chauth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Father's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        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}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -0.9808292530117262)],
+                               n = 2}}),
+       ("Maha Shivaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("from|since|after <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.7147984280919266, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal or number) <named-month>",
+                                     -3.8066624897703196),
+                                    ("July", -3.8066624897703196),
+                                    ("intersect", -3.8066624897703196),
+                                    ("year (latent)", -3.4011973816621555),
+                                    ("day", -2.4203681286504293),
+                                    ("the <day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("the <day-of-month> (number)", -3.8066624897703196),
+                                    ("time-of-day (latent)", -2.5538995212749516),
+                                    ("year", -3.4011973816621555),
+                                    ("<time-of-day> am|pm", -2.5538995212749516),
+                                    ("hh:mm", -2.890371757896165),
+                                    ("<day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("hour", -1.9348603128687285), ("month", -3.4011973816621555),
+                                    ("minute", -2.890371757896165),
+                                    ("August", -3.8066624897703196)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.19845093872383832,
+                               unseen = -5.645446897643238,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -4.032469158504013),
+                                    ("week", -4.948759890378168),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.948759890378168),
+                                    ("today", -4.948759890378168),
+                                    ("intersect", -3.002849741322855),
+                                    ("year (latent)", -4.948759890378168),
+                                    ("<time> for <duration>", -4.255612709818223),
+                                    ("second", -4.948759890378168), ("now", -3.339321977944068),
+                                    ("tomorrow", -4.543294782270004),
+                                    ("this|last|next <cycle>", -4.543294782270004),
+                                    ("day", -1.791759469228055),
+                                    ("the <day-of-month> (ordinal)", -4.543294782270004),
+                                    ("the <day-of-month> (number)", -3.5624655292582776),
+                                    ("time-of-day (latent)", -2.5064128550089637),
+                                    ("year", -4.543294782270004),
+                                    ("<time-of-day> am|pm", -4.255612709818223),
+                                    ("hh:mm", -4.543294782270004), ("nograin", -3.339321977944068),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.543294782270004),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.948759890378168),
+                                    ("<day-of-month> (ordinal)", -3.8501476017100584),
+                                    ("Easter Sunday", -4.948759890378168),
+                                    ("Christmas", -4.255612709818223),
+                                    ("hour", -2.3460702049337847), ("month", -4.948759890378168),
+                                    ("<datetime> - <datetime> (interval)", -2.751535313041949),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -3.002849741322855),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -4.543294782270004),
+                                    ("minute", -2.0043209112117277),
+                                    ("right now", -4.948759890378168),
+                                    ("<month> dd-dd (interval)", -4.255612709818223),
+                                    ("part of days", -4.948759890378168),
+                                    ("dd-dd <month> (interval)", -4.543294782270004)],
+                               n = 123}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("integer (numeric)time-of-day (latent)", -1.3862943611198906),
+                                    ("integer (20..90)time-of-day (latent)", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.268683541318364),
+                                    ("daymonth", -2.268683541318364),
+                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.6741486494265287),
+                                    ("weekmonth", -1.7578579175523736),
+                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.6741486494265287),
+                                    ("weekyear", -1.9810014688665833),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
+                                     -2.6741486494265287)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.1631508098056809, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.3025850929940455),
+                                    ("integer (numeric)April", -2.3025850929940455),
+                                    ("month", -1.2039728043259361)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.3746934494414107,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.772588722239781),
+                                    ("ordinal (digits)July", -2.0794415416798357),
+                                    ("integer (numeric)September", -2.367123614131617),
+                                    ("ordinal (digits)August", -2.772588722239781),
+                                    ("ordinal (digits)April", -2.772588722239781),
+                                    ("month", -0.9808292530117262),
+                                    ("integer (numeric)July", -2.0794415416798357)],
+                               n = 11}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.19105523676270922,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("dayhour", -1.499234772300486),
+                                    ("Mondayearly morning", -3.536116699561526),
+                                    ("time-of-day (latent)tonight", -3.536116699561526),
+                                    ("hourhour", -2.236833715431265),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("todaypart of days", -3.9415818076696905),
+                                    ("minutehour", -2.6888188391743224),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.536116699561526),
+                                    ("time-of-day (latent)this <part-of-day>", -3.9415818076696905),
+                                    ("Mondayin|during the <part-of-day>", -3.9415818076696905),
+                                    ("intersectpart of days", -3.0252910757955354),
+                                    ("Saturdaypart of days", -3.9415818076696905),
+                                    ("intersectin|during the <part-of-day>", -3.9415818076696905),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("tomorrowpart of days", -2.33214389523559),
+                                    ("hh:mmin|during the <part-of-day>", -3.0252910757955354),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("yesterdaypart of days", -3.536116699561526),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("Mondaypart of days", -3.9415818076696905)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -1.749199854809259, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.068052935133617),
+                                    ("yearhour", -3.068052935133617),
+                                    ("monthhour", -3.068052935133617),
+                                    ("hourhour", -1.9694406464655074),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("Februaryin|during the <part-of-day>", -3.068052935133617),
+                                    ("tomorrowpart of days", -3.068052935133617),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.151762203259462)],
+                               n = 8}}),
+       ("Cyber Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   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.2336148511815052, unseen = -5.327876168789581,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.9367156180185177),
+                                    ("noon|midnight|EOD|end of day", -4.2243976904702984),
+                                    ("integer after|past <hour-of-day>", -3.9367156180185177),
+                                    ("<time-of-day> o'clock", -4.629862798578463),
+                                    ("half after|past <hour-of-day>", -4.629862798578463),
+                                    ("hhhmm", -3.713572066704308),
+                                    ("<hour-of-day> <integer>", -3.9367156180185177),
+                                    ("time-of-day (latent)", -1.6594483330087617),
+                                    ("hhmm (latent)", -3.9367156180185177),
+                                    ("<time-of-day> am|pm", -1.9908054689632042),
+                                    ("hh:mm", -3.2435684374585723),
+                                    ("about|exactly <time-of-day>", -4.2243976904702984),
+                                    ("hour", -1.1333552371119826),
+                                    ("<time-of-day> sharp|exactly", -4.629862798578463),
+                                    ("minute", -1.889022774653262)],
+                               n = 95},
+                   koData =
+                     ClassData{prior = -1.5686159179138452, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9963334395476915),
+                                    ("<time-of-day> am|pm", -3.0757749812275272),
+                                    ("hour", -0.916290731874155)],
+                               n = 25}}),
+       ("December",
+        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}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.8622008809294686),
+                                    ("Saturday", -2.8622008809294686),
+                                    ("Monday", -2.456735772821304), ("Friday", -1.6094379124341003),
+                                    ("day", -0.8472978603872037), ("Sunday", -2.8622008809294686),
+                                    ("on <day>", -2.169053700369523)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = -3.17486983145803e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -3.4657359027997265,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("hour", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("the <day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7621400520468967, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6094379124341003),
+                                    ("ordinal (digits)February", -1.8971199848858813),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)March", -1.8971199848858813)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.6286086594223742,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.4816045409242156),
+                                    ("month", -0.8938178760220964),
+                                    ("integer (numeric)July", -1.4816045409242156)],
+                               n = 8}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -1.1834457647002796e-2,
+                               unseen = -4.454347296253507,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 84},
+                   koData =
+                     ClassData{prior = -4.442651256490317, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("in|during <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.262364264467491, unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<year> (bc|ad)", -2.03688192726104),
+                                    ("October", -3.1354942159291497),
+                                    ("year (latent)", -1.2636920390275583),
+                                    ("year", -0.9382696385929302), ("March", -2.7300291078209855),
+                                    ("month", -2.4423470353692043)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -1.466337068793427, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.5040773967762742),
+                                    ("year (latent)", -1.5040773967762742),
+                                    ("year", -1.5040773967762742), ("month", -1.5040773967762742)],
+                               n = 6}}),
+       ("<part-of-day> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.223809823697212e-2,
+                               unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this <part-of-day>hh:mm", -3.7013019741124937),
+                                    ("tonighthh:mm", -3.7013019741124937),
+                                    ("hourhour", -0.8979415932059586),
+                                    ("hourminute", -3.0081547935525483),
+                                    ("in|during the <part-of-day>time-of-day (latent)",
+                                     -3.7013019741124937),
+                                    ("this <part-of-day>time-of-day (latent)", -1.9965538818740682),
+                                    ("early morningtime-of-day (latent)", -3.7013019741124937),
+                                    ("tonight<time-of-day> o'clock", -3.7013019741124937),
+                                    ("tonighttime-of-day (latent)", -2.7850112422383386),
+                                    ("part of dayshh:mm", -3.7013019741124937),
+                                    ("part of daystime-of-day (latent)", -1.6218604324326575)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -2.538973871058276, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.4469189829363254),
+                                    ("this <part-of-day>time-of-day (latent)", -2.1400661634962708),
+                                    ("tonighttime-of-day (latent)", -2.1400661634962708),
+                                    ("part of daystime-of-day (latent)", -2.1400661634962708)],
+                               n = 3}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -2.0794415416798357),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.0794415416798357),
+                                    ("hhhmmhhhmm", -2.0794415416798357),
+                                    ("minutehour", -1.6739764335716716),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("minutehour", -1.3862943611198906),
+                                    ("hhhmmtime-of-day (latent)", -1.791759469228055)],
+                               n = 2}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Good Friday",
+        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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.12136085700426748,
+                               unseen = -3.4965075614664802,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 31},
+                   koData =
+                     ClassData{prior = -2.169053700369523, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<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.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.0794415416798357),
+                                    ("<part-of-day> at <time-of-day>", -2.0794415416798357),
+                                    ("time-of-day (latent)", -1.1631508098056809),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vesak",
+        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}}),
+       ("Earth 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}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.16034265007517937,
+                               unseen = -4.709530201312334,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.3141860046725258),
+                                    ("<integer> more <unit-of-duration>", -4.007333185232471),
+                                    ("three-quarters of an hour", -3.0910424533583156),
+                                    ("<integer> + '\"", -3.3141860046725258),
+                                    ("number.number hours", -4.007333185232471),
+                                    ("second", -3.6018680771243066),
+                                    ("half a <time-grain>", -3.0910424533583156),
+                                    ("day", -3.3141860046725258), ("year", -4.007333185232471),
+                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("a <unit-of-duration>", -3.0910424533583156),
+                                    ("quarter of an hour", -3.0910424533583156),
+                                    ("hour", -2.503255788456197),
+                                    ("about|exactly <duration>", -4.007333185232471),
+                                    ("half an hour (abbrev).", -3.6018680771243066),
+                                    ("<integer> and an half hour", -4.007333185232471),
+                                    ("minute", -1.2992829841302609)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -1.9095425048844386,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.833213344056216), ("quarter", -2.833213344056216),
+                                    ("year", -1.580450375560848),
+                                    ("<integer> <unit-of-duration>", -1.580450375560848),
+                                    ("a <unit-of-duration>", -2.4277482359480516)],
+                               n = 8}}),
+       ("the closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.3862943611198906),
+                                    ("dayyear", -2.4849066497880004),
+                                    ("Super Tuesdayintersect by \",\", \"of\", \"from\" for year",
+                                     -2.4849066497880004),
+                                    ("Christmastoday", -2.4849066497880004),
+                                    ("Super TuesdayMini-Tuesday", -2.4849066497880004),
+                                    ("Super Tuesdayyear (latent)", -2.4849066497880004),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -2.4849066497880004),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -2.4849066497880004)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("Super TuesdayMarch", -2.1972245773362196),
+                                    ("MondayOctober", -2.1972245773362196),
+                                    ("dayday", -2.1972245773362196),
+                                    ("Super Tuesday<named-month> <day-of-month> (non ordinal)",
+                                     -2.1972245773362196)],
+                               n = 3}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4},
+                   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}}),
+       ("Ganesh Chaturthi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        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}}),
+       ("<time-of-day> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)tonight", -2.5649493574615367),
+                                    ("hourhour", -1.3609765531356008),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -2.9704144655697013),
+                                    ("minutehour", -1.717651497074333),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("time-of-day (latent)this <part-of-day>", -2.9704144655697013),
+                                    ("hh:mmin|during the <part-of-day>", -2.0541237336955462),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -2.9704144655697013)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.466337068793427),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -1.466337068793427)],
+                               n = 2}}),
+       ("the nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("dayyear", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.0986122886681098),
+                                    ("ordinals (first..twentieth,thirtieth,...)Sundayyear (latent)",
+                                     -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.3723081191451507, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -0.2923879634891936, unseen = -4.007333185232471,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 53}}),
+       ("Parsi New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -1.0116009116784799),
+                                    ("Tax Day<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("Mini-Tuesday<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("Diwali<integer> <unit-of-duration>", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tuesday<integer> <unit-of-duration>", -1.252762968495368),
+                                    ("dayyear", -1.252762968495368)],
+                               n = 1}}),
+       ("Daylight Saving Start 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}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("May",
+        Classifier{okData =
+                     ClassData{prior = 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.48146571675252064,
+                               unseen = -7.275172319452771,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.581332378213926),
+                                    ("Father's Dayyear (latent)", -6.581332378213926),
+                                    ("Karva Chauthyear (latent)", -6.581332378213926),
+                                    ("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.581332378213926),
+                                    ("Maha Shivaratriyear (latent)", -6.581332378213926),
+                                    ("Ramadanyear (latent)", -5.328569409718558),
+                                    ("<datetime> - <datetime> (interval)on <day>",
+                                     -5.195038017094035),
+                                    ("Military Spouse Dayyear (latent)", -6.581332378213926),
+                                    ("Bhai Doojyear (latent)", -6.581332378213926),
+                                    ("hourday", -4.566429357671661),
+                                    ("dayhour", -3.5368099404905027),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.195038017094035),
+                                    ("Martin Luther King's Dayyear (latent)", -6.175867270105761),
+                                    ("Shemini Atzeretyear (latent)", -6.581332378213926),
+                                    ("daymonth", -4.566429357671661),
+                                    ("monthday", -6.175867270105761),
+                                    ("monthyear", -4.78957290898587),
+                                    ("Yom Ha'atzmautyear (latent)", -6.581332378213926),
+                                    ("Orthodox Good Fridayyear (latent)", -6.175867270105761),
+                                    ("Vijayadashamiyear (latent)", -6.581332378213926),
+                                    ("Administrative Professionals' Dayyear (latent)",
+                                     -5.195038017094035),
+                                    ("Thanksgiving Dayyear (latent)", -5.482720089545816),
+                                    ("Thai Pongalyear (latent)", -5.88818519765398),
+                                    ("Thiru Onamyear (latent)", -5.88818519765398),
+                                    ("hhhmmabsorption of , after named day", -6.581332378213926),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.581332378213926),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.665041646339771),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.581332378213926),
+                                    ("Krishna Janmashtamiyear (latent)", -6.175867270105761),
+                                    ("Guru Gobind Singh Jayantiyear (latent)", -6.581332378213926),
+                                    ("houryear", -5.665041646339771),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.581332378213926),
+                                    ("Christmas<time-of-day> am|pm", -6.581332378213926),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.581332378213926),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.88818519765398),
+                                    ("intersectin|during <named-month>|year", -6.581332378213926),
+                                    ("<time-of-day> am|pmintersect", -5.328569409718558),
+                                    ("Earth Houryear (latent)", -6.581332378213926),
+                                    ("Ganesh Chaturthiyear (latent)", -6.581332378213926),
+                                    ("Octoberyear (latent)", -5.077254981437651),
+                                    ("intersect<time-of-day> am|pm", -6.581332378213926),
+                                    ("Mattu Pongalyear (latent)", -6.581332378213926),
+                                    ("Saturday<part-of-day> at <time-of-day>", -6.581332378213926),
+                                    ("Daylight Saving Start Dayyear (latent)", -5.665041646339771),
+                                    ("Shavuotyear (latent)", -6.581332378213926),
+                                    ("Parsi New Yearyear (latent)", -5.665041646339771),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.581332378213926),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\" for year",
+                                     -6.581332378213926),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.581332378213926),
+                                    ("todayin|within|after <duration>", -6.581332378213926),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -6.175867270105761),
+                                    ("Marchyear (latent)", -6.581332378213926),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hhhmm",
+                                     -6.175867270105761),
+                                    ("Sukkotyear (latent)", -6.175867270105761),
+                                    ("hhhmmintersect", -6.175867270105761),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.175867270105761),
+                                    ("Daylight Saving End Dayyear (latent)", -5.665041646339771),
+                                    ("Clean Mondayyear (latent)", -6.175867270105761),
+                                    ("the <day-of-month> (ordinal)Sunday", -6.581332378213926),
+                                    ("monthhour", -6.175867270105761),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.665041646339771),
+                                    ("todayat <time-of-day>", -6.581332378213926),
+                                    ("Thursday<time> timezone", -4.183437105415555),
+                                    ("tonight<time-of-day> am|pm", -6.581332378213926),
+                                    ("time-of-day (latent)tonight", -6.175867270105761),
+                                    ("from|since|after <time>December", -6.581332378213926),
+                                    ("Emergency Medical Services for Children Dayyear (latent)",
+                                     -6.581332378213926),
+                                    ("<time-of-day> am|pmon <day>", -4.566429357671661),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.581332378213926),
+                                    ("yyyy-mm-ddhh:mm:ss", -6.175867270105761),
+                                    ("Tax Daythis|last|next <cycle>", -6.581332378213926),
+                                    ("dayday", -3.7481190341577095),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.175867270105761),
+                                    ("mm/ddat <time-of-day>", -6.581332378213926),
+                                    ("tonightat <time-of-day>", -5.482720089545816),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.88818519765398),
+                                    ("Dayananda Saraswati Jayantiyear (latent)",
+                                     -6.581332378213926),
+                                    ("today<time-of-day> am|pm", -6.581332378213926),
+                                    ("Februarythe <day-of-month> (ordinal)", -6.175867270105761),
+                                    ("at <time-of-day><time> <part-of-day>", -6.581332378213926),
+                                    ("<day-of-month> (ordinal)intersect", -6.175867270105761),
+                                    ("mm/dd<time-of-day> am|pm", -6.581332378213926),
+                                    ("hourhour", -3.6109179126442243),
+                                    ("Mahavir Jayantiyear (latent)", -6.175867270105761),
+                                    ("Navaratriin|during <named-month>|year", -6.581332378213926),
+                                    ("Wednesdaythis|last|next <cycle>", -6.581332378213926),
+                                    ("Lentyear (latent)", -6.581332378213926),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.709530201312334),
+                                    ("Boghiyear (latent)", -6.581332378213926),
+                                    ("dayyear", -1.802208885102396),
+                                    ("Karva Chauthin|during <named-month>|year",
+                                     -6.581332378213926),
+                                    ("Thursdayfrom|since|after <time>", -6.175867270105761),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.581332378213926),
+                                    ("Thursdayat <time-of-day>", -5.88818519765398),
+                                    ("Islamic New Yearyear (latent)", -6.175867270105761),
+                                    ("Laylat al-Qadryear (latent)", -5.665041646339771),
+                                    ("part of days<time-of-day> am|pm", -6.581332378213926),
+                                    ("Shrove Tuesdayyear (latent)", -6.581332378213926),
+                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
+                                     -5.88818519765398),
+                                    ("hourminute", -6.175867270105761),
+                                    ("<time-of-day> am|pmtomorrow", -5.665041646339771),
+                                    ("Yom Kippuryear (latent)", -6.581332378213926),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.88818519765398),
+                                    ("<part-of-day> of <time>year (latent)", -6.581332378213926),
+                                    ("minutehour", -5.328569409718558),
+                                    ("Kaanum Pongalyear (latent)", -6.175867270105761),
+                                    ("Maha Saptamiyear (latent)", -6.581332378213926),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.88818519765398),
+                                    ("time-of-day (latent)tomorrow", -5.665041646339771),
+                                    ("part of daysat <time-of-day>", -4.971894465779825),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.566429357671661),
+                                    ("for <duration> from <time>December", -6.581332378213926),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.581332378213926),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.328569409718558),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhhhmm",
+                                     -5.328569409718558),
+                                    ("time-of-day (latent)this <part-of-day>", -6.581332378213926),
+                                    ("Pentecostyear (latent)", -6.581332378213926),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.328569409718558),
+                                    ("<day-of-month> (ordinal)February", -6.581332378213926),
+                                    ("Eid al-Fitryear (latent)", -5.195038017094035),
+                                    ("Vasant Panchamiin|during <named-month>|year",
+                                     -6.581332378213926),
+                                    ("Mini-Tuesday<duration> hence|ago", -6.581332378213926),
+                                    ("Mondayin|during the <part-of-day>", -6.581332378213926),
+                                    ("Chhathin|during <named-month>|year", -6.581332378213926),
+                                    ("Diwaliin|during <named-month>|year", -6.581332378213926),
+                                    ("this <part-of-day><time-of-day> am|pm", -6.581332378213926),
+                                    ("Vaisakhiin|during <named-month>|year", -6.581332378213926),
+                                    ("Guru Ravidass Jayantiyear (latent)", -5.328569409718558),
+                                    ("Raksha Bandhanyear (latent)", -6.581332378213926),
+                                    ("daysecond", -6.175867270105761),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.175867270105761),
+                                    ("Emancipation Dayyear (latent)", -5.88818519765398),
+                                    ("Ratha-Yatrayear (latent)", -6.581332378213926),
+                                    ("Ashurayear (latent)", -6.581332378213926),
+                                    ("Tuesdayin|during <named-month>|year", -6.581332378213926),
+                                    ("Chinese New Yearyear (latent)", -6.581332378213926),
+                                    ("tomorrowintersect", -6.581332378213926),
+                                    ("Lag BaOmeryear (latent)", -6.581332378213926),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.581332378213926),
+                                    ("Eid al-Adhayear (latent)", -4.441266214717655),
+                                    ("intersectin|during the <part-of-day>", -6.581332378213926),
+                                    ("Palm Sundayyear (latent)", -6.581332378213926),
+                                    ("Christmasat <time-of-day>", -6.581332378213926),
+                                    ("Passoveryear (latent)", -6.581332378213926),
+                                    ("Lazarus Saturdayyear (latent)", -6.581332378213926),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.581332378213926),
+                                    ("Cyber Mondayyear (latent)", -6.175867270105761),
+                                    ("hhhmmon <day>", -5.665041646339771),
+                                    ("Yom HaShoahyear (latent)", -6.175867270105761),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -6.175867270105761),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.581332378213926),
+                                    ("Septemberyear (latent)", -6.175867270105761),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.077254981437651),
+                                    ("Halloweenyear (latent)", -6.581332378213926),
+                                    ("<ordinal> last <cycle> of <time>year (latent)",
+                                     -6.175867270105761),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.88818519765398),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -6.581332378213926),
+                                    ("at <time-of-day>intersect", -5.665041646339771),
+                                    ("Rosh Hashanahyear (latent)", -5.88818519765398),
+                                    ("Super Tuesdayyear (latent)", -5.665041646339771),
+                                    ("Dhanterasyear (latent)", -6.581332378213926),
+                                    ("Tu BiShvatyear (latent)", -6.581332378213926),
+                                    ("<day-of-month> (ordinal)December", -5.88818519765398),
+                                    ("Holiyear (latent)", -5.88818519765398),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.581332378213926),
+                                    ("Holika Dahanyear (latent)", -5.88818519765398),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.175867270105761),
+                                    ("dayminute", -3.231428290939321),
+                                    ("Mawlidyear (latent)", -6.581332378213926),
+                                    ("from <datetime> - <datetime> (interval)on <day>",
+                                     -6.175867270105761),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.581332378213926),
+                                    ("Jumu'atul-Widayear (latent)", -5.665041646339771),
+                                    ("minuteday", -2.8318283022835544),
+                                    ("absorption of , after named dayintersect", -5.88818519765398),
+                                    ("intersectyear (latent)", -6.581332378213926),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.581332378213926),
+                                    ("time-of-day (latent)in|within|after <duration>",
+                                     -6.581332378213926),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.581332378213926),
+                                    ("Mini-Tuesdayyear (latent)", -6.581332378213926),
+                                    ("intersecthhhmm", -6.175867270105761),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.581332378213926),
+                                    ("Boss's Dayyear (latent)", -6.175867270105761),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.581332378213926),
+                                    ("Global Youth Service Dayyear (latent)", -6.581332378213926),
+                                    ("Dhanterasin|during <named-month>|year", -6.581332378213926),
+                                    ("Super Tuesdayin|during <named-month>|year",
+                                     -6.581332378213926),
+                                    ("tonight<time-of-day> o'clock", -6.581332378213926),
+                                    ("Tisha B'Avyear (latent)", -6.581332378213926),
+                                    ("Isra and Mi'rajyear (latent)", -5.665041646339771),
+                                    ("at <time-of-day>on <day>", -4.971894465779825),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.175867270105761),
+                                    ("time-of-day (latent)<time> <part-of-day>", -5.88818519765398),
+                                    ("Christmasyear (latent)", -6.175867270105761),
+                                    ("Saturdayintersect", -6.581332378213926),
+                                    ("Naraka Chaturdashiyear (latent)", -6.175867270105761),
+                                    ("Thai Pongalin|during <named-month>|year", -6.581332378213926),
+                                    ("Emergency Medical Services Weekyear (latent)",
+                                     -6.581332378213926),
+                                    ("dayweek", -6.581332378213926),
+                                    ("Easter Sundayyear (latent)", -5.88818519765398),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <day>",
+                                     -6.175867270105761),
+                                    ("weekyear", -5.482720089545816),
+                                    ("Super Tuesdaythis|last|next <cycle>", -6.581332378213926),
+                                    ("King's Dayyear (latent)", -5.077254981437651),
+                                    ("hh:mmin|during the <part-of-day>", -5.665041646339771),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -6.175867270105761),
+                                    ("first|second|third|fourth|fifth <day-of-week> of <time>year (latent)",
+                                     -5.88818519765398),
+                                    ("Hanukkahyear (latent)", -5.88818519765398),
+                                    ("Rama Navamiyear (latent)", -6.581332378213926),
+                                    ("February<time> <part-of-day>", -6.581332378213926),
+                                    ("National Grandparents Dayyear (latent)", -6.581332378213926),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.88818519765398),
+                                    ("Great Lentyear (latent)", -6.581332378213926),
+                                    ("tomorrowat <time-of-day>", -5.88818519765398),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -6.581332378213926),
+                                    ("Labor Dayyear (latent)", -6.581332378213926),
+                                    ("tomorrow<part-of-day> at <time-of-day>", -6.175867270105761),
+                                    ("Ugadiyear (latent)", -5.195038017094035),
+                                    ("Vaisakhiyear (latent)", -5.88818519765398),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
+                                     -5.88818519765398),
+                                    ("last <cycle> of <time>year (latent)", -5.88818519765398),
+                                    ("at <time-of-day>tomorrow", -6.175867270105761),
+                                    ("tomorrow<time-of-day> am|pm", -6.581332378213926),
+                                    ("President's Dayyear (latent)", -6.581332378213926),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.581332378213926),
+                                    ("Diwaliyear (latent)", -6.581332378213926),
+                                    ("between <time> and <time>on <day>", -6.175867270105761),
+                                    ("Black Fridayyear (latent)", -6.175867270105761),
+                                    ("the <ordinal> last <cycle> of <time>year (latent)",
+                                     -6.581332378213926),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.581332378213926),
+                                    ("Chhathyear (latent)", -6.175867270105761),
+                                    ("Vasant Panchamiyear (latent)", -6.581332378213926),
+                                    ("Tax Dayyear (latent)", -5.482720089545816),
+                                    ("Rabindra Jayantiyear (latent)", -5.328569409718558),
+                                    ("this <part-of-day>at <time-of-day>", -5.328569409718558),
+                                    ("St Patrick's Dayyear (latent)", -6.581332378213926),
+                                    ("Thursday<time> (timezone)", -6.581332378213926),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.581332378213926),
+                                    ("Pargat Diwasyear (latent)", -5.328569409718558),
+                                    ("<datetime> - <datetime> (interval)July", -6.175867270105761),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -5.88818519765398),
+                                    ("Februaryintersect", -6.581332378213926),
+                                    ("Mother's Dayyear (latent)", -6.581332378213926),
+                                    ("Simchat Torahyear (latent)", -6.581332378213926),
+                                    ("minuteyear", -6.581332378213926)],
+                               n = 553},
+                   koData =
+                     ClassData{prior = -0.9620129812122502, unseen = -6.92951677076365,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursdayhhhmm", -4.731313240828446),
+                                    ("hourday", -3.6327009521603366),
+                                    ("<hour-of-day> <integer><time-of-day> am|pm",
+                                     -6.23539063760472),
+                                    ("<day-of-month> (ordinal)August", -6.23539063760472),
+                                    ("dayhour", -3.5612419881781916),
+                                    ("<time> timezoneyear (latent)", -5.5422434570447745),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.319099905730565),
+                                    ("Tuesdayfrom|since|after <time>", -5.136778348936611),
+                                    ("daymonth", -3.5273404365025103),
+                                    ("hourquarter", -5.319099905730565),
+                                    ("monthyear", -4.982627669109352),
+                                    ("<time-of-day> am|pmyear (latent)", -5.5422434570447745),
+                                    ("Thai Pongalyear (latent)", -5.5422434570447745),
+                                    ("intersecthh:mm", -6.23539063760472),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.829925529496556),
+                                    ("<datetime> - <datetime> (interval)Sunday",
+                                     -5.829925529496556),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.23539063760472),
+                                    ("houryear", -4.443631168376665),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -6.23539063760472),
+                                    ("<day-of-month> (ordinal)October", -6.23539063760472),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.5422434570447745),
+                                    ("hournograin", -4.982627669109352),
+                                    ("<time-of-day> am|pmintersect", -4.982627669109352),
+                                    ("Octoberyear (latent)", -6.23539063760472),
+                                    ("Good Fridayyear (latent)", -5.829925529496556),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.829925529496556),
+                                    ("early morningat <time-of-day>", -6.23539063760472),
+                                    ("until <time>on <day>", -5.5422434570447745),
+                                    ("part of days<time-of-day> - <time-of-day> (interval)",
+                                     -6.23539063760472),
+                                    ("time-of-day (latent)intersect", -5.5422434570447745),
+                                    ("todayin <number> (implicit minutes)", -6.23539063760472),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.5422434570447745),
+                                    ("this <part-of-day><time-of-day> - <time-of-day> (interval)",
+                                     -6.23539063760472),
+                                    ("about|exactly <time-of-day>year (latent)", -6.23539063760472),
+                                    ("hh:mmon <day>", -4.982627669109352),
+                                    ("hhhmmintersect", -5.829925529496556),
+                                    ("absorption of , after named dayJuly", -5.319099905730565),
+                                    ("from|since|after <time>July", -5.829925529496556),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -5.319099905730565),
+                                    ("Clean Mondayyear (latent)", -6.23539063760472),
+                                    ("monthhour", -6.23539063760472),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.829925529496556),
+                                    ("hourmonth", -4.095324474108449),
+                                    ("todayat <time-of-day>", -6.23539063760472),
+                                    ("hhhmmyear (latent)", -4.982627669109352),
+                                    ("from|since|after <time>December", -6.23539063760472),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -6.23539063760472),
+                                    ("<time-of-day> am|pmon <day>", -4.982627669109352),
+                                    ("Mondayyear (latent)", -5.136778348936611),
+                                    ("dayday", -3.8840153804412427),
+                                    ("mm/ddat <time-of-day>", -5.829925529496556),
+                                    ("on <day>September", -5.5422434570447745),
+                                    ("time-of-day (latent)September", -5.829925529496556),
+                                    ("hourhour", -4.155949095924885),
+                                    ("time-of-day (latent)on <day>", -4.731313240828446),
+                                    ("<datetime> - <datetime> (interval)year (latent)",
+                                     -6.23539063760472),
+                                    ("time-of-day (latent)<cycle> after|before <time>",
+                                     -5.829925529496556),
+                                    ("dayyear", -2.9031861274295165),
+                                    ("Thursdaymm/dd", -6.23539063760472),
+                                    ("New Year's Dayyear (latent)", -5.319099905730565),
+                                    ("Tuesdayyear (latent)", -5.136778348936611),
+                                    ("time-of-day (latent)Sunday", -5.829925529496556),
+                                    ("Thursdayfrom|since|after <time>", -4.5306425453662955),
+                                    ("Thursdayat <time-of-day>", -4.625952725170619),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -6.23539063760472),
+                                    ("Aprilyear (latent)", -6.23539063760472),
+                                    ("the <day-of-month> (ordinal)July", -6.23539063760472),
+                                    ("the <day-of-month> (number)July", -6.23539063760472),
+                                    ("monthminute", -6.23539063760472),
+                                    ("<time-of-day> am|pmtomorrow", -5.829925529496556),
+                                    ("Thursdayhh:mm", -5.319099905730565),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.829925529496556),
+                                    ("minutemonth", -4.095324474108449),
+                                    ("time-of-day (latent)Friday", -5.829925529496556),
+                                    ("minutehour", -6.23539063760472),
+                                    ("Tuesdayin <number> (implicit minutes)", -6.23539063760472),
+                                    ("part of daysat <time-of-day>", -5.136778348936611),
+                                    ("time-of-day (latent)this|last|next <cycle>",
+                                     -3.8840153804412427),
+                                    ("<day-of-month> (ordinal)Sunday", -6.23539063760472),
+                                    ("Augustyear (latent)", -5.829925529496556),
+                                    ("week-endin|during <named-month>|year", -6.23539063760472),
+                                    ("time-of-day (latent)Tuesday", -5.829925529496556),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\" for year",
+                                     -6.23539063760472),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.829925529496556),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.23539063760472),
+                                    ("tonight<time-of-day> - <time-of-day> (interval)",
+                                     -6.23539063760472),
+                                    ("Tuesdayin|during <named-month>|year", -6.23539063760472),
+                                    ("Sundayyear (latent)", -5.319099905730565),
+                                    ("hourweek", -5.319099905730565),
+                                    ("the <day-of-month> (ordinal)Monday", -5.5422434570447745),
+                                    ("Christmasat <time-of-day>", -6.23539063760472),
+                                    ("from|since|after <time>year (latent)", -5.136778348936611),
+                                    ("hhhmmon <day>", -5.319099905730565),
+                                    ("yesterday<time-of-day> am|pm", -6.23539063760472),
+                                    ("<day-of-month> (ordinal)July", -5.5422434570447745),
+                                    ("Tuesday<duration> hence|ago", -6.23539063760472),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -6.23539063760472),
+                                    ("mm/ddyear (latent)", -6.23539063760472),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -6.23539063760472),
+                                    ("in|during <named-month>|yearyear (latent)",
+                                     -6.23539063760472),
+                                    ("Tuesdaythis|last|next <cycle>", -6.23539063760472),
+                                    ("at <time-of-day>intersect", -5.319099905730565),
+                                    ("hh:mmyear (latent)", -4.84909627648483),
+                                    ("Holiyear (latent)", -6.23539063760472),
+                                    ("until <time><time-of-day> am|pm", -6.23539063760472),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.829925529496556),
+                                    ("dayminute", -3.3450188797085554),
+                                    ("yyyy-mm-ddhh:mm", -5.829925529496556),
+                                    ("intersectfrom|since|after <time>", -5.829925529496556),
+                                    ("intersectSeptember", -4.363588460703129),
+                                    ("minuteday", -3.078390216454607),
+                                    ("absorption of , after named dayintersect", -6.23539063760472),
+                                    ("intersectyear (latent)", -6.23539063760472),
+                                    ("Februaryin|during the <part-of-day>", -6.23539063760472),
+                                    ("<duration> after|before|from|past <time>December",
+                                     -6.23539063760472),
+                                    ("time-of-day (latent)July", -5.5422434570447745),
+                                    ("Saturdayyear (latent)", -6.23539063760472),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.23539063760472),
+                                    ("<day-of-month> (ordinal)Monday", -4.982627669109352),
+                                    ("at <time-of-day>on <day>", -5.319099905730565),
+                                    ("absorption of , after named daySeptember",
+                                     -4.982627669109352),
+                                    ("Naraka Chaturdashiyear (latent)", -6.23539063760472),
+                                    ("from|since|after <time>on <day>", -5.319099905730565),
+                                    ("dayweek", -6.23539063760472),
+                                    ("Easter Sundayyear (latent)", -5.829925529496556),
+                                    ("Thursday<time-of-day> am|pm", -4.982627669109352),
+                                    ("weekyear", -5.829925529496556),
+                                    ("time-of-day (latent)Thursday", -5.829925529496556),
+                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
+                                     -6.23539063760472),
+                                    ("<day-of-month> (ordinal)April", -6.23539063760472),
+                                    ("yyyy-mm-dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.829925529496556),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
+                                     -5.5422434570447745),
+                                    ("Sundayfrom|since|after <time>", -6.23539063760472),
+                                    ("absorption of , after named dayFebruary", -5.319099905730565),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.829925529496556),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -6.23539063760472),
+                                    ("tomorrowat <time-of-day>", -6.23539063760472),
+                                    ("daynograin", -5.829925529496556),
+                                    ("Fridayin|during <named-month>|year", -6.23539063760472),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.829925529496556),
+                                    ("last <cycle> of <time>year (latent)", -5.829925529496556),
+                                    ("tomorrow<time-of-day> am|pm", -6.23539063760472),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -5.5422434570447745),
+                                    ("Diwaliyear (latent)", -5.829925529496556),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -6.23539063760472),
+                                    ("this <part-of-day>at <time-of-day>", -5.319099905730565),
+                                    ("Fridayyear (latent)", -5.319099905730565),
+                                    ("Tuesdayin|within|after <duration>", -6.23539063760472),
+                                    ("time-of-day (latent)April", -6.23539063760472),
+                                    ("minuteyear", -4.038166060268501)],
+                               n = 342}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2318016140573243),
+                                    ("integer (0..19)", -1.575536360758419)],
+                               n = 27}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.3737155789130304, unseen = -4.532599493153256,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -3.4231762883809305),
+                                    ("minuteminute", -2.91235066461494),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("hh:mmhh:mm", -2.91235066461494),
+                                    ("dayday", -1.9568392195875037),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -3.4231762883809305),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
+                                    ("hourhour", -3.4231762883809305),
+                                    ("minutehour", -3.4231762883809305),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.828641396489095),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.29191040856130207, unseen = -5.14166355650266,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.570849079588725),
+                                    ("dayhour", -3.056356895370426),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)intersect", -4.442651256490317),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.7495040759303713),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.442651256490317),
+                                    ("hh:mmtime-of-day (latent)", -3.5263605246161616),
+                                    ("hh:mm<time-of-day> am|pm", -4.037186148382152),
+                                    ("minuteminute", -3.5263605246161616),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.5263605246161616),
+                                    ("hh:mmhh:mm", -4.442651256490317),
+                                    ("dayday", -1.916922612182061),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)intersect", -4.442651256490317),
+                                    ("hourhour", -3.1898882879949486),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("dayyear", -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("minutehour", -3.3440389678222067),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("hh:mmintersect", -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)intersect", -4.037186148382152),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect", -4.037186148382152)],
+                               n = 59}}),
+       ("Saturday",
+        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}}),
+       ("Mini-Tuesday",
+        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.15415067982725836,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.845826690498331),
+                                    ("weekmonth", -1.845826690498331),
+                                    ("week (grain)October", -1.845826690498331),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.845826690498331),
+                                    ("weekday", -1.3350010667323402)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second (grain) March", -1.5040773967762742),
+                                    ("secondmonth", -1.5040773967762742)],
+                               n = 1}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.5649493574615367),
+                                    ("minuteminute", -1.8718021769015913),
+                                    ("hh:mmhh:mm", -1.8718021769015913),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.5649493574615367),
+                                    ("hourhour", -2.5649493574615367),
+                                    ("hourminute", -2.5649493574615367),
+                                    ("minutehour", -2.0541237336955462),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.9704144655697013),
+                                    ("time-of-day (latent)hh:mm", -2.9704144655697013),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.5649493574615367)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.9218125974762528),
+                                    ("hh:mm<time-of-day> am|pm", -2.6149597780361984),
+                                    ("minuteminute", -2.6149597780361984),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -1.9218125974762528),
+                                    ("hh:mmhh:mm", -3.0204248861443626),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("minutehour", -1.7676619176489945),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.0204248861443626)],
+                               n = 14}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (20..90)integer (0..19)", -0.2876820724517809)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.2231435513142097)],
+                               n = 3}}),
+       ("Global Youth Service 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}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.1244944702443703, unseen = -5.594711379601839,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.2642476749759777e-2),
+                                    ("intersect 2 numbers", -4.204692619390966)],
+                               n = 264},
+                   koData =
+                     ClassData{prior = -2.145095511901273, unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.5841201044498106),
+                                    ("negative numbers", -0.40546510810816444),
+                                    ("compose by multiplication", -2.277267285009756)],
+                               n = 35}}),
+       ("mm/dd/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.833213344056216),
+                                    ("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -2.1400661634962708),
+                                    ("dayday", -1.4469189829363254),
+                                    ("hourminute", -1.916922612182061),
+                                    ("hhhmm<integer> <unit-of-duration>", -2.833213344056216),
+                                    ("intersect<integer> <unit-of-duration>", -2.1400661634962708),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -2.4277482359480516),
+                                    ("from|since|after <time><integer> <unit-of-duration>",
+                                     -2.1400661634962708)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.540445040947149),
+                                    ("December<integer> <unit-of-duration>", -1.540445040947149)],
+                               n = 2}}),
+       ("hhhmm",
+        Classifier{okData =
+                     ClassData{prior = -2.247285585205863e-2,
+                               unseen = -3.828641396489095,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 44},
+                   koData =
+                     ClassData{prior = -3.8066624897703196,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("as soon as possible",
+        Classifier{okData =
+                     ClassData{prior = 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.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}}),
+       ("Mahavir Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.322773392263051, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
+                   koData =
+                     ClassData{prior = -1.2878542883066382,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lincoln's Birthday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dayananda Saraswati Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Emergency Medical Services for Children 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}}),
+       ("Hanukkah",
+        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}}),
+       ("first|second|third|fourth|fifth <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdaythis|last|next <cycle>",
+                                     -2.995732273553991),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -2.995732273553991),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.995732273553991),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -2.5902671654458267),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.5902671654458267),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.742969305058623),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.5902671654458267)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.772588722239781, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)Sundayyear (latent)",
+                                     -1.791759469228055)],
+                               n = 1}}),
+       ("Siblings 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}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -2.5649493574615367),
+                                    ("time-of-day (latent)integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer 21..99", -2.159484249353372),
+                                    ("hour", -0.8602012652231115),
+                                    ("at <time-of-day>integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer (20..90)", -1.8718021769015913)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("time-of-day (latent)integer (20..90)", -1.3862943611198906)],
+                               n = 1}}),
+       ("Rama Navami",
+        Classifier{okData =
+                     ClassData{prior = 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.3677247801253174, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9932517730102834),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.6026896854443837),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6863989535702288),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.1972245773362196)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.1786549963416462, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.4469189829363254),
+                                    ("dayyear", -2.1400661634962708),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -2.1400661634962708),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.7346010553881064),
+                                    ("ordinals (first..twentieth,thirtieth,...)Sundayyear (latent)",
+                                     -2.1400661634962708)],
+                               n = 4}}),
+       ("National Grandparents Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> quarter",
+        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)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("half a <time-grain>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("King's Day",
+        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}}),
+       ("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}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) of <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.9810014688665833),
+                                    ("integer (numeric)integer (numeric)July", -1.9810014688665833),
+                                    ("integer (numeric)ordinal (digits)July", -1.9810014688665833),
+                                    ("ordinal (digits)integer (numeric)July", -1.9810014688665833),
+                                    ("month", -0.8023464725249373)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.546237407675729e-2,
+                               unseen = -4.477336814478207,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 86},
+                   koData =
+                     ClassData{prior = -3.1135153092103742, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.4849066497880004),
+                                    ("part of daysintersect", -2.4849066497880004),
+                                    ("hourday", -0.9808292530117262),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.4849066497880004),
+                                    ("part of daysthis <time>", -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (ordinal or number) of <named-month>",
+                                     -2.4849066497880004),
+                                    ("part of daysChristmas", -2.0794415416798357)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayday", -1.2992829841302609),
+                                    ("hourminute", -1.7047480922384253),
+                                    ("intersect<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("one twenty two", -1.0986122886681098),
+                                    ("one eleven", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Loyalty Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <day-of-week> from <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Fridaynow", -2.2512917986064953),
+                                    ("integer (0..19)Tuesdaynow", -2.2512917986064953),
+                                    ("integer (0..19)Sundaynow", -2.2512917986064953),
+                                    ("integer (0..19)Fridaynow", -2.2512917986064953),
+                                    ("daynograin", -0.9985288301111273),
+                                    ("integer (numeric)Sundaynow", -2.2512917986064953),
+                                    ("integer (numeric)Tuesdaynow", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7339691750802004,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6422277352570913),
+                                    ("ordinal (digits)February", -2.740840023925201),
+                                    ("integer (numeric)February", -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("ordinal (digits)March", -2.3353749158170367),
+                                    ("integer (numeric)July", -2.740840023925201)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.6539264674066639,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.550597412411167),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("month", -0.8574502318512216),
+                                    ("integer (numeric)July", -1.550597412411167)],
+                               n = 13}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> minutes to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("minutehour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rabindra Jayanti",
+        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}}),
+       ("Tax 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}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pargat Diwas",
+        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}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.740840023925201),
+                                    ("hour", -0.7259370033829361),
+                                    ("part of days", -0.7949298748698876)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("St Patrick'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}}),
+       ("tomorrow",
+        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}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0116009116784799),
+                                    ("hh:mm", -1.9924301646902063), ("hour", -1.0116009116784799),
+                                    ("minute", -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("Groundhog Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.4125322753312568, unseen = -5.303304908059076,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3093333199837622),
+                                    ("month (grain)", -2.4079456086518722),
+                                    ("year (grain)", -2.2537949288246137),
+                                    ("week (grain)", -1.3093333199837622),
+                                    ("quarter", -3.6888794541139363), ("year", -2.2537949288246137),
+                                    ("month", -2.4079456086518722),
+                                    ("quarter (grain)", -3.6888794541139363)],
+                               n = 94},
+                   koData =
+                     ClassData{prior = -1.08462604669337, unseen = -4.6913478822291435,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8489178830680035),
+                                    ("month (grain)", -2.4849066497880004),
+                                    ("year (grain)", -3.0726933146901194),
+                                    ("second", -2.7362210780689065),
+                                    ("week (grain)", -1.8489178830680035),
+                                    ("day", -2.2842359543258492), ("quarter", -3.0726933146901194),
+                                    ("year", -3.0726933146901194),
+                                    ("second (grain) ", -2.7362210780689065),
+                                    ("month", -2.4849066497880004),
+                                    ("quarter (grain)", -3.0726933146901194),
+                                    ("day (grain)", -2.2842359543258492)],
+                               n = 48}}),
+       ("Mother's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ratha-Yatra",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6225296133459919,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.3862943611198906),
+                                    ("ordinal (digits)", -0.2876820724517809)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.7691330875378672,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.5596157879354228),
+                                    ("ordinal (digits)", -0.8472978603872037)],
+                               n = 19}}),
+       ("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.8649974374866046,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.5465437063680699,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
+       ("Guru Ravidass Jayanti",
+        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.3746934494414107,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -1.1631508098056809,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Chinese New Year",
+        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}}),
+       ("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}}),
+       ("Emancipation 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}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -7.696104113612832e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -2.6026896854443837,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("the nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)Super Tuesdayyear (latent)",
+                                     -1.252762968495368),
+                                    ("dayyear", -0.8472978603872037),
+                                    ("ordinal (digits)Super Tuesdaythis|last|next <cycle>",
+                                     -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Good Friday",
+        Classifier{okData =
+                     ClassData{prior = 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.7048889984366284, unseen = -4.867534450455582,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.763846956391606e-2),
+                                    ("integer (0..19)", -2.374905754573672)],
+                               n = 127},
+                   koData =
+                     ClassData{prior = -0.6815416344396374, unseen = -4.890349128221754,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.15541410387403026),
+                                    ("integer (0..19)", -1.9383629434199303)],
+                               n = 130}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -2.0149030205422647),
+                                    ("MondayMarch", -2.0149030205422647),
+                                    ("FridayOctober", -1.6094379124341003),
+                                    ("Sundayintersect", -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5962052353677147,
+                               unseen = -5.3471075307174685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.7032769223495525),
+                                    ("integer (0..19)year (grain)", -2.9444389791664407),
+                                    ("integer (numeric)day (grain)", -2.7032769223495525),
+                                    ("integer (0..19)second (grain) ", -3.9560398908449206),
+                                    ("integer (0..19)hour (grain)", -3.1451096746285914),
+                                    ("second", -3.550574782736756),
+                                    ("integer (numeric)second (grain) ", -4.243721963296701),
+                                    ("integer (numeric)year (grain)", -3.262892710284975),
+                                    ("day", -2.4519624940686464), ("year", -2.4519624940686464),
+                                    ("integer (numeric)week (grain)", -3.262892710284975),
+                                    ("integer (0..19)month (grain)", -3.7328963395307104),
+                                    ("integer (20..90)minute (grain)", -4.6491870714048655),
+                                    ("hour", -2.777384894503274), ("month", -3.3964241029094975),
+                                    ("integer (numeric)minute (grain)", -2.634284050862601),
+                                    ("integer (0..19)minute (grain)", -3.262892710284975),
+                                    ("integer (numeric)month (grain)", -4.243721963296701),
+                                    ("minute", -2.2068400360356613),
+                                    ("integer (numeric)hour (grain)", -3.7328963395307104),
+                                    ("integer (0..19)day (grain)", -3.7328963395307104),
+                                    ("integer (0..19)week (grain)", -3.3964241029094975)],
+                               n = 92},
+                   koData =
+                     ClassData{prior = -0.8005056988804446, unseen = -5.170483995038151,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.5553480614894135),
+                                    ("integer (0..19)year (grain)", -4.0661736852554045),
+                                    ("integer (numeric)day (grain)", -4.0661736852554045),
+                                    ("integer (numeric)quarter (grain)", -4.0661736852554045),
+                                    ("integer (numeric)year (grain)", -4.0661736852554045),
+                                    ("day", -3.5553480614894135), ("quarter", -3.5553480614894135),
+                                    ("year", -3.5553480614894135),
+                                    ("integer (numeric)week (grain)", -4.0661736852554045),
+                                    ("integer (0..19)month (grain)", -4.0661736852554045),
+                                    ("hour", -1.157452788691043), ("month", -3.5553480614894135),
+                                    ("integer (numeric)minute (grain)", -4.471638793363569),
+                                    ("integer (numeric)month (grain)", -4.0661736852554045),
+                                    ("minute", -4.471638793363569),
+                                    ("integer (numeric)hour (grain)", -1.157452788691043),
+                                    ("integer (0..19)day (grain)", -4.0661736852554045),
+                                    ("integer (0..19)week (grain)", -4.0661736852554045),
+                                    ("integer (0..19)quarter (grain)", -4.0661736852554045)],
+                               n = 75}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.3217558399823195),
+                                    ("integer (numeric)integer (numeric)July", -1.3217558399823195),
+                                    ("month", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guru Gobind Singh Jayanti",
+        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}}),
+       ("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}}),
+       ("Krishna Janmashtami",
+        Classifier{okData =
+                     ClassData{prior = 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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2607262624632527, unseen = -5.71042701737487,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>", -3.7612001156935624),
+                                    ("integer after|past <hour-of-day>", -4.3208159036289855),
+                                    ("at <time-of-day>", -2.374905754573672),
+                                    ("<time-of-day> o'clock", -4.608497976080766),
+                                    ("half after|past <hour-of-day>", -4.608497976080766),
+                                    ("second", -5.01396308418893), ("hh:mm:ss", -5.01396308418893),
+                                    ("<hour-of-day> <integer>", -4.097672352314775),
+                                    ("<integer> minutes to|till|before <hour-of-day>",
+                                     -5.01396308418893),
+                                    ("time-of-day (latent)", -1.6997770795164049),
+                                    ("hhmm (latent)", -5.01396308418893),
+                                    ("hh:mm", -2.374905754573672),
+                                    ("quarter after|past <hour-of-day>", -3.5098856874126563),
+                                    ("until <time>", -4.3208159036289855),
+                                    ("about|exactly <time-of-day>", -5.01396308418893),
+                                    ("hour", -1.252762968495368),
+                                    ("<time-of-day> sharp|exactly", -5.01396308418893),
+                                    ("minute", -1.6817585740137264)],
+                               n = 141},
+                   koData =
+                     ClassData{prior = -1.4718165345580525,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.248434627109745),
+                                    ("from|since|after <time>", -3.248434627109745),
+                                    ("at <time-of-day>", -3.536116699561526),
+                                    ("time-of-day (latent)", -1.1689930854299093),
+                                    ("hh:mm", -3.536116699561526),
+                                    ("until <time>", -3.9415818076696905),
+                                    ("hour", -1.0238110755854113), ("minute", -2.6888188391743224)],
+                               n = 42}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <day>",
+        Classifier{okData =
+                     ClassData{prior = -0.21511137961694557, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.8803128665695), ("mm/dd", -3.3843902633457743),
+                                    ("absorption of , after named day", -2.691243082785829),
+                                    ("intersect", -2.691243082785829),
+                                    ("Saturday", -2.691243082785829),
+                                    ("Friday", -2.9789251552376097), ("day", -0.8194409058842375),
+                                    ("the <day-of-month> (ordinal)", -2.9789251552376097),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.691243082785829)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.6422277352570913,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.6582280766035324),
+                                    ("day", -1.0986122886681098),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.6582280766035324)],
+                               n = 6}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Administrative Professionals' 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}}),
+       ("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 = -1.0296194171811581,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708),
+                                    ("year (grain)", -2.4277482359480516),
+                                    ("second", -2.833213344056216),
+                                    ("week (grain)", -2.1400661634962708),
+                                    ("day", -2.1400661634962708),
+                                    ("minute (grain)", -2.833213344056216),
+                                    ("year", -2.4277482359480516),
+                                    ("second (grain) ", -2.833213344056216),
+                                    ("minute", -2.833213344056216),
+                                    ("day (grain)", -2.1400661634962708)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -2.3025850929940455),
+                                    ("quarter", -1.3470736479666092),
+                                    ("minute (grain)", -2.8134107167600364),
+                                    ("hour", -2.3025850929940455),
+                                    ("quarter (grain)", -1.3470736479666092),
+                                    ("minute", -2.8134107167600364)],
+                               n = 18}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.2237754316221157),
+                                    ("this|last|next <cycle>", -1.4469189829363254),
+                                    ("year", -0.7537718023763802)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.916290731874155),
+                                    ("year", -0.916290731874155)],
+                               n = 1}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Super Tuesday",
+        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}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.276666119016055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 70},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("upcoming <integer> <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rosh Hashanah",
+        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> <named-day> ago|back",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Thursday", -0.6931471805599453),
+                                    ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> upcoming <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -2.6668247082161294e-2,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -3.6375861597263857,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from|past <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7691330875378672, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>hhhmm", -3.481240089335692),
+                                    ("a <unit-of-duration>Christmas", -3.481240089335692),
+                                    ("minuteminute", -3.481240089335692),
+                                    ("dayday", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>today", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.382627800667582),
+                                    ("minutehour", -1.7764919970972666),
+                                    ("daysecond", -3.481240089335692),
+                                    ("a <unit-of-duration>right now", -3.481240089335692),
+                                    ("minutenograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>Christmas", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -3.481240089335692),
+                                    ("secondnograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -2.5649493574615367),
+                                    ("yearday", -2.7880929087757464),
+                                    ("<integer> <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.481240089335692),
+                                    ("daynograin", -3.481240089335692),
+                                    ("<integer> <unit-of-duration>now", -3.0757749812275272)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.6225296133459919, unseen = -4.276666119016055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterhour", -1.318240897874875),
+                                    ("dayhour", -3.56953269648137),
+                                    ("<integer> <unit-of-duration>intersect", -3.56953269648137),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -3.56953269648137),
+                                    ("a <unit-of-duration><time-of-day> am|pm", -2.065455299705096),
+                                    ("a <unit-of-duration>time-of-day (latent)",
+                                     -2.065455299705096),
+                                    ("dayday", -2.8763855159214247),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -3.56953269648137),
+                                    ("a <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.164067588373206),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -3.56953269648137)],
+                               n = 22}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -2.03688192726104),
+                                    ("time-of-day (latent)", -0.9382696385929302),
+                                    ("hour", -0.7375989431307791)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm",
+        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}}),
+       ("until <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -2.159484249353372),
+                                    ("time-of-day (latent)", -2.5649493574615367),
+                                    ("year", -2.159484249353372),
+                                    ("<time-of-day> am|pm", -1.8718021769015913),
+                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
+                                    ("minute", -1.6486586255873816)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.3025850929940455),
+                                    ("yesterday", -2.8134107167600364),
+                                    ("day", -2.8134107167600364),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("<time-of-day> am|pm", -3.2188758248682006),
+                                    ("hh:mm", -2.3025850929940455), ("hour", -1.4271163556401458),
+                                    ("minute", -1.8325814637483102)],
+                               n = 20}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.791759469228055),
+                                    ("Marcha <unit-of-duration>", -2.1972245773362196),
+                                    ("March<integer> <unit-of-duration>", -2.1972245773362196),
+                                    ("Super Tuesday<integer> <unit-of-duration>",
+                                     -2.1972245773362196),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -2.1972245773362196),
+                                    ("dayyear", -1.5040773967762742),
+                                    ("Tax Day<integer> <unit-of-duration>", -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tuesday<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("dayyear", -1.6094379124341003)],
+                               n = 1}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Daylight Saving End 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}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.5432070332690304, unseen = -5.44673737166631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectthis|last|next <cycle>", -4.749270529961848),
+                                    ("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.749270529961848),
+                                    ("dayhour", -4.343805421853684),
+                                    ("daymonth", -2.0412203288596382),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.749270529961848),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.4965075614664802),
+                                    ("Wednesdayintersect", -4.749270529961848),
+                                    ("Labor Daythis|last|next <cycle>", -4.749270529961848),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.3629761688419575),
+                                    ("Black Fridaythis|last|next <cycle>", -4.749270529961848),
+                                    ("<part-of-day> of <time>February", -4.749270529961848),
+                                    ("Saturday<time-of-day> am|pm", -4.749270529961848),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -4.343805421853684),
+                                    ("hourmonth", -4.749270529961848),
+                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
+                                     -4.056123349401903),
+                                    ("dayday", -2.497978731355353),
+                                    ("the <day-of-month> (ordinal)February", -4.343805421853684),
+                                    ("WednesdayOctober", -4.749270529961848),
+                                    ("Wednesdaythis|last|next <cycle>", -4.343805421853684),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.4965075614664802),
+                                    ("dayyear", -3.4965075614664802),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.749270529961848),
+                                    ("Thursdayhh:mm", -4.343805421853684),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.749270529961848),
+                                    ("Memorial Daythis|last|next <cycle>", -4.749270529961848),
+                                    ("TuesdayOctober", -4.749270529961848),
+                                    ("the <day-of-month> (ordinal)March", -3.6506582412937383),
+                                    ("Mondaythis|last|next <cycle>", -3.832979798087693),
+                                    ("Fridayintersect", -4.056123349401903),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -4.343805421853684),
+                                    ("intersectOctober", -4.343805421853684),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.832979798087693),
+                                    ("Tuesdaythis|last|next <cycle>", -4.343805421853684),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.749270529961848),
+                                    ("dayminute", -2.9575110607337933),
+                                    ("minuteday", -3.4965075614664802),
+                                    ("this|last|next <cycle>Sunday", -4.749270529961848),
+                                    ("Sundaythis|last|next <cycle>", -4.749270529961848),
+                                    ("on <day><time-of-day> am|pm", -4.749270529961848),
+                                    ("intersectintersect", -4.749270529961848),
+                                    ("weekday", -4.749270529961848),
+                                    ("dayweek", -3.6506582412937383),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.343805421853684),
+                                    ("<datetime> - <datetime> (interval)July", -3.832979798087693),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -4.056123349401903)],
+                               n = 79},
+                   koData =
+                     ClassData{prior = -0.8696036179015019, unseen = -5.236441962829949,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.537961436294641),
+                                    ("week-endOctober", -3.844814255734696),
+                                    ("daymonth", -1.7971214123694403),
+                                    ("TuesdaySeptember", -4.537961436294641),
+                                    ("Wednesdayintersect", -4.537961436294641),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.4393491476265314),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -4.537961436294641),
+                                    ("hournograin", -4.132496328186477),
+                                    ("from|since|after <time>July", -4.132496328186477),
+                                    ("hourmonth", -2.592051287239328),
+                                    ("Fridaythis|last|next <cycle>", -4.537961436294641),
+                                    ("SundayFebruary", -4.537961436294641),
+                                    ("on <day>September", -3.844814255734696),
+                                    ("WednesdayOctober", -4.537961436294641),
+                                    ("intersectnow", -4.132496328186477),
+                                    ("week-endintersect", -4.537961436294641),
+                                    ("dayyear", -4.537961436294641),
+                                    ("FridayJuly", -3.6216707044204863),
+                                    ("FridaySeptember", -4.132496328186477),
+                                    ("the <day-of-month> (ordinal)July", -3.6216707044204863),
+                                    ("WednesdayFebruary", -4.537961436294641),
+                                    ("minutemonth", -3.0338840395183673),
+                                    ("Mondaythis|last|next <cycle>", -4.537961436294641),
+                                    ("SundayMarch", -4.537961436294641),
+                                    ("MondayFebruary", -4.132496328186477),
+                                    ("Fridayintersect", -4.537961436294641),
+                                    ("intersectOctober", -4.537961436294641),
+                                    ("dayminute", -4.537961436294641),
+                                    ("SaturdaySeptember", -4.537961436294641),
+                                    ("intersectSeptember", -3.1516670751747506),
+                                    ("Tuesdaynow", -4.132496328186477),
+                                    ("MondayMarch", -4.537961436294641),
+                                    ("FridayOctober", -4.537961436294641),
+                                    ("daynograin", -4.132496328186477),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -4.537961436294641),
+                                    ("Tuesdayintersect", -4.537961436294641),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -4.537961436294641),
+                                    ("<datetime> - <datetime> (interval)July", -4.537961436294641),
+                                    ("Sundayintersect", -4.537961436294641)],
+                               n = 57}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.496436886313891, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -3.0910424533583156),
+                                    ("Martin Luther King's Day", -3.0910424533583156),
+                                    ("Cyber Monday", -3.0910424533583156),
+                                    ("Memorial Day", -3.0910424533583156),
+                                    ("Mother's Day", -3.0910424533583156),
+                                    ("day", -1.1451323043030026), ("Sunday", -3.0910424533583156),
+                                    ("Chinese New Year", -2.3978952727983707),
+                                    ("Thanksgiving Day", -3.0910424533583156),
+                                    ("Super Tuesday", -3.0910424533583156),
+                                    ("Easter Sunday", -3.0910424533583156),
+                                    ("hour", -3.0910424533583156), ("Tuesday", -3.0910424533583156),
+                                    ("week-end", -3.0910424533583156)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.9382696385929302,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.833213344056216), ("Friday", -2.4277482359480516),
+                                    ("day", -1.916922612182061), ("Sunday", -2.833213344056216),
+                                    ("hour", -1.7346010553881064),
+                                    ("week-end", -1.7346010553881064)],
+                               n = 9}}),
+       ("March",
+        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}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0149030205422647),
+                                    ("Thursdayordinal (digits)", -2.70805020110221),
+                                    ("day", -2.3025850929940455),
+                                    ("Augustordinal (digits)", -2.70805020110221),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.3025850929940455),
+                                    ("Tuesdayordinal (digits)", -2.70805020110221),
+                                    ("Octoberordinals (first..twentieth,thirtieth,...)",
+                                     -2.70805020110221),
+                                    ("month", -1.2039728043259361),
+                                    ("Marchordinal (digits)", -2.70805020110221)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>ordinal (digits)",
+                                     -1.9459101490553135),
+                                    ("Augustordinal (digits)", -1.9459101490553135),
+                                    ("month", -1.540445040947149)],
+                               n = 2}}),
+       ("Labor Day weekend",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6632942174102642, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.3350010667323402),
+                                    ("ordinal (digits)", -0.3053816495511819)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.723918839226699, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.49247648509779407),
+                                    ("ordinal (digits)", -0.9444616088408514)],
+                               n = 16}}),
+       ("<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}}),
+       ("Emergency Medical Services Week",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Veterans 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}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval) timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.8109302162163288),
+                                    ("hh:mmhh:mm", -1.5040773967762742),
+                                    ("hhhmmhhhmm", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm.dd.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -0.5679840376059393, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -3.068052935133617),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.9694406464655074),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.374905754573672),
+                                    ("integer (numeric)this|last|next <cycle>", -2.662587827025453),
+                                    ("ordinal (digits)February", -3.068052935133617),
+                                    ("integer (numeric)February", -2.662587827025453),
+                                    ("month", -0.8708283577973976),
+                                    ("ordinal (digits)March", -2.662587827025453),
+                                    ("integer (numeric)July", -3.068052935133617)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.8362480242006186, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.8622008809294686),
+                                    ("month", -0.916290731874155),
+                                    ("integer (numeric)July", -1.6094379124341003)],
+                               n = 13}}),
+       ("Independence Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyyqq",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.4203681286504293),
+                                    ("Halloween", -3.1135153092103742),
+                                    ("Boss's Day", -3.1135153092103742),
+                                    ("Memorial Day", -3.1135153092103742),
+                                    ("Monday", -2.70805020110221), ("Tax Day", -3.1135153092103742),
+                                    ("Mother's Day", -3.1135153092103742),
+                                    ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -3.1135153092103742),
+                                    ("Super Tuesday", -3.1135153092103742),
+                                    ("March", -3.1135153092103742), ("month", -3.1135153092103742),
+                                    ("Tuesday", -2.70805020110221)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.2512917986064953),
+                                    ("Saturday", -2.2512917986064953), ("day", -1.845826690498331)],
+                               n = 2}}),
+       ("<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}}),
+       ("the <ordinal> closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.3677247801253174,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super Tuesdaythe nth <time> of <time>",
+                                     -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)Christmastoday",
+                                     -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super TuesdayMini-Tuesday",
+                                     -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super Tuesdayintersect",
+                                     -2.3353749158170367),
+                                    ("dayday", -1.1314021114911006),
+                                    ("ordinal (digits)Super TuesdayMini-Tuesday",
+                                     -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super Tuesdayintersect by \",\", \"of\", \"from\" for year",
+                                     -2.740840023925201),
+                                    ("ordinal (digits)Christmastoday", -2.740840023925201)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.1786549963416462,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super Tuesdayintersect",
+                                     -2.3513752571634776),
+                                    ("dayday", -1.6582280766035324),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super TuesdayTax Day",
+                                     -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super Tuesdaythe <day-of-month> (ordinal)",
+                                     -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)MondayOctober",
+                                     -2.3513752571634776)],
+                               n = 4}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.652001563489282e-2),
+                                    ("integer (0..19)", -3.0910424533583156)],
+                               n = 42}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half a <time-grain>", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Purim",
+        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> before last|after next",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.1400661634962708),
+                                    ("Friday", -1.7346010553881064), ("day", -1.2237754316221157),
+                                    ("Super Tuesday", -2.1400661634962708),
+                                    ("March", -2.1400661634962708), ("month", -2.1400661634962708)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.5040773967762742), ("Tuesday", -1.5040773967762742)],
+                               n = 1}}),
+       ("by the end of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.8109302162163288),
+                                    ("year", -1.5040773967762742), ("month", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour (abbrev).",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               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 = -1.3424917384614978, unseen = -4.890349128221754,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.784189633918261),
+                                    ("from|since|after <time>hh:mm", -3.2733640101522705),
+                                    ("minuteminute", -1.7047480922384253),
+                                    ("<time> timezone<time> timezone", -3.4965075614664802),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.784189633918261),
+                                    ("hh:mmhh:mm", -2.6855773452501515),
+                                    ("dayday", -2.6855773452501515),
+                                    ("hhhmmhhhmm", -3.2733640101522705),
+                                    ("hourhour", -3.784189633918261),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.784189633918261),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.784189633918261),
+                                    ("<time-of-day> am|pmhh:mm:ss", -4.189654742026425),
+                                    ("hoursecond", -3.784189633918261),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.4965075614664802),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -3.2733640101522705)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -0.3027199498163214, unseen = -5.564520407322694,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.462069342347418),
+                                    ("<time> timezonehhhmm", -4.462069342347418),
+                                    ("hourday", -3.258096538021482),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -4.867534450455582),
+                                    ("dayhour", -4.867534450455582),
+                                    ("daymonth", -3.6147714819602146),
+                                    ("Super TuesdayMarch", -4.867534450455582),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -4.867534450455582),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <month>",
+                                     -3.951243718581427),
+                                    ("TuesdayTax Day", -4.867534450455582),
+                                    ("<time-of-day> am|pmintersect", -4.867534450455582),
+                                    ("MondayOctober", -4.462069342347418),
+                                    ("from|since|after <time>hh:mm", -4.867534450455582),
+                                    ("hh:mm<time-of-day> am|pm", -3.7689221617874726),
+                                    ("hhhmmintersect", -4.867534450455582),
+                                    ("minuteminute", -2.425187415086378),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -4.174387269895637),
+                                    ("hh:mmhh:mm", -4.174387269895637),
+                                    ("dayday", -1.5903897174634058),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
+                                     -3.951243718581427),
+                                    ("hhhmmhhhmm", -4.462069342347418),
+                                    ("hourhour", -3.951243718581427),
+                                    ("Super Tuesdayintersect by \",\", \"of\", \"from\" for year",
+                                     -4.462069342347418),
+                                    ("hourminute", -4.867534450455582),
+                                    ("TuesdayMarch", -4.867534450455582),
+                                    ("minutehour", -3.951243718581427),
+                                    ("<time> timezonehh:mm", -4.867534450455582),
+                                    ("hh:mm<time> timezone", -4.867534450455582),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.867534450455582),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <named-month>",
+                                     -3.951243718581427),
+                                    ("Super Tuesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.867534450455582),
+                                    ("hh:mmintersect", -3.951243718581427),
+                                    ("Super Tuesdayintersect", -4.174387269895637),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -4.867534450455582),
+                                    ("Christmastoday", -4.174387269895637),
+                                    ("Super TuesdayMini-Tuesday", -4.174387269895637),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.867534450455582),
+                                    ("from|since|after <time>intersect", -3.3634570536793085),
+                                    ("Tuesdayintersect by \",\", \"of\", \"from\" for year",
+                                     -4.462069342347418),
+                                    ("from|since|after <time>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.951243718581427),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.462069342347418),
+                                    ("<time-of-day> am|pmhh:mm", -4.867534450455582),
+                                    ("Tuesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.867534450455582),
+                                    ("Super Tuesdaythe nth <time> of <time>", -4.867534450455582),
+                                    ("from|since|after <time>the <day-of-month> (ordinal or number) of <named-month>",
+                                     -3.3634570536793085),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.867534450455582),
+                                    ("Super TuesdayTax Day", -4.867534450455582),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -4.867534450455582),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.462069342347418),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.867534450455582),
+                                    ("Super Tuesdaythe <day-of-month> (ordinal)",
+                                     -4.867534450455582),
+                                    ("Tuesdayintersect", -4.462069342347418),
+                                    ("Tuesdaythe nth <time> of <time>", -4.867534450455582),
+                                    ("the <day-of-month> (ordinal)intersect", -4.462069342347418)],
+                               n = 99}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28}}),
+       ("New Year's Day",
+        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}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Memorial Day weekend",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.1340142157190256, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>hh:mm", -3.0633909220278057),
+                                    ("hh:mmtime-of-day (latent)", -3.2865344733420154),
+                                    ("minuteminute", -1.6770965609079151),
+                                    ("<time> timezone<time> timezone", -3.2865344733420154),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.979681653901961),
+                                    ("hh:mmhh:mm", -2.4756042571256867),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("hhhmmhhhmm", -3.0633909220278057),
+                                    ("hourhour", -2.4756042571256867),
+                                    ("minutehour", -2.4756042571256867),
+                                    ("<time-of-day> am|pmhh:mm:ss", -3.979681653901961),
+                                    ("hhhmmtime-of-day (latent)", -3.2865344733420154),
+                                    ("hoursecond", -3.5742165457937967),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -3.0633909220278057)],
+                               n = 37},
+                   koData =
+                     ClassData{prior = -0.38822330167365837,
+                               unseen = -5.247024072160486,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.143134726391533),
+                                    ("<time> timezonehhhmm", -4.143134726391533),
+                                    ("about|exactly <time-of-day>time-of-day (latent)",
+                                     -4.548599834499697),
+                                    ("until <time>time-of-day (latent)", -3.295836866004329),
+                                    ("from|since|after <time>hh:mm", -4.548599834499697),
+                                    ("hh:mmtime-of-day (latent)", -2.5336968139574325),
+                                    ("hh:mm<time-of-day> am|pm", -3.295836866004329),
+                                    ("minuteminute", -2.469158292819861),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.632309102625542),
+                                    ("hh:mmhh:mm", -3.855452653939752),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -4.143134726391533),
+                                    ("hhhmmhhhmm", -4.143134726391533),
+                                    ("at <time-of-day><time-of-day> am|pm", -4.548599834499697),
+                                    ("hourhour", -1.9836504770381604),
+                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
+                                     -3.855452653939752),
+                                    ("hourminute", -3.4499875458315876),
+                                    ("minutehour", -1.715386490443481),
+                                    ("<time> timezonehh:mm", -4.548599834499697),
+                                    ("hh:mm<time> timezone", -4.548599834499697),
+                                    ("hhhmmtime-of-day (latent)", -3.855452653939752),
+                                    ("until <time><time-of-day> am|pm", -4.143134726391533),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<time-of-day> am|pmhh:mm", -4.548599834499697),
+                                    ("<part-of-day> at <time-of-day>time-of-day (latent)",
+                                     -3.855452653939752),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.044522437723423),
+                                    ("at <time-of-day>time-of-day (latent)", -3.632309102625542),
+                                    ("<time> timezonetime-of-day (latent)", -3.855452653939752),
+                                    ("<integer> to|till|before <hour-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.855452653939752)],
+                               n = 78}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)Super Tuesdayyear (latent)",
+                                     -1.791759469228055),
+                                    ("dayyear", -1.3862943611198906),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -1.791759469228055),
+                                    ("ordinal (digits)Super Tuesdaythis|last|next <cycle>",
+                                     -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.3862943611198906),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -1.3862943611198906)],
+                               n = 1}}),
+       ("Ugadi",
+        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}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.3528213746227423, unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.7245795030534206),
+                                    ("Marchinteger (numeric)", -2.7245795030534206),
+                                    ("Aprilinteger (numeric)", -3.417726683613366),
+                                    ("month", -0.8150369981689822),
+                                    ("Februaryinteger (numeric)", -2.164963715117998),
+                                    ("Septemberinteger (numeric)", -2.7245795030534206),
+                                    ("Octoberinteger (numeric)", -2.7245795030534206),
+                                    ("Julyinteger (numeric)", -2.031432322493475)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.213022639845854, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("President's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.3978952727983707),
+                                    ("Wednesday", -2.3978952727983707),
+                                    ("Saturday", -2.3978952727983707),
+                                    ("Monday", -1.7047480922384253), ("day", -0.8938178760220964),
+                                    ("Tuesday", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        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}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9924301646902063),
+                                    ("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.9924301646902063),
+                                    ("week (grain)intersect", -2.3978952727983707),
+                                    ("week (grain)September", -2.3978952727983707)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2335922215070942),
+                                    ("day (grain)May", -2.2335922215070942),
+                                    ("week (grain)year (latent)", -1.9459101490553135),
+                                    ("weekmonth", -1.7227665977411035),
+                                    ("week (grain)October", -2.2335922215070942),
+                                    ("weekyear", -1.9459101490553135),
+                                    ("week (grain)intersect", -2.2335922215070942)],
+                               n = 9}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("daymonth", -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("weekyear", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Labor Day",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.5040773967762742,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vaisakhi",
+        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.3364722366212129, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>intersect", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.2512917986064953),
+                                    ("<integer> + '\"from|since|after <time>", -2.2512917986064953),
+                                    ("dayday", -1.55814461804655),
+                                    ("minutehour", -1.845826690498331),
+                                    ("<integer> + '\"<time-of-day> am|pm", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.2512917986064953)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.8718021769015913),
+                                    ("<integer> + '\"from|since|after <time>", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.8718021769015913),
+                                    ("minutehour", -1.8718021769015913)],
+                               n = 2}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.791759469228055),
+                                    ("hh:mmhh:mm", -2.1972245773362196),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hhhmmhhhmm", -2.1972245773362196),
+                                    ("minutehour", -1.791759469228055),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.1972245773362196)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.1972245773362196),
+                                    ("hhhmmintersect", -2.1972245773362196),
+                                    ("minuteminute", -1.791759469228055),
+                                    ("minutehour", -1.791759469228055),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("hhhmmtime-of-day (latent)", -2.1972245773362196)],
+                               n = 4}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\" for year",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Labor Daythis|last|next <cycle>", -3.2771447329921766),
+                                    ("Administrative Professionals' Dayyear (latent)",
+                                     -3.2771447329921766),
+                                    ("Black Fridaythis|last|next <cycle>", -3.2771447329921766),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -2.871679624884012),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -2.583997552432231),
+                                    ("dayyear", -0.9257694758286987),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -3.2771447329921766),
+                                    ("Memorial Daythis|last|next <cycle>", -3.2771447329921766),
+                                    ("Sundayyear (latent)", -3.2771447329921766),
+                                    ("intersectyear (latent)", -2.3608540011180215),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -2.178532444324067)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Fridaythis|last|next <cycle>", -2.4423470353692043),
+                                    ("<datetime> - <datetime> (interval)year (latent)",
+                                     -2.03688192726104),
+                                    ("dayyear", -1.3437347467010947),
+                                    ("intersectyear (latent)", -2.03688192726104)],
+                               n = 5}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -4.1672696400568074e-2,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
+                   koData =
+                     ClassData{prior = -3.1986731175506815,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime>/<datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("secondsecond", -0.916290731874155),
+                                    ("intersectintersect", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm:ssintersect", -0.916290731874155),
+                                    ("secondsecond", -0.916290731874155)],
+                               n = 1}}),
+       ("Mid-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}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)July", -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.3978952727983707),
+                                    ("integer (numeric)integer (numeric)July", -1.9924301646902063),
+                                    ("month", -0.8938178760220964),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shushan Purim",
+        Classifier{okData =
+                     ClassData{prior = 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 =
diff --git a/Duckling/Ranking/Classifiers/EN_XX.hs b/Duckling/Ranking/Classifiers/EN_XX.hs
--- a/Duckling/Ranking/Classifiers/EN_XX.hs
+++ b/Duckling/Ranking/Classifiers/EN_XX.hs
@@ -30,3197 +30,4167 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> to|till|before <hour-of-day>",
         Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = -8.961215868968717e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
-                   koData =
-                     ClassData{prior = -2.456735772821304, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5921203661592374, unseen = -5.733341276897745,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 307},
-                   koData =
-                     ClassData{prior = -0.8055393675814524, unseen = -5.521460917862246,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 248}}),
-       ("<year> (bc|ad)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year", -1.466337068793427),
-                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
-                                    ("month", -1.8718021769015913)],
-                               n = 3}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6739764335716716),
-                                    ("dayday", -1.1631508098056809),
-                                    ("day (grain)yesterday", -1.6739764335716716)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.6739764335716716),
-                                    ("year (grain)Christmas", -2.0794415416798357),
-                                    ("dayday", -2.0794415416798357),
-                                    ("day (grain)intersect", -1.6739764335716716),
-                                    ("day (grain)Easter Sunday", -2.0794415416798357),
-                                    ("yearday", -2.0794415416798357)],
-                               n = 4}}),
-       ("Easter Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Navaratri",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Shemini Atzeret",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ramadan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lazarus Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect 2 numbers",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("compose by multiplicationinteger (0..19)",
-                                     -0.2231435513142097)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
-                               n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("from|since|after <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.5522794985941517, unseen = -4.248495242049359,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal or number) <named-month>",
-                                     -3.5409593240373143),
-                                    ("July", -3.5409593240373143),
-                                    ("year (latent)", -3.1354942159291497),
-                                    ("day", -3.1354942159291497),
-                                    ("time-of-day (latent)", -2.624668592163159),
-                                    ("year", -3.1354942159291497),
-                                    ("<time-of-day> am|pm", -2.624668592163159),
-                                    ("hh:mm", -2.624668592163159),
-                                    ("<day-of-month> (ordinal)", -3.5409593240373143),
-                                    ("hour", -2.03688192726104), ("month", -3.1354942159291497),
-                                    ("minute", -2.624668592163159),
-                                    ("August", -3.5409593240373143)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.23795863709935042,
-                               unseen = -5.123963979403259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -4.019381523748645),
-                                    ("week", -4.42484663185681),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.42484663185681),
-                                    ("today", -4.42484663185681),
-                                    ("intersect", -2.5530444549552183),
-                                    ("<time> for <duration>", -4.42484663185681),
-                                    ("second", -4.42484663185681), ("now", -3.508555899982655),
-                                    ("tomorrow", -4.019381523748645),
-                                    ("this|last|next <cycle>", -4.42484663185681),
-                                    ("day", -1.9399399820688095),
-                                    ("time-of-day (latent)", -2.6330871626287546),
-                                    ("<time-of-day> am|pm", -4.019381523748645),
-                                    ("nograin", -3.508555899982655),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.42484663185681),
-                                    ("<day-of-month> (ordinal)", -4.019381523748645),
-                                    ("Easter Sunday", -4.42484663185681),
-                                    ("Christmas", -3.7316994512968646),
-                                    ("hour", -2.409943611314545), ("month", -4.42484663185681),
-                                    ("<datetime> - <datetime> (interval)", -3.172083663361442),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.920769235080536),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -4.019381523748645),
-                                    ("minute", -1.9399399820688095),
-                                    ("right now", -4.42484663185681),
-                                    ("<month> dd-dd (interval)", -3.7316994512968646),
-                                    ("part of days", -4.42484663185681),
-                                    ("dd-dd <month> (interval)", -4.019381523748645)],
-                               n = 67}}),
-       ("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}}),
-       ("<ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.268683541318364),
-                                    ("daymonth", -2.268683541318364),
-                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.6741486494265287),
-                                    ("weekmonth", -1.7578579175523736),
-                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.6741486494265287),
-                                    ("weekyear", -1.9810014688665833),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.6741486494265287),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
-                                     -2.6741486494265287)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom HaShoah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -1.6582280766035324),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)April", -2.3513752571634776),
-                                    ("month", -1.252762968495368)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.237332013101517e-2,
-                               unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("dayhour", -1.4816045409242156),
-                                    ("Mondayearly morning", -3.378724525810097),
-                                    ("time-of-day (latent)tonight", -3.378724525810097),
-                                    ("hourhour", -2.3978952727983707),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("todaypart of days", -3.784189633918261),
-                                    ("minutehour", -2.6855773452501515),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.378724525810097),
-                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
-                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
-                                    ("intersectpart of days", -3.784189633918261),
-                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("tomorrowpart of days", -2.3978952727983707),
-                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("yesterdaypart of days", -3.378724525810097),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -3.784189633918261),
-                                    ("Mondaypart of days", -3.784189633918261)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -2.4277482359480516,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.772588722239781),
-                                    ("monthhour", -2.772588722239781),
-                                    ("hourhour", -2.772588722239781),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -2.772588722239781),
-                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.772588722239781)],
-                               n = 3}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -1.2729656758128873,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.3285040669720361, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.4557388028063e-2, unseen = -5.003946305945459,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.898599985096005),
-                                    ("noon|midnight|EOD|end of day", -3.898599985096005),
-                                    ("integer after|past <hour-of-day>", -3.898599985096005),
-                                    ("half after|past <hour-of-day>", -4.304065093204169),
-                                    ("time-of-day (latent)", -1.6650077635889111),
-                                    ("hhmm (latent)", -3.6109179126442243),
-                                    ("<time-of-day> am|pm", -1.7783364488959144),
-                                    ("hh:mm", -3.3877743613300146),
-                                    ("about|exactly <time-of-day>", -3.898599985096005),
-                                    ("hour", -1.0459685551826876),
-                                    ("<time-of-day> sharp|exactly", -4.304065093204169),
-                                    ("minute", -2.10684051586795)],
-                               n = 68},
-                   koData =
-                     ClassData{prior = -2.512305623976115, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.4816045409242156),
-                                    ("mm/dd", -3.4965075614664802),
-                                    ("absorption of , after named day", -3.0910424533583156),
-                                    ("intersect", -3.0910424533583156),
-                                    ("Saturday", -2.803360380906535),
-                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
-                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.803360380906535),
-                                    ("hour", -3.4965075614664802)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.11122563511022437,
-                               unseen = -3.970291913552122,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 51},
-                   koData =
-                     ClassData{prior = -2.2512917986064953,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7884573603642702),
-                                    ("hh:mmhh:mm", -0.7884573603642702)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
-                                    ("minutehour", -0.7884573603642702)],
-                               n = 9}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Passover",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vesak",
-        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}}),
-       ("Earth 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}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.16362942378180204,
-                               unseen = -4.700480365792417,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.305053521109253),
-                                    ("<integer> more <unit-of-duration>", -3.9982007016691985),
-                                    ("three-quarters of an hour", -3.0819099697950434),
-                                    ("<integer> + '\"", -3.305053521109253),
-                                    ("number.number hours", -3.9982007016691985),
-                                    ("second", -3.592735593561034),
-                                    ("half a <time-grain>", -3.0819099697950434),
-                                    ("day", -3.305053521109253), ("year", -3.9982007016691985),
-                                    ("<integer> <unit-of-duration>", -1.6468254445057207),
-                                    ("a <unit-of-duration>", -3.0819099697950434),
-                                    ("quarter of an hour", -3.0819099697950434),
-                                    ("hour", -2.6119063405493077),
-                                    ("about|exactly <duration>", -3.9982007016691985),
-                                    ("half an hour (abbrev).", -3.592735593561034),
-                                    ("<integer> and an half hour", -3.9982007016691985),
-                                    ("minute", -1.2901505005669882)],
-                               n = 45},
-                   koData =
-                     ClassData{prior = -1.890850371872286, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -2.456735772821304), ("year", -1.7635885922613588),
-                                    ("<integer> <unit-of-duration>", -1.7635885922613588),
-                                    ("a <unit-of-duration>", -2.169053700369523),
-                                    ("month", -2.8622008809294686)],
-                               n = 8}}),
-       ("January",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Mattu Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.48550781578170077,
-                               unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -0.9555114450274363,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("Shavuot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> <duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.3862943611198906),
-                                    ("Thanksgiving Day<integer> <unit-of-duration>",
-                                     -1.0986122886681098),
-                                    ("dayyear", -1.3862943611198906),
-                                    ("Diwali<integer> <unit-of-duration>", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("Boss's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Orthodox Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("May",
-        Classifier{okData =
-                     ClassData{prior = 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.472396929151576, unseen = -6.734591659972948,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Navaratriyear (latent)", -6.040254711277414),
-                                    ("Ramadanyear (latent)", -6.040254711277414),
-                                    ("<datetime> - <datetime> (interval)on <date>",
-                                     -4.787491742782046),
-                                    ("Bhai Doojyear (latent)", -6.040254711277414),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.787491742782046),
-                                    ("hourday", -4.335506619038989),
-                                    ("dayhour", -3.236894330370879),
-                                    ("Martin Luther King's Dayyear (latent)", -5.634789603169249),
-                                    ("Shemini Atzeretyear (latent)", -6.040254711277414),
-                                    ("daymonth", -5.123963979403259),
-                                    ("monthday", -5.634789603169249),
-                                    ("monthyear", -4.248495242049359),
-                                    ("Yom Ha'atzmautyear (latent)", -6.040254711277414),
-                                    ("Vijayadashamiyear (latent)", -6.040254711277414),
-                                    ("Thanksgiving Dayyear (latent)", -4.941642422609305),
-                                    ("Thai Pongalyear (latent)", -5.3471075307174685),
-                                    ("Thiru Onamyear (latent)", -5.3471075307174685),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.040254711277414),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -6.040254711277414),
-                                    ("houryear", -5.3471075307174685),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -6.040254711277414),
-                                    ("Christmas<time-of-day> am|pm", -6.040254711277414),
-                                    ("last <day-of-week> of <time>year (latent)",
-                                     -6.040254711277414),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.3471075307174685),
-                                    ("<time-of-day> am|pmintersect", -4.787491742782046),
-                                    ("Earth Houryear (latent)", -6.040254711277414),
-                                    ("Octoberyear (latent)", -4.53617731450114),
-                                    ("intersect<time-of-day> am|pm", -6.040254711277414),
-                                    ("Mattu Pongalyear (latent)", -6.040254711277414),
-                                    ("Shavuotyear (latent)", -6.040254711277414),
-                                    ("Dhanterasin <named-month>|year", -6.040254711277414),
-                                    ("at <time-of-day>in|within|after <duration>",
-                                     -6.040254711277414),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.040254711277414),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -5.634789603169249),
-                                    ("Marchyear (latent)", -6.040254711277414),
-                                    ("Sukkotyear (latent)", -5.634789603169249),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -6.040254711277414),
-                                    ("Clean Mondayyear (latent)", -5.634789603169249),
-                                    ("monthhour", -5.634789603169249),
-                                    ("todayat <time-of-day>", -6.040254711277414),
-                                    ("Thursday<time> timezone", -4.335506619038989),
-                                    ("from|since|after <time>December", -6.040254711277414),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -6.040254711277414),
-                                    ("Palm SundaySunday", -5.634789603169249),
-                                    ("dayday", -3.8430301339411947),
-                                    ("<time> <part-of-day>at <time-of-day>", -6.040254711277414),
-                                    ("mm/ddat <time-of-day>", -6.040254711277414),
-                                    ("tonightat <time-of-day>", -6.040254711277414),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -5.3471075307174685),
-                                    ("today<time-of-day> am|pm", -6.040254711277414),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.634789603169249),
-                                    ("at <time-of-day><time> <part-of-day>", -6.040254711277414),
-                                    ("mm/dd<time-of-day> am|pm", -6.040254711277414),
-                                    ("hourhour", -4.787491742782046),
-                                    ("<time-of-day> am|pmon <date>", -4.02535169073515),
-                                    ("Wednesdaythis|last|next <cycle>", -6.040254711277414),
-                                    ("Lentyear (latent)", -6.040254711277414),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.53617731450114),
-                                    ("Boghiyear (latent)", -6.040254711277414),
-                                    ("dayyear", -1.9972034434428638),
-                                    ("Thursdayfrom|since|after <time>", -5.634789603169249),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -6.040254711277414),
-                                    ("Thursdayat <time-of-day>", -5.634789603169249),
-                                    ("Islamic New Yearyear (latent)", -5.634789603169249),
-                                    ("Laylat al-Qadryear (latent)", -5.123963979403259),
-                                    ("Chhathin <named-month>|year", -6.040254711277414),
-                                    ("Vasant Panchamiin <named-month>|year", -6.040254711277414),
-                                    ("Diwaliin <named-month>|year", -6.040254711277414),
-                                    ("Shrove Tuesdayyear (latent)", -6.040254711277414),
-                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
-                                     -5.3471075307174685),
-                                    ("<time-of-day> am|pmtomorrow", -5.3471075307174685),
-                                    ("Yom Kippuryear (latent)", -6.040254711277414),
-                                    ("<part-of-day> of <time>year (latent)", -6.040254711277414),
-                                    ("minutehour", -5.123963979403259),
-                                    ("Kaanum Pongalyear (latent)", -5.634789603169249),
-                                    ("Maha Saptamiyear (latent)", -6.040254711277414),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.634789603169249),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.335506619038989),
-                                    ("for <duration> from <time>December", -6.040254711277414),
-                                    ("tomorrow<time-of-day> sharp|exactly", -6.040254711277414),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.123963979403259),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.634789603169249),
-                                    ("Pentecostyear (latent)", -6.040254711277414),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.123963979403259),
-                                    ("Eid al-Fitryear (latent)", -6.040254711277414),
-                                    ("Mondayin|during the <part-of-day>", -6.040254711277414),
-                                    ("Raksha Bandhanyear (latent)", -6.040254711277414),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.634789603169249),
-                                    ("Navaratriin <named-month>|year", -6.040254711277414),
-                                    ("Ashurayear (latent)", -6.040254711277414),
-                                    ("Chinese New Yearyear (latent)", -6.040254711277414),
-                                    ("Sundayyear (latent)", -6.040254711277414),
-                                    ("Lag BaOmeryear (latent)", -6.040254711277414),
-                                    ("last weekend of <named-month>year (latent)",
-                                     -6.040254711277414),
-                                    ("Eid al-Adhayear (latent)", -5.123963979403259),
-                                    ("intersectin|during the <part-of-day>", -6.040254711277414),
-                                    ("Christmasat <time-of-day>", -6.040254711277414),
-                                    ("Passoveryear (latent)", -6.040254711277414),
-                                    ("Lazarus Saturdayyear (latent)", -6.040254711277414),
-                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
-                                     -6.040254711277414),
-                                    ("Yom HaShoahyear (latent)", -5.634789603169249),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -5.634789603169249),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -6.040254711277414),
-                                    ("Thai Pongalin <named-month>|year", -6.040254711277414),
-                                    ("Septemberyear (latent)", -5.634789603169249),
-                                    ("mm/ddyear (latent)", -6.040254711277414),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.787491742782046),
-                                    ("Halloweenyear (latent)", -6.040254711277414),
-                                    ("<ordinal> last <cycle> of <time>year (latent)",
-                                     -5.634789603169249),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.3471075307174685),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -6.040254711277414),
-                                    ("at <time-of-day>intersect", -5.634789603169249),
-                                    ("Rosh Hashanahyear (latent)", -5.3471075307174685),
-                                    ("Dhanterasyear (latent)", -6.040254711277414),
-                                    ("Tu BiShvatyear (latent)", -6.040254711277414),
-                                    ("Holiyear (latent)", -5.3471075307174685),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -6.040254711277414),
-                                    ("Holika Dahanyear (latent)", -5.3471075307174685),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -6.040254711277414),
-                                    ("dayminute", -3.4011973816621555),
-                                    ("Mawlidyear (latent)", -6.040254711277414),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.634789603169249),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -6.040254711277414),
-                                    ("Jumu'atul-Widayear (latent)", -5.123963979403259),
-                                    ("minuteday", -2.402668551551028),
-                                    ("absorption of , after named dayintersect",
-                                     -6.040254711277414),
-                                    ("intersectyear (latent)", -6.040254711277414),
-                                    ("Orthodox Easter Sundayyear (latent)", -6.040254711277414),
-                                    ("<ordinal> <cycle> of <time>year (latent)",
-                                     -6.040254711277414),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -6.040254711277414),
-                                    ("Boss's Dayyear (latent)", -5.634789603169249),
-                                    ("Global Youth Service Dayyear (latent)", -6.040254711277414),
-                                    ("Tisha B'Avyear (latent)", -6.040254711277414),
-                                    ("Isra and Mi'rajyear (latent)", -5.123963979403259),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -6.040254711277414),
-                                    ("Christmasyear (latent)", -5.634789603169249),
-                                    ("Naraka Chaturdashiyear (latent)", -5.634789603169249),
-                                    ("at <time-of-day>on <date>", -4.941642422609305),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.430816798843313),
-                                    ("dayweek", -6.040254711277414),
-                                    ("Easter Sundayyear (latent)", -5.3471075307174685),
-                                    ("weekyear", -4.941642422609305),
-                                    ("hh:mmin|during the <part-of-day>", -5.3471075307174685),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.634789603169249),
-                                    ("Hanukkahyear (latent)", -5.3471075307174685),
-                                    ("February<time> <part-of-day>", -6.040254711277414),
-                                    ("Tuesdayin <named-month>|year", -6.040254711277414),
-                                    ("Great Lentyear (latent)", -6.040254711277414),
-                                    ("tomorrowat <time-of-day>", -5.3471075307174685),
-                                    ("between <time> and <time>on <date>", -4.430816798843313),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
-                                     -6.040254711277414),
-                                    ("last <cycle> of <time>year (latent)", -5.3471075307174685),
-                                    ("at <time-of-day>tomorrow", -5.634789603169249),
-                                    ("tomorrow<time-of-day> am|pm", -6.040254711277414),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -6.040254711277414),
-                                    ("Diwaliyear (latent)", -6.040254711277414),
-                                    ("Black Fridayyear (latent)", -5.634789603169249),
-                                    ("the <ordinal> last <cycle> of <time>year (latent)",
-                                     -6.040254711277414),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -6.040254711277414),
-                                    ("Chhathyear (latent)", -5.634789603169249),
-                                    ("Vasant Panchamiyear (latent)", -6.040254711277414),
-                                    ("Palm Sundayintersect", -6.040254711277414),
-                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
-                                     -6.040254711277414),
-                                    ("Februaryintersect", -6.040254711277414),
-                                    ("Simchat Torahyear (latent)", -6.040254711277414),
-                                    ("minuteyear", -6.040254711277414)],
-                               n = 313},
-                   koData =
-                     ClassData{prior = -0.9768531046320869, unseen = -6.385194398997726,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.774068722449905),
-                                    ("hourday", -4.774068722449905),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.69035945432406),
-                                    ("dayhour", -3.125410096862524),
-                                    ("Tuesdayfrom|since|after <time>", -5.69035945432406),
-                                    ("daymonth", -3.5502932908277893),
-                                    ("monthday", -5.284894346215896),
-                                    ("monthyear", -4.437596485828692),
-                                    ("<time-of-day> am|pmyear (latent)", -5.284894346215896),
-                                    ("Thai Pongalyear (latent)", -4.997212273764115),
-                                    ("intersecthh:mm", -5.69035945432406),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.69035945432406),
-                                    ("houryear", -4.774068722449905),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.69035945432406),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.997212273764115),
-                                    ("<time-of-day> am|pmintersect", -4.437596485828692),
-                                    ("until <time>on <date>", -4.997212273764115),
-                                    ("Octoberyear (latent)", -5.69035945432406),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.69035945432406),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -4.437596485828692),
-                                    ("about|exactly <time-of-day>year (latent)", -5.69035945432406),
-                                    ("absorption of , after named dayJuly", -5.284894346215896),
-                                    ("from|since|after <time>July", -5.69035945432406),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -4.774068722449905),
-                                    ("Clean Mondayyear (latent)", -5.69035945432406),
-                                    ("monthhour", -5.69035945432406),
-                                    ("hourmonth", -4.774068722449905),
-                                    ("todayat <time-of-day>", -5.69035945432406),
-                                    ("from|since|after <time>December", -5.69035945432406),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -5.69035945432406),
-                                    ("Mondayyear (latent)", -4.997212273764115),
-                                    ("dayday", -5.284894346215896),
-                                    ("mm/ddat <time-of-day>", -5.284894346215896),
-                                    ("<time-of-day> am|pmon <date>", -4.437596485828692),
-                                    ("dayyear", -2.719944988754359),
-                                    ("Thursdaymm/dd", -5.69035945432406),
-                                    ("New Year's Dayyear (latent)", -5.284894346215896),
-                                    ("Thursdayfrom|since|after <time>", -3.9856113620856353),
-                                    ("Thursdayat <time-of-day>", -4.437596485828692),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.69035945432406),
-                                    ("Aprilyear (latent)", -5.69035945432406),
-                                    ("monthminute", -5.69035945432406),
-                                    ("<time-of-day> am|pmtomorrow", -5.69035945432406),
-                                    ("Thursdayhh:mm", -4.774068722449905),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.69035945432406),
-                                    ("minutemonth", -3.898599985096005),
-                                    ("week-endin <named-month>|year", -5.69035945432406),
-                                    ("Augustyear (latent)", -5.284894346215896),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.284894346215896),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.284894346215896),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -5.284894346215896),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.69035945432406),
-                                    ("Sundayyear (latent)", -4.997212273764115),
-                                    ("Christmasat <time-of-day>", -5.69035945432406),
-                                    ("from|since|after <time>year (latent)", -4.437596485828692),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.69035945432406),
-                                    ("yesterday<time-of-day> am|pm", -5.69035945432406),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -5.69035945432406),
-                                    ("mm/ddyear (latent)", -5.69035945432406),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.997212273764115),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.69035945432406),
-                                    ("at <time-of-day>intersect", -5.284894346215896),
-                                    ("hh:mmyear (latent)", -4.591747165655951),
-                                    ("Holiyear (latent)", -5.69035945432406),
-                                    ("until <time><time-of-day> am|pm", -5.69035945432406),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.69035945432406),
-                                    ("dayminute", -3.164630810015805),
-                                    ("intersectSeptember", -4.186282057547786),
-                                    ("minuteday", -2.6223065191904436),
-                                    ("absorption of , after named dayintersect", -5.69035945432406),
-                                    ("Februaryin|during the <part-of-day>", -5.69035945432406),
-                                    ("hh:mmon <date>", -3.6754564337817954),
-                                    ("Saturdayyear (latent)", -5.69035945432406),
-                                    ("from|since|after <time>on <date>", -4.774068722449905),
-                                    ("absorption of , after named daySeptember",
-                                     -4.774068722449905),
-                                    ("Naraka Chaturdashiyear (latent)", -5.69035945432406),
-                                    ("on <date>September", -5.284894346215896),
-                                    ("at <time-of-day>on <date>", -5.284894346215896),
-                                    ("in <named-month>|yearyear (latent)", -5.69035945432406),
-                                    ("dayweek", -5.69035945432406),
-                                    ("Easter Sundayyear (latent)", -5.284894346215896),
-                                    ("Thursday<time-of-day> am|pm", -4.997212273764115),
-                                    ("weekyear", -5.284894346215896),
-                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
-                                     -5.69035945432406),
-                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
-                                     -4.997212273764115),
-                                    ("Sundayfrom|since|after <time>", -5.69035945432406),
-                                    ("absorption of , after named dayFebruary", -4.774068722449905),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.69035945432406),
-                                    ("tomorrowat <time-of-day>", -5.69035945432406),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.69035945432406),
-                                    ("last <cycle> of <time>year (latent)", -5.284894346215896),
-                                    ("tomorrow<time-of-day> am|pm", -5.69035945432406),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -4.997212273764115),
-                                    ("Diwaliyear (latent)", -5.284894346215896),
-                                    ("<time-of-day> - <time-of-day> (interval)July",
-                                     -5.69035945432406),
-                                    ("Fridayyear (latent)", -5.284894346215896),
-                                    ("minuteyear", -4.437596485828692)],
-                               n = 189}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.3184537311185346, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.1670540846631662),
-                                    ("integer (0..19)", -1.8718021769015913)],
-                               n = 24}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.791759469228055),
-                                    ("ordinal (digits)quarter (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("quarteryear", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
-                                     -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("Global Youth Service 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}}),
-       ("Tisha B'Av",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.15822400521489416,
-                               unseen = -4.976733742420574,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -4.255961441879589e-2),
-                                    ("intersect 2 numbers", -3.58351893845611)],
-                               n = 140},
-                   koData =
-                     ClassData{prior = -1.9218125974762528, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1349799328389845),
-                                    ("negative numbers", -0.6931471805599453),
-                                    ("compose by multiplication", -1.9459101490553135)],
-                               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}}),
-       ("<time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -1.0296194171811581),
-                                    ("intersect<integer> <unit-of-duration>", -1.9459101490553135),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -1.540445040947149),
-                                    ("from|since|after <time><integer> <unit-of-duration>",
-                                     -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.2039728043259361),
-                                    ("December<integer> <unit-of-duration>", -1.2039728043259361)],
-                               n = 2}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.2237754316221157,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Hanukkah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -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}}),
-       ("half a <time-grain>",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maha Saptami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -3.822121282019774e-2,
-                               unseen = -4.3694478524670215,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 77},
-                   koData =
-                     ClassData{prior = -3.283414346005772, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.3513752571634776),
-                                    ("part of daysintersect", -2.3513752571634776),
-                                    ("hourday", -0.9650808960435872),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -2.3513752571634776),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -2.3513752571634776),
-                                    ("part of daysthis <time>", -2.3513752571634776),
-                                    ("part of daysChristmas", -1.9459101490553135)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time> for <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
-                                     -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Shrove Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Kaanum Pongal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Yom Kippur",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("powers of tens",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15790302944580878,
-                               unseen = -5.093750200806762,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.1173044216802621),
-                                    ("month (grain)", -2.7850112422383386),
-                                    ("year (grain)", -2.6026896854443837),
-                                    ("week (grain)", -1.1173044216802621),
-                                    ("quarter", -3.4781584227982836), ("year", -2.6026896854443837),
-                                    ("month", -2.7850112422383386),
-                                    ("quarter (grain)", -3.4781584227982836)],
-                               n = 76},
-                   koData =
-                     ClassData{prior = -1.9236870122706031,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2809338454620642),
-                                    ("week (grain)", -1.2809338454620642),
-                                    ("day", -1.9740810260220096),
-                                    ("day (grain)", -1.9740810260220096)],
-                               n = 13}}),
-       ("Simchat Torah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)year (latent)",
-                                     -0.6931471805599453),
-                                    ("quarteryear", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Raksha Bandhan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Ashura",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Palm Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Adha",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
-                                    ("time-of-day (latent)", -1.9459101490553135),
-                                    ("<time-of-day> am|pm", -1.9459101490553135),
-                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
-                                    ("minute", -1.540445040947149)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -0.9808292530117262),
-                                    ("ordinal (digits)", -0.4700036292457356)],
-                               n = 6}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lag BaOmer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.262364264467491, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -1.466337068793427, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Chinese New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|this|next <season>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.635159922909596, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.11441035117774422),
-                                    ("integer (0..19)", -2.3581549441488563)],
-                               n = 71},
-                   koData =
-                     ClassData{prior = -0.7547050735593787, unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.878087785311434e-2),
-                                    ("integer (0..19)", -3.0910424533583156),
-                                    ("integer 21..99", -3.4965075614664802)],
-                               n = 63}}),
-       ("beginning of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.1273394223766015, unseen = -5.225746673713201,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.581298495463066),
-                                    ("integer (0..19)year (grain)", -3.1409142833984887),
-                                    ("integer (numeric)day (grain)", -2.655406467616788),
-                                    ("integer (0..19)second (grain) ", -3.834061463958434),
-                                    ("integer (0..19)hour (grain)", -3.1409142833984887),
-                                    ("second", -3.42859635585027),
-                                    ("integer (numeric)second (grain) ", -4.121743536410215),
-                                    ("integer (numeric)year (grain)", -3.1409142833984887),
-                                    ("day", -2.3871424810221087), ("year", -2.512305623976115),
-                                    ("integer (numeric)week (grain)", -3.1409142833984887),
-                                    ("integer (0..19)month (grain)", -3.6109179126442243),
-                                    ("hour", -2.7354491752903245), ("month", -2.917770732084279),
-                                    ("integer (numeric)minute (grain)", -3.2744456760230114),
-                                    ("integer (0..19)minute (grain)", -3.1409142833984887),
-                                    ("integer (numeric)month (grain)", -3.42859635585027),
-                                    ("minute", -2.581298495463066),
-                                    ("integer (numeric)hour (grain)", -3.6109179126442243),
-                                    ("integer (0..19)day (grain)", -3.6109179126442243),
-                                    ("integer (0..19)week (grain)", -3.2744456760230114)],
-                               n = 81},
-                   koData =
-                     ClassData{prior = -2.12389330425067, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2546422183735807, unseen = -5.37989735354046,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>", -3.765840495250065),
-                                    ("integer after|past <hour-of-day>", -3.9889840465642745),
-                                    ("at <time-of-day>", -2.1564025828159643),
-                                    ("<time-of-day> o'clock", -4.276666119016055),
-                                    ("half after|past <hour-of-day>", -4.276666119016055),
-                                    ("time-of-day (latent)", -1.7117167615545186),
-                                    ("hhmm (latent)", -4.68213122712422),
-                                    ("hh:mm", -2.330755969960742),
-                                    ("quarter after|past <hour-of-day>", -4.68213122712422),
-                                    ("until <time>", -3.9889840465642745),
-                                    ("about|exactly <time-of-day>", -4.68213122712422),
-                                    ("hour", -1.1856236656577395),
-                                    ("<time-of-day> sharp|exactly", -4.68213122712422),
-                                    ("minute", -1.791759469228055)],
-                               n = 100},
-                   koData =
-                     ClassData{prior = -1.492516574375198, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.20545280453606),
-                                    ("from|since|after <time>", -3.20545280453606),
-                                    ("<hour-of-day> <integer>", -3.6109179126442243),
-                                    ("time-of-day (latent)", -1.085189268335969),
-                                    ("hour", -1.0459685551826876), ("minute", -2.6946271807700692)],
-                               n = 29}}),
-       ("Yom Ha'atzmaut",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thiru Onam",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thai Pongal",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Vijayadashami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.49247648509779407,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.1972245773362196),
-                                    ("year (grain)", -2.1972245773362196),
-                                    ("second", -2.890371757896165),
-                                    ("week (grain)", -2.1972245773362196),
-                                    ("day", -2.1972245773362196),
-                                    ("minute (grain)", -2.890371757896165),
-                                    ("year", -2.1972245773362196),
-                                    ("second (grain) ", -2.890371757896165),
-                                    ("minute", -2.890371757896165),
-                                    ("day (grain)", -2.1972245773362196)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -0.9444616088408514, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("at the beginning|end of <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -0.6931471805599453),
-                                    ("year", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Dhanteras",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Tu BiShvat",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Whit Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -5.6352936551131744e-2,
-                               unseen = -4.2626798770413155,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
-                   koData =
-                     ClassData{prior = -2.9041650800285006, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("Holi",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Rosh Hashanah",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <named-day> ago|back",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)Thursday", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Holika Dahan",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -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}}),
-       ("Mawlid",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Jumu'atul-Wida",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.1786549963416462, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -2.159484249353372),
-                                    ("time-of-day (latent)", -2.5649493574615367),
-                                    ("year", -2.159484249353372),
-                                    ("<time-of-day> am|pm", -1.8718021769015913),
-                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
-                                    ("minute", -1.6486586255873816)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.2192034840549946),
-                                    ("yesterday", -2.7300291078209855),
-                                    ("day", -2.7300291078209855),
-                                    ("time-of-day (latent)", -1.6314168191528755),
-                                    ("hh:mm", -2.2192034840549946), ("hour", -1.5260563034950494),
-                                    ("minute", -1.749199854809259)],
-                               n = 18}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
-                                    ("this|last|next <cycle>", -1.791759469228055),
-                                    ("day", -2.4849066497880004),
-                                    ("time-of-day (latent)", -2.890371757896165),
-                                    ("hhmm (latent)", -2.4849066497880004),
-                                    ("<time-of-day> am|pm", -2.890371757896165),
-                                    ("hour", -2.1972245773362196),
-                                    ("next <time>", -2.890371757896165),
-                                    ("this|next <day-of-week>", -2.890371757896165),
-                                    ("minute", -2.4849066497880004)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("Sukkot",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day> in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.3025850929940455),
-                                    ("monthyear", -1.8971199848858813),
-                                    ("Marcha <unit-of-duration>", -2.3025850929940455),
-                                    ("March<integer> <unit-of-duration>", -2.3025850929940455),
-                                    ("Thanksgiving Daya <unit-of-duration>", -2.3025850929940455),
-                                    ("Thanksgiving Day<integer> <unit-of-duration>",
-                                     -1.8971199848858813),
-                                    ("Vijayadashami<integer> <unit-of-duration>",
-                                     -2.3025850929940455),
-                                    ("dayyear", -1.6094379124341003)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("World Vegan Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.5389965007326869, unseen = -4.948759890378168,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.248495242049359),
-                                    ("dayhour", -3.8430301339411947),
-                                    ("daymonth", -2.995732273553991),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.248495242049359),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.5553480614894135),
-                                    ("Wednesdayintersect", -4.248495242049359),
-                                    ("Black Fridaythis|last|next <cycle>", -4.248495242049359),
-                                    ("<part-of-day> of <time>February", -4.248495242049359),
-                                    ("Saturday<time-of-day> am|pm", -4.248495242049359),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -3.8430301339411947),
-                                    ("on <date><time-of-day> am|pm", -4.248495242049359),
-                                    ("hourmonth", -4.248495242049359),
-                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
-                                     -4.248495242049359),
-                                    ("dayday", -2.3766930651477676),
-                                    ("the <day-of-month> (ordinal)February", -3.8430301339411947),
-                                    ("WednesdayOctober", -4.248495242049359),
-                                    ("Wednesdaythis|last|next <cycle>", -3.8430301339411947),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.332204510175204),
-                                    ("dayyear", -3.332204510175204),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.248495242049359),
-                                    ("Thursdayhh:mm", -3.8430301339411947),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.248495242049359),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -3.8430301339411947),
-                                    ("TuesdayOctober", -4.248495242049359),
-                                    ("the <day-of-month> (ordinal)March", -4.248495242049359),
-                                    ("Mondaythis|last|next <cycle>", -4.248495242049359),
-                                    ("Fridayintersect", -4.248495242049359),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.8430301339411947),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.8430301339411947),
-                                    ("Tuesdaythis|last|next <cycle>", -4.248495242049359),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.248495242049359),
-                                    ("dayminute", -2.8622008809294686),
-                                    ("minuteday", -3.332204510175204),
-                                    ("this|last|next <cycle>Sunday", -4.248495242049359),
-                                    ("Sundaythis|last|next <cycle>", -4.248495242049359),
-                                    ("weekday", -4.248495242049359),
-                                    ("dayweek", -3.1498829533812494),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -3.8430301339411947)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -0.8754687373538999, unseen = -4.762173934797756,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.060443010546419),
-                                    ("week-endOctober", -3.367295829986474),
-                                    ("daymonth", -1.8632184332102),
-                                    ("TuesdaySeptember", -4.060443010546419),
-                                    ("Wednesdayintersect", -4.060443010546419),
-                                    ("hourmonth", -2.9618307218783095),
-                                    ("Fridaythis|last|next <cycle>", -4.060443010546419),
-                                    ("SundayFebruary", -4.060443010546419),
-                                    ("WednesdayOctober", -4.060443010546419),
-                                    ("week-endintersect", -4.060443010546419),
-                                    ("dayyear", -4.060443010546419),
-                                    ("FridayJuly", -3.654977902438255),
-                                    ("FridaySeptember", -4.060443010546419),
-                                    ("WednesdayFebruary", -4.060443010546419),
-                                    ("minutemonth", -3.144152278672264),
-                                    ("SundayMarch", -4.060443010546419),
-                                    ("MondayFebruary", -3.654977902438255),
-                                    ("Fridayintersect", -4.060443010546419),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.654977902438255),
-                                    ("dayminute", -3.367295829986474),
-                                    ("SaturdaySeptember", -4.060443010546419),
-                                    ("intersectSeptember", -3.144152278672264),
-                                    ("MondayMarch", -4.060443010546419),
-                                    ("on <date>September", -3.654977902438255),
-                                    ("Tuesdayintersect", -4.060443010546419),
-                                    ("Sundayintersect", -4.060443010546419)],
-                               n = 30}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6286086594223742, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.5649493574615367),
-                                    ("day", -1.1786549963416462), ("Sunday", -2.5649493574615367),
-                                    ("Chinese New Year", -2.159484249353372),
-                                    ("Thanksgiving Day", -2.5649493574615367),
-                                    ("Easter Sunday", -2.5649493574615367),
-                                    ("hour", -2.5649493574615367), ("Tuesday", -2.5649493574615367),
-                                    ("week-end", -2.5649493574615367)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.7621400520468967,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.4849066497880004), ("day", -2.0794415416798357),
-                                    ("Sunday", -2.4849066497880004), ("hour", -1.3862943611198906),
-                                    ("week-end", -1.3862943611198906)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Clean Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Easter Sunday",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm.dd.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Isra and Mi'raj",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.833213344056216),
-                                    ("a <unit-of-duration>Christmas", -2.833213344056216),
-                                    ("dayday", -2.833213344056216),
-                                    ("<integer> <unit-of-duration>today", -2.833213344056216),
-                                    ("daysecond", -2.833213344056216),
-                                    ("a <unit-of-duration>right now", -2.833213344056216),
-                                    ("minutenograin", -2.833213344056216),
-                                    ("<integer> <unit-of-duration>Christmas", -2.833213344056216),
-                                    ("<integer> <unit-of-duration>Easter Sunday",
-                                     -2.833213344056216),
-                                    ("secondnograin", -2.833213344056216),
-                                    ("yearday", -2.1400661634962708),
-                                    ("daynograin", -2.833213344056216),
-                                    ("<integer> <unit-of-duration>now", -2.4277482359480516)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.5649493574615367),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.5649493574615367),
-                                    ("monthnograin", -2.5649493574615367),
-                                    ("dayday", -2.159484249353372),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.5649493574615367),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.5649493574615367),
-                                    ("<integer> <unit-of-duration>now", -2.5649493574615367)],
-                               n = 4}}),
-       ("<day-of-month> (ordinal or number) of <month>",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.803360380906535),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.803360380906535),
-                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
-                                    ("integer (numeric)this|last|next <cycle>",
-                                     -2.3978952727983707),
-                                    ("ordinal (digits)February", -2.803360380906535),
-                                    ("integer (numeric)February", -2.3978952727983707),
-                                    ("month", -0.9315582040049435),
-                                    ("ordinal (digits)March", -2.803360380906535),
-                                    ("integer (numeric)July", -2.803360380906535)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.7047480922384253),
-                                    ("month", -1.7047480922384253)],
-                               n = 1}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("Naraka Chaturdashi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("beginning of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.70805020110221),
-                                    ("Halloween", -2.70805020110221),
-                                    ("Wednesday", -2.70805020110221),
-                                    ("Boss's Day", -2.70805020110221),
-                                    ("Monday", -2.70805020110221), ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.70805020110221),
-                                    ("March", -2.70805020110221), ("month", -2.70805020110221),
-                                    ("Tuesday", -2.0149030205422647)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>|year",
-        Classifier{okData =
-                     ClassData{prior = -0.2719337154836418,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<year> (bc|ad)", -1.845826690498331),
-                                    ("October", -2.9444389791664407),
-                                    ("year (latent)", -1.3350010667323402),
-                                    ("year", -0.9295359586241757), ("March", -2.9444389791664407),
-                                    ("month", -2.538973871058276)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.4350845252893227, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.6739764335716716),
-                                    ("year (latent)", -1.3862943611198906),
-                                    ("year", -1.3862943611198906), ("month", -1.6739764335716716)],
-                               n = 5}}),
-       ("Islamic New Year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half a <time-grain>", -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}}),
-       ("half an hour (abbrev).",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               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.5596157879354228, unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.012261575505202),
-                                    ("from|since|after <time>hh:mm", -2.501435951739211),
-                                    ("minuteminute", -1.2776605201170952),
-                                    ("hh:mmhh:mm", -1.9136492868370918),
-                                    ("dayday", -3.012261575505202),
-                                    ("hourhour", -3.012261575505202),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.012261575505202),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.012261575505202),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.012261575505202)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.2386784521643803),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.2386784521643803),
-                                    ("daymonth", -2.833213344056216),
-                                    ("<time-of-day> am|pmintersect", -3.2386784521643803),
-                                    ("hh:mm<time-of-day> am|pm", -2.833213344056216),
-                                    ("minuteminute", -1.9859154836690123),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("dayday", -3.2386784521643803),
-                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
-                                     -2.833213344056216),
-                                    ("hourhour", -2.5455312716044354),
-                                    ("minutehour", -2.833213344056216),
-                                    ("hh:mmintersect", -2.322387720290225),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.2386784521643803),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.2386784521643803),
-                                    ("from|since|after <time>intersect", -2.833213344056216)],
-                               n = 15}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Laylat al-Qadr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Boghi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("at the beginning|end of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("January", -1.3862943611198906),
-                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.0986122886681098),
-                                    ("month", -1.0986122886681098)],
-                               n = 1}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>hh:mm", -2.4849066497880004),
-                                    ("minuteminute", -1.529395204760564),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -1.8971199848858813),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.4418327522790392, unseen = -4.532599493153256,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.828641396489095),
-                                    ("until <time>time-of-day (latent)", -2.575878427993727),
-                                    ("hh:mmtime-of-day (latent)", -2.12389330425067),
-                                    ("hh:mm<time-of-day> am|pm", -3.4231762883809305),
-                                    ("from|since|after <time><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.828641396489095),
-                                    ("hourhour", -1.6314168191528755),
-                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
-                                     -3.828641396489095),
-                                    ("hourminute", -3.828641396489095),
-                                    ("minutehour", -1.5773495978825998),
-                                    ("until <time><time-of-day> am|pm", -3.4231762883809305),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.828641396489095),
-                                    ("from|since|after <time>time-of-day (latent)",
-                                     -2.575878427993727),
-                                    ("at <time-of-day>time-of-day (latent)", -3.4231762883809305),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.4231762883809305)],
-                               n = 36}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("Diwali",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("last night",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   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.916290731874155, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.9924301646902063),
-                                    ("daymonth", -1.4816045409242156),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.9924301646902063),
-                                    ("week (grain)intersect", -2.3978952727983707),
-                                    ("week (grain)September", -2.3978952727983707)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.2335922215070942),
-                                    ("day (grain)May", -2.2335922215070942),
-                                    ("week (grain)year (latent)", -1.9459101490553135),
-                                    ("weekmonth", -1.7227665977411035),
-                                    ("week (grain)October", -2.2335922215070942),
-                                    ("weekyear", -1.9459101490553135),
-                                    ("week (grain)intersect", -2.2335922215070942)],
-                               n = 9}}),
-       ("Chhath",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Vasant Panchami",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("daymonth", -2.1972245773362196),
-                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.1972245773362196),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("ordinal (digits)week (grain)year (latent)",
-                                     -2.1972245773362196),
-                                    ("weekyear", -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("Great Lent",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Maundy Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("compose by multiplication",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.832909122935104),
-                                    ("hh:mmhh:mm", -0.832909122935104)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
-                                    ("minuteminute", -1.410986973710262),
-                                    ("minutehour", -1.410986973710262),
-                                    ("hh:mmintersect", -1.410986973710262)],
-                               n = 18}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\", \"of\", \"from\" for year",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Black Fridaythis|last|next <cycle>", -2.4849066497880004),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -2.0794415416798357),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
-                                     -2.4849066497880004),
-                                    ("dayyear", -0.9808292530117262),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -2.4849066497880004),
-                                    ("intersectyear (latent)", -2.4849066497880004),
-                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
-                                     -2.0794415416798357)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Fridaythis|last|next <cycle>", -1.6094379124341003),
-                                    ("dayyear", -1.6094379124341003)],
-                               n = 1}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("at the beginning|end of <week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.330733340286331,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.706570200892086),
-                                    ("this|last|next <cycle>", -0.8209805520698302),
-                                    ("about|exactly <time-of-day>", -2.70805020110221)],
-                               n = 36},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Eid al-Fitr",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Trinity Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Pentecost",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.639057329615259),
-                                    ("Martin Luther King's Day", -2.639057329615259),
-                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
-                                    ("Thanksgiving Day", -2.639057329615259),
-                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
-                                    ("winter", -2.639057329615259),
-                                    ("week-end", -2.639057329615259),
-                                    ("summer", -2.2335922215070942)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                     ClassData{prior = -2.5649493574615367, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7308875085427924),
+                                    ("integer (numeric)time-of-day (latent)", -0.7308875085427924)],
+                               n = 12}}),
+       ("week",
+        Classifier{okData =
+                     ClassData{prior = 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> timezone",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.23410650459726,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.4277482359480516),
+                                    ("hhhmm", -1.65455834771457),
+                                    ("<time-of-day> am|pm", -2.0222831278398874),
+                                    ("hh:mm", -2.2735975561207935), ("hour", -1.821612432377736),
+                                    ("minute", -1.128465251817791)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm", -1.3862943611198906), ("hh:mm", -1.791759469228055),
+                                    ("minute", -1.0986122886681098)],
+                               n = 3}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.561051950755874, unseen = -6.212606095751519,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 497},
+                   koData =
+                     ClassData{prior = -0.8453861794379709, unseen = -5.929589143389895,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 374}}),
+       ("<year> (bc|ad)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.466337068793427),
+                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
+                                    ("month", -1.8718021769015913)],
+                               n = 3}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   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}}),
+       ("Karva Chauth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        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}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.3862943611198906),
+                                    ("yearhour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -0.9808292530117262)],
+                               n = 2}}),
+       ("Maha Shivaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("from|since|after <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.70810943994113, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal or number) <named-month>",
+                                     -3.8066624897703196),
+                                    ("July", -3.8066624897703196),
+                                    ("intersect", -3.8066624897703196),
+                                    ("year (latent)", -3.4011973816621555),
+                                    ("day", -2.4203681286504293),
+                                    ("the <day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("the <day-of-month> (number)", -3.8066624897703196),
+                                    ("time-of-day (latent)", -2.5538995212749516),
+                                    ("year", -3.4011973816621555),
+                                    ("<time-of-day> am|pm", -2.5538995212749516),
+                                    ("hh:mm", -2.890371757896165),
+                                    ("<day-of-month> (ordinal)", -3.4011973816621555),
+                                    ("hour", -1.9348603128687285), ("month", -3.4011973816621555),
+                                    ("minute", -2.890371757896165),
+                                    ("August", -3.8066624897703196)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.19992526121220253,
+                               unseen = -5.638354669333745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -4.02535169073515),
+                                    ("week", -4.941642422609305),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.941642422609305),
+                                    ("today", -4.941642422609305),
+                                    ("intersect", -2.995732273553991),
+                                    ("<time> for <duration>", -4.248495242049359),
+                                    ("second", -4.941642422609305), ("now", -3.236894330370879),
+                                    ("tomorrow", -4.53617731450114),
+                                    ("this|last|next <cycle>", -4.941642422609305),
+                                    ("day", -1.784642001459191),
+                                    ("the <day-of-month> (ordinal)", -4.53617731450114),
+                                    ("the <day-of-month> (number)", -3.5553480614894135),
+                                    ("time-of-day (latent)", -2.4992953872401),
+                                    ("<time-of-day> am|pm", -4.248495242049359),
+                                    ("hh:mm", -4.53617731450114), ("nograin", -3.236894330370879),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.53617731450114),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.941642422609305),
+                                    ("<day-of-month> (ordinal)", -3.8430301339411947),
+                                    ("Easter Sunday", -4.941642422609305),
+                                    ("Christmas", -4.248495242049359),
+                                    ("hour", -2.3389527371649206), ("month", -4.941642422609305),
+                                    ("<datetime> - <datetime> (interval)", -2.744417845273085),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.995732273553991),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -4.53617731450114),
+                                    ("minute", -1.9972034434428638),
+                                    ("right now", -4.941642422609305),
+                                    ("<month> dd-dd (interval)", -4.248495242049359),
+                                    ("part of days", -4.941642422609305),
+                                    ("dd-dd <month> (interval)", -4.53617731450114)],
+                               n = 122}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("integer (numeric)time-of-day (latent)", -1.3862943611198906),
+                                    ("integer (20..90)time-of-day (latent)", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.268683541318364),
+                                    ("daymonth", -2.268683541318364),
+                                    ("ordinal (digits)day (grain)May", -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.6741486494265287),
+                                    ("weekmonth", -1.7578579175523736),
+                                    ("ordinal (digits)week (grain)October", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)intersect", -2.6741486494265287),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.6741486494265287),
+                                    ("weekyear", -1.9810014688665833),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.6741486494265287),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)May",
+                                     -2.6741486494265287)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.041453874828161, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.3978952727983707),
+                                    ("ordinal (digits)December", -1.7047480922384253),
+                                    ("ordinal (digits)February", -2.3978952727983707),
+                                    ("integer (numeric)April", -2.3978952727983707),
+                                    ("month", -1.1451323043030026)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4353180712578455,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.772588722239781),
+                                    ("ordinal (digits)July", -2.0794415416798357),
+                                    ("integer (numeric)September", -2.367123614131617),
+                                    ("ordinal (digits)August", -2.772588722239781),
+                                    ("ordinal (digits)April", -2.772588722239781),
+                                    ("month", -0.9808292530117262),
+                                    ("integer (numeric)July", -2.0794415416798357)],
+                               n = 11}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.19105523676270922,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("dayhour", -1.499234772300486),
+                                    ("Mondayearly morning", -3.536116699561526),
+                                    ("time-of-day (latent)tonight", -3.536116699561526),
+                                    ("hourhour", -2.236833715431265),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("todaypart of days", -3.9415818076696905),
+                                    ("minutehour", -2.6888188391743224),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.536116699561526),
+                                    ("time-of-day (latent)this <part-of-day>", -3.9415818076696905),
+                                    ("Mondayin|during the <part-of-day>", -3.9415818076696905),
+                                    ("intersectpart of days", -3.0252910757955354),
+                                    ("Saturdaypart of days", -3.9415818076696905),
+                                    ("intersectin|during the <part-of-day>", -3.9415818076696905),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("tomorrowpart of days", -2.33214389523559),
+                                    ("hh:mmin|during the <part-of-day>", -3.0252910757955354),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("yesterdaypart of days", -3.536116699561526),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.9415818076696905),
+                                    ("Mondaypart of days", -3.9415818076696905)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -1.749199854809259, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.068052935133617),
+                                    ("yearhour", -3.068052935133617),
+                                    ("monthhour", -3.068052935133617),
+                                    ("hourhour", -1.9694406464655074),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -3.068052935133617),
+                                    ("Februaryin|during the <part-of-day>", -3.068052935133617),
+                                    ("tomorrowpart of days", -3.068052935133617),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.151762203259462)],
+                               n = 8}}),
+       ("today",
+        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}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -1.2163953243244932,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -0.3513978868378886, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.24557058710165408,
+                               unseen = -5.3471075307174685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.9560398908449206),
+                                    ("noon|midnight|EOD|end of day", -4.243721963296701),
+                                    ("integer after|past <hour-of-day>", -3.9560398908449206),
+                                    ("<time-of-day> o'clock", -4.6491870714048655),
+                                    ("half after|past <hour-of-day>", -4.6491870714048655),
+                                    ("hhhmm", -3.3964241029094975),
+                                    ("<hour-of-day> <integer>", -3.9560398908449206),
+                                    ("time-of-day (latent)", -1.6787726058351646),
+                                    ("hhmm (latent)", -3.9560398908449206),
+                                    ("<time-of-day> am|pm", -2.010129741789607),
+                                    ("hh:mm", -3.262892710284975),
+                                    ("about|exactly <time-of-day>", -4.243721963296701),
+                                    ("hour", -1.1526795099383855),
+                                    ("<time-of-day> sharp|exactly", -4.6491870714048655),
+                                    ("minute", -1.845826690498331)],
+                               n = 97},
+                   koData =
+                     ClassData{prior = -1.5244446996007077, unseen = -4.248495242049359,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9760099665757773),
+                                    ("<time-of-day> am|pm", -3.1354942159291497),
+                                    ("hour", -0.9019019944220554)],
+                               n = 27}}),
+       ("December",
+        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}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.8622008809294686),
+                                    ("Saturday", -2.8622008809294686),
+                                    ("Monday", -2.456735772821304), ("Friday", -1.6094379124341003),
+                                    ("day", -0.8472978603872037), ("Sunday", -2.8622008809294686),
+                                    ("on <day>", -2.169053700369523)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = -3.17486983145803e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -3.4657359027997265,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("hour", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("the <day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7621400520468967, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6094379124341003),
+                                    ("ordinal (digits)February", -1.8971199848858813),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)March", -1.8971199848858813)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.6286086594223742,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.4816045409242156),
+                                    ("month", -0.8938178760220964),
+                                    ("integer (numeric)July", -1.4816045409242156)],
+                               n = 8}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -1.227009259181436e-2,
+                               unseen = -4.418840607796598,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 81},
+                   koData =
+                     ClassData{prior = -4.406719247264253, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("in|during <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2744368457017603,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<year> (bc|ad)", -1.9924301646902063),
+                                    ("October", -3.0910424533583156),
+                                    ("year (latent)", -1.2992829841302609),
+                                    ("year", -0.9509762898620451), ("March", -2.6855773452501515),
+                                    ("month", -2.3978952727983707)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -1.4271163556401458,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.5040773967762742),
+                                    ("year (latent)", -1.5040773967762742),
+                                    ("year", -1.5040773967762742), ("month", -1.5040773967762742)],
+                               n = 6}}),
+       ("<part-of-day> at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.223809823697212e-2,
+                               unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this <part-of-day>hh:mm", -3.7013019741124937),
+                                    ("tonighthh:mm", -3.7013019741124937),
+                                    ("hourhour", -0.8979415932059586),
+                                    ("hourminute", -3.0081547935525483),
+                                    ("in|during the <part-of-day>time-of-day (latent)",
+                                     -3.7013019741124937),
+                                    ("this <part-of-day>time-of-day (latent)", -1.9965538818740682),
+                                    ("early morningtime-of-day (latent)", -3.7013019741124937),
+                                    ("tonight<time-of-day> o'clock", -3.7013019741124937),
+                                    ("tonighttime-of-day (latent)", -2.7850112422383386),
+                                    ("part of dayshh:mm", -3.7013019741124937),
+                                    ("part of daystime-of-day (latent)", -1.6218604324326575)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -2.538973871058276, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.4469189829363254),
+                                    ("this <part-of-day>time-of-day (latent)", -2.1400661634962708),
+                                    ("tonighttime-of-day (latent)", -2.1400661634962708),
+                                    ("part of daystime-of-day (latent)", -2.1400661634962708)],
+                               n = 3}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -2.0794415416798357),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.0794415416798357),
+                                    ("hhhmmhhhmm", -2.0794415416798357),
+                                    ("minutehour", -1.6739764335716716),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("minutehour", -1.3862943611198906),
+                                    ("hhhmmtime-of-day (latent)", -1.791759469228055)],
+                               n = 2}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Good Friday",
+        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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.11122563511022437, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 34},
+                   koData =
+                     ClassData{prior = -2.2512917986064953, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<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.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.0794415416798357),
+                                    ("<part-of-day> at <time-of-day>", -2.0794415416798357),
+                                    ("time-of-day (latent)", -1.1631508098056809),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vesak",
+        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}}),
+       ("Earth 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}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.178691788743376, unseen = -4.718498871295094,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.3232358401924436),
+                                    ("<integer> more <unit-of-duration>", -4.0163830207523885),
+                                    ("three-quarters of an hour", -3.100092288878234),
+                                    ("<integer> + '\"", -3.3232358401924436),
+                                    ("number.number hours", -4.0163830207523885),
+                                    ("second", -3.6109179126442243),
+                                    ("half a <time-grain>", -3.100092288878234),
+                                    ("day", -3.3232358401924436), ("year", -4.0163830207523885),
+                                    ("<integer> <unit-of-duration>", -1.6184877479540183),
+                                    ("a <unit-of-duration>", -3.100092288878234),
+                                    ("quarter of an hour", -3.100092288878234),
+                                    ("hour", -2.512305623976115),
+                                    ("about|exactly <duration>", -4.0163830207523885),
+                                    ("half an hour (abbrev).", -3.6109179126442243),
+                                    ("<integer> and an half hour", -4.0163830207523885),
+                                    ("minute", -1.3083328196501787)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -1.8101086078962516,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.917770732084279), ("quarter", -2.917770732084279),
+                                    ("year", -1.6650077635889111),
+                                    ("<integer> <unit-of-duration>", -1.6650077635889111),
+                                    ("a <unit-of-duration>", -2.2246235515243336),
+                                    ("month", -2.917770732084279)],
+                               n = 9}}),
+       ("the closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.0986122886681098),
+                                    ("Christmastoday", -1.791759469228055),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.791759469228055),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("MondayOctober", -1.3862943611198906)],
+                               n = 1}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4},
+                   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}}),
+       ("Ganesh Chaturthi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        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}}),
+       ("<time-of-day> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)tonight", -2.5649493574615367),
+                                    ("hourhour", -1.3609765531356008),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -2.9704144655697013),
+                                    ("minutehour", -1.717651497074333),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("time-of-day (latent)this <part-of-day>", -2.9704144655697013),
+                                    ("hh:mmin|during the <part-of-day>", -2.0541237336955462),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.277267285009756),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -2.9704144655697013)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.466337068793427),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -1.466337068793427)],
+                               n = 2}}),
+       ("the nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.6931471805599453),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.4000876832522264, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -0.28312625591592017, unseen = -4.04305126783455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 55}}),
+       ("Parsi New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("Thanksgiving Day<integer> <unit-of-duration>",
+                                     -1.0986122886681098),
+                                    ("dayyear", -1.3862943611198906),
+                                    ("Diwali<integer> <unit-of-duration>", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("May",
+        Classifier{okData =
+                     ClassData{prior = 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.4884848944913853, unseen = -7.199678345691172,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.505784060128229),
+                                    ("Karva Chauthyear (latent)", -6.505784060128229),
+                                    ("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.505784060128229),
+                                    ("Maha Shivaratriyear (latent)", -6.505784060128229),
+                                    ("Ramadanyear (latent)", -5.253021091632861),
+                                    ("<datetime> - <datetime> (interval)on <day>",
+                                     -5.119489699008338),
+                                    ("Bhai Doojyear (latent)", -6.505784060128229),
+                                    ("hourday", -4.490881039585964),
+                                    ("dayhour", -3.4612616224048054),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.119489699008338),
+                                    ("Martin Luther King's Dayyear (latent)", -6.100318952020064),
+                                    ("Shemini Atzeretyear (latent)", -6.505784060128229),
+                                    ("daymonth", -4.365717896631958),
+                                    ("monthday", -6.100318952020064),
+                                    ("monthyear", -4.633981883226637),
+                                    ("Yom Ha'atzmautyear (latent)", -6.505784060128229),
+                                    ("Orthodox Good Fridayyear (latent)", -6.100318952020064),
+                                    ("Vijayadashamiyear (latent)", -6.505784060128229),
+                                    ("Thanksgiving Dayyear (latent)", -5.407171771460119),
+                                    ("Thai Pongalyear (latent)", -5.8126368795682835),
+                                    ("Thiru Onamyear (latent)", -5.8126368795682835),
+                                    ("hhhmmabsorption of , after named day", -6.505784060128229),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.505784060128229),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.589493328254074),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.505784060128229),
+                                    ("Krishna Janmashtamiyear (latent)", -6.100318952020064),
+                                    ("Guru Gobind Singh Jayantiyear (latent)", -6.505784060128229),
+                                    ("houryear", -5.589493328254074),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.505784060128229),
+                                    ("Christmas<time-of-day> am|pm", -6.505784060128229),
+                                    ("<day-of-month> (ordinal)October", -6.505784060128229),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.505784060128229),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.8126368795682835),
+                                    ("intersectin|during <named-month>|year", -6.505784060128229),
+                                    ("<time-of-day> am|pmintersect", -5.253021091632861),
+                                    ("Earth Houryear (latent)", -6.505784060128229),
+                                    ("Ganesh Chaturthiyear (latent)", -6.505784060128229),
+                                    ("Octoberyear (latent)", -4.896346147694128),
+                                    ("intersect<time-of-day> am|pm", -6.505784060128229),
+                                    ("Mattu Pongalyear (latent)", -6.505784060128229),
+                                    ("Saturday<part-of-day> at <time-of-day>", -6.505784060128229),
+                                    ("Shavuotyear (latent)", -6.505784060128229),
+                                    ("Parsi New Yearyear (latent)", -5.589493328254074),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.505784060128229),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.505784060128229),
+                                    ("todayin|within|after <duration>", -6.505784060128229),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -6.100318952020064),
+                                    ("Marchyear (latent)", -6.505784060128229),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hhhmm",
+                                     -6.100318952020064),
+                                    ("Sukkotyear (latent)", -6.100318952020064),
+                                    ("hhhmmintersect", -6.100318952020064),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.100318952020064),
+                                    ("Clean Mondayyear (latent)", -6.100318952020064),
+                                    ("monthhour", -6.100318952020064),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.589493328254074),
+                                    ("todayat <time-of-day>", -6.505784060128229),
+                                    ("Thursday<time> timezone", -4.107888787329858),
+                                    ("tonight<time-of-day> am|pm", -6.505784060128229),
+                                    ("time-of-day (latent)tonight", -6.100318952020064),
+                                    ("from|since|after <time>December", -6.505784060128229),
+                                    ("<time-of-day> am|pmon <day>", -4.490881039585964),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.505784060128229),
+                                    ("yyyy-mm-ddhh:mm:ss", -6.100318952020064),
+                                    ("dayday", -3.7331953378884473),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.100318952020064),
+                                    ("mm/ddat <time-of-day>", -5.8126368795682835),
+                                    ("tonightat <time-of-day>", -5.407171771460119),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.8126368795682835),
+                                    ("Dayananda Saraswati Jayantiyear (latent)",
+                                     -6.505784060128229),
+                                    ("today<time-of-day> am|pm", -6.505784060128229),
+                                    ("Februarythe <day-of-month> (ordinal)", -6.100318952020064),
+                                    ("at <time-of-day><time> <part-of-day>", -6.505784060128229),
+                                    ("<day-of-month> (ordinal)intersect", -5.8126368795682835),
+                                    ("mm/dd<time-of-day> am|pm", -6.505784060128229),
+                                    ("hourhour", -3.5353695945585275),
+                                    ("Mahavir Jayantiyear (latent)", -6.100318952020064),
+                                    ("Navaratriin|during <named-month>|year", -6.505784060128229),
+                                    ("Wednesdaythis|last|next <cycle>", -6.505784060128229),
+                                    ("Lentyear (latent)", -6.505784060128229),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.633981883226637),
+                                    ("Boghiyear (latent)", -6.505784060128229),
+                                    ("dayyear", -1.9106642099936384),
+                                    ("Karva Chauthin|during <named-month>|year",
+                                     -6.505784060128229),
+                                    ("Thursdayfrom|since|after <time>", -6.100318952020064),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.505784060128229),
+                                    ("Thursdayat <time-of-day>", -5.8126368795682835),
+                                    ("Islamic New Yearyear (latent)", -6.100318952020064),
+                                    ("Laylat al-Qadryear (latent)", -5.589493328254074),
+                                    ("part of days<time-of-day> am|pm", -6.505784060128229),
+                                    ("Shrove Tuesdayyear (latent)", -6.505784060128229),
+                                    ("intersect by \",\", \"of\", \"from\" for year<time-of-day> am|pm",
+                                     -5.8126368795682835),
+                                    ("hourminute", -6.100318952020064),
+                                    ("<time-of-day> am|pmtomorrow", -5.589493328254074),
+                                    ("Yom Kippuryear (latent)", -6.505784060128229),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.8126368795682835),
+                                    ("<part-of-day> of <time>year (latent)", -6.505784060128229),
+                                    ("minutehour", -5.253021091632861),
+                                    ("Kaanum Pongalyear (latent)", -6.100318952020064),
+                                    ("Maha Saptamiyear (latent)", -6.505784060128229),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.8126368795682835),
+                                    ("time-of-day (latent)tomorrow", -5.589493328254074),
+                                    ("part of daysat <time-of-day>", -4.896346147694128),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.490881039585964),
+                                    ("for <duration> from <time>December", -6.505784060128229),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.505784060128229),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.253021091632861),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhhhmm",
+                                     -5.253021091632861),
+                                    ("time-of-day (latent)this <part-of-day>", -6.505784060128229),
+                                    ("Pentecostyear (latent)", -6.505784060128229),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.253021091632861),
+                                    ("<day-of-month> (ordinal)February", -6.505784060128229),
+                                    ("Eid al-Fitryear (latent)", -5.119489699008338),
+                                    ("Vasant Panchamiin|during <named-month>|year",
+                                     -6.505784060128229),
+                                    ("Mondayin|during the <part-of-day>", -6.505784060128229),
+                                    ("Chhathin|during <named-month>|year", -6.505784060128229),
+                                    ("Diwaliin|during <named-month>|year", -6.505784060128229),
+                                    ("this <part-of-day><time-of-day> am|pm", -6.505784060128229),
+                                    ("Vaisakhiin|during <named-month>|year", -6.505784060128229),
+                                    ("Guru Ravidass Jayantiyear (latent)", -5.253021091632861),
+                                    ("Raksha Bandhanyear (latent)", -6.505784060128229),
+                                    ("daysecond", -6.100318952020064),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.100318952020064),
+                                    ("Ratha-Yatrayear (latent)", -6.505784060128229),
+                                    ("Ashurayear (latent)", -6.505784060128229),
+                                    ("Tuesdayin|during <named-month>|year", -6.505784060128229),
+                                    ("Chinese New Yearyear (latent)", -6.505784060128229),
+                                    ("tomorrowintersect", -6.505784060128229),
+                                    ("Lag BaOmeryear (latent)", -6.505784060128229),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.505784060128229),
+                                    ("Eid al-Adhayear (latent)", -4.365717896631958),
+                                    ("intersectin|during the <part-of-day>", -6.505784060128229),
+                                    ("Palm Sundayyear (latent)", -6.505784060128229),
+                                    ("Christmasat <time-of-day>", -6.505784060128229),
+                                    ("Passoveryear (latent)", -6.505784060128229),
+                                    ("Lazarus Saturdayyear (latent)", -6.505784060128229),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.100318952020064),
+                                    ("hhhmmon <day>", -5.589493328254074),
+                                    ("Yom HaShoahyear (latent)", -6.100318952020064),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -6.100318952020064),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.505784060128229),
+                                    ("Septemberyear (latent)", -6.100318952020064),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.001706663351954),
+                                    ("Halloweenyear (latent)", -6.505784060128229),
+                                    ("<ordinal> last <cycle> of <time>year (latent)",
+                                     -6.100318952020064),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.8126368795682835),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -6.505784060128229),
+                                    ("at <time-of-day>intersect", -5.589493328254074),
+                                    ("Rosh Hashanahyear (latent)", -5.8126368795682835),
+                                    ("Dhanterasyear (latent)", -6.505784060128229),
+                                    ("Tu BiShvatyear (latent)", -6.505784060128229),
+                                    ("<day-of-month> (ordinal)December", -5.8126368795682835),
+                                    ("Holiyear (latent)", -5.8126368795682835),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.505784060128229),
+                                    ("Holika Dahanyear (latent)", -5.8126368795682835),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.100318952020064),
+                                    ("dayminute", -3.121393796782454),
+                                    ("Mawlidyear (latent)", -6.505784060128229),
+                                    ("from <datetime> - <datetime> (interval)on <day>",
+                                     -6.100318952020064),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.505784060128229),
+                                    ("Jumu'atul-Widayear (latent)", -5.589493328254074),
+                                    ("minuteday", -2.756279984197857),
+                                    ("absorption of , after named dayintersect",
+                                     -5.8126368795682835),
+                                    ("intersectyear (latent)", -6.100318952020064),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.505784060128229),
+                                    ("time-of-day (latent)in|within|after <duration>",
+                                     -6.505784060128229),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.505784060128229),
+                                    ("intersecthhhmm", -6.100318952020064),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.505784060128229),
+                                    ("Boss's Dayyear (latent)", -6.100318952020064),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.505784060128229),
+                                    ("Global Youth Service Dayyear (latent)", -6.505784060128229),
+                                    ("Dhanterasin|during <named-month>|year", -6.505784060128229),
+                                    ("tonight<time-of-day> o'clock", -6.505784060128229),
+                                    ("Tisha B'Avyear (latent)", -6.505784060128229),
+                                    ("Isra and Mi'rajyear (latent)", -5.589493328254074),
+                                    ("at <time-of-day>on <day>", -4.896346147694128),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.100318952020064),
+                                    ("time-of-day (latent)<time> <part-of-day>",
+                                     -5.8126368795682835),
+                                    ("Christmasyear (latent)", -6.100318952020064),
+                                    ("Saturdayintersect", -6.505784060128229),
+                                    ("Naraka Chaturdashiyear (latent)", -6.100318952020064),
+                                    ("Thai Pongalin|during <named-month>|year", -6.505784060128229),
+                                    ("dayweek", -6.505784060128229),
+                                    ("Easter Sundayyear (latent)", -5.8126368795682835),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <day>",
+                                     -6.100318952020064),
+                                    ("weekyear", -5.407171771460119),
+                                    ("King's Dayyear (latent)", -5.001706663351954),
+                                    ("hh:mmin|during the <part-of-day>", -5.589493328254074),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -6.100318952020064),
+                                    ("first|second|third|fourth|fifth <day-of-week> of <time>year (latent)",
+                                     -5.8126368795682835),
+                                    ("Hanukkahyear (latent)", -5.8126368795682835),
+                                    ("Rama Navamiyear (latent)", -6.505784060128229),
+                                    ("February<time> <part-of-day>", -6.505784060128229),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.8126368795682835),
+                                    ("Great Lentyear (latent)", -6.505784060128229),
+                                    ("tomorrowat <time-of-day>", -5.8126368795682835),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -6.505784060128229),
+                                    ("tomorrow<part-of-day> at <time-of-day>", -6.100318952020064),
+                                    ("Ugadiyear (latent)", -5.119489699008338),
+                                    ("Vaisakhiyear (latent)", -5.8126368795682835),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\" for year",
+                                     -5.8126368795682835),
+                                    ("last <cycle> of <time>year (latent)", -5.8126368795682835),
+                                    ("at <time-of-day>tomorrow", -6.100318952020064),
+                                    ("tomorrow<time-of-day> am|pm", -6.505784060128229),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.505784060128229),
+                                    ("Diwaliyear (latent)", -6.505784060128229),
+                                    ("between <time> and <time>on <day>", -6.100318952020064),
+                                    ("Black Fridayyear (latent)", -6.100318952020064),
+                                    ("the <ordinal> last <cycle> of <time>year (latent)",
+                                     -6.505784060128229),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.505784060128229),
+                                    ("Chhathyear (latent)", -6.100318952020064),
+                                    ("Vasant Panchamiyear (latent)", -6.505784060128229),
+                                    ("Rabindra Jayantiyear (latent)", -5.253021091632861),
+                                    ("this <part-of-day>at <time-of-day>", -5.253021091632861),
+                                    ("St Patrick's Dayyear (latent)", -6.505784060128229),
+                                    ("Thursday<time> (timezone)", -6.505784060128229),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.505784060128229),
+                                    ("Pargat Diwasyear (latent)", -5.253021091632861),
+                                    ("<datetime> - <datetime> (interval)July", -6.100318952020064),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -5.8126368795682835),
+                                    ("Februaryintersect", -6.505784060128229),
+                                    ("Simchat Torahyear (latent)", -6.505784060128229),
+                                    ("minuteyear", -6.505784060128229)],
+                               n = 516},
+                   koData =
+                     ClassData{prior = -0.9507664776432105, unseen = -6.863803391452954,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursdayhhhmm", -4.665533335715182),
+                                    ("hourday", -3.5669210470470722),
+                                    ("<hour-of-day> <integer><time-of-day> am|pm",
+                                     -6.169610732491456),
+                                    ("<day-of-month> (ordinal)August", -6.169610732491456),
+                                    ("dayhour", -3.428770708566255),
+                                    ("<time> timezoneyear (latent)", -5.476463551931511),
+                                    ("<time-of-day> - <time-of-day> (interval)on <day>",
+                                     -5.253320000617301),
+                                    ("Tuesdayfrom|since|after <time>", -5.476463551931511),
+                                    ("daymonth", -3.461560531389246),
+                                    ("hourquarter", -5.253320000617301),
+                                    ("monthyear", -4.916847763996088),
+                                    ("<time-of-day> am|pmyear (latent)", -5.476463551931511),
+                                    ("Thai Pongalyear (latent)", -5.476463551931511),
+                                    ("intersecthh:mm", -6.169610732491456),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.764145624383292),
+                                    ("<day-of-month> (ordinal)Wednesday", -6.169610732491456),
+                                    ("houryear", -4.377851263263401),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -6.169610732491456),
+                                    ("<day-of-month> (ordinal)October", -6.169610732491456),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.476463551931511),
+                                    ("hournograin", -4.916847763996088),
+                                    ("<time-of-day> am|pmintersect", -4.916847763996088),
+                                    ("Octoberyear (latent)", -6.169610732491456),
+                                    ("Good Fridayyear (latent)", -5.764145624383292),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.764145624383292),
+                                    ("early morningat <time-of-day>", -6.169610732491456),
+                                    ("until <time>on <day>", -5.476463551931511),
+                                    ("part of days<time-of-day> - <time-of-day> (interval)",
+                                     -6.169610732491456),
+                                    ("time-of-day (latent)intersect", -5.476463551931511),
+                                    ("todayin <number> (implicit minutes)", -6.169610732491456),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.476463551931511),
+                                    ("this <part-of-day><time-of-day> - <time-of-day> (interval)",
+                                     -6.169610732491456),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -6.169610732491456),
+                                    ("hh:mmon <day>", -4.916847763996088),
+                                    ("hhhmmintersect", -5.764145624383292),
+                                    ("absorption of , after named dayJuly", -5.253320000617301),
+                                    ("from|since|after <time>July", -5.764145624383292),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -5.253320000617301),
+                                    ("Clean Mondayyear (latent)", -6.169610732491456),
+                                    ("monthhour", -6.169610732491456),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.764145624383292),
+                                    ("hourmonth", -4.029544568995185),
+                                    ("todayat <time-of-day>", -6.169610732491456),
+                                    ("hhhmmyear (latent)", -4.916847763996088),
+                                    ("from|since|after <time>December", -6.169610732491456),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -6.169610732491456),
+                                    ("<time-of-day> am|pmon <day>", -4.916847763996088),
+                                    ("Mondayyear (latent)", -5.476463551931511),
+                                    ("dayday", -4.029544568995185),
+                                    ("mm/ddat <time-of-day>", -5.253320000617301),
+                                    ("on <day>September", -5.476463551931511),
+                                    ("time-of-day (latent)September", -5.764145624383292),
+                                    ("hourhour", -4.09016919081162),
+                                    ("time-of-day (latent)on <day>", -4.665533335715182),
+                                    ("time-of-day (latent)<cycle> after|before <time>",
+                                     -5.764145624383292),
+                                    ("dayyear", -3.125088294768033),
+                                    ("Thursdaymm/dd", -6.169610732491456),
+                                    ("New Year's Dayyear (latent)", -5.253320000617301),
+                                    ("time-of-day (latent)Sunday", -5.764145624383292),
+                                    ("Thursdayfrom|since|after <time>", -4.46486264025303),
+                                    ("Thursdayat <time-of-day>", -4.560172820057356),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -6.169610732491456),
+                                    ("Aprilyear (latent)", -6.169610732491456),
+                                    ("the <day-of-month> (ordinal)July", -6.169610732491456),
+                                    ("the <day-of-month> (number)July", -6.169610732491456),
+                                    ("monthminute", -6.169610732491456),
+                                    ("<time-of-day> am|pmtomorrow", -5.764145624383292),
+                                    ("Thursdayhh:mm", -5.253320000617301),
+                                    ("<day-of-month> (ordinal)Tuesday", -5.764145624383292),
+                                    ("minutemonth", -4.029544568995185),
+                                    ("time-of-day (latent)Friday", -5.764145624383292),
+                                    ("minutehour", -6.169610732491456),
+                                    ("part of daysat <time-of-day>", -5.070998443823346),
+                                    ("time-of-day (latent)this|last|next <cycle>",
+                                     -3.8182354753279784),
+                                    ("Augustyear (latent)", -5.764145624383292),
+                                    ("week-endin|during <named-month>|year", -6.169610732491456),
+                                    ("time-of-day (latent)Tuesday", -5.764145624383292),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.764145624383292),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -6.169610732491456),
+                                    ("tonight<time-of-day> - <time-of-day> (interval)",
+                                     -6.169610732491456),
+                                    ("Sundayyear (latent)", -5.253320000617301),
+                                    ("hourweek", -5.253320000617301),
+                                    ("the <day-of-month> (ordinal)Monday", -5.476463551931511),
+                                    ("Christmasat <time-of-day>", -6.169610732491456),
+                                    ("from|since|after <time>year (latent)", -5.070998443823346),
+                                    ("hhhmmon <day>", -5.253320000617301),
+                                    ("yesterday<time-of-day> am|pm", -6.169610732491456),
+                                    ("<day-of-month> (ordinal)July", -5.476463551931511),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -6.169610732491456),
+                                    ("mm/ddyear (latent)", -6.169610732491456),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -6.169610732491456),
+                                    ("in|during <named-month>|yearyear (latent)",
+                                     -6.169610732491456),
+                                    ("at <time-of-day>intersect", -5.253320000617301),
+                                    ("hh:mmyear (latent)", -4.783316371371566),
+                                    ("Holiyear (latent)", -6.169610732491456),
+                                    ("until <time><time-of-day> am|pm", -6.169610732491456),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.764145624383292),
+                                    ("dayminute", -3.307409851561988),
+                                    ("yyyy-mm-ddhh:mm", -5.764145624383292),
+                                    ("intersectfrom|since|after <time>", -5.764145624383292),
+                                    ("intersectSeptember", -4.297808555589865),
+                                    ("minuteday", -3.0126103113413425),
+                                    ("absorption of , after named dayintersect",
+                                     -6.169610732491456),
+                                    ("intersectyear (latent)", -6.169610732491456),
+                                    ("Februaryin|during the <part-of-day>", -6.169610732491456),
+                                    ("<duration> after|before|from|past <time>December",
+                                     -6.169610732491456),
+                                    ("time-of-day (latent)July", -5.476463551931511),
+                                    ("Saturdayyear (latent)", -6.169610732491456),
+                                    ("hhhmmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.169610732491456),
+                                    ("<day-of-month> (ordinal)Monday", -4.916847763996088),
+                                    ("at <time-of-day>on <day>", -5.253320000617301),
+                                    ("absorption of , after named daySeptember",
+                                     -4.916847763996088),
+                                    ("Naraka Chaturdashiyear (latent)", -6.169610732491456),
+                                    ("from|since|after <time>on <day>", -5.253320000617301),
+                                    ("dayweek", -6.169610732491456),
+                                    ("Easter Sundayyear (latent)", -5.764145624383292),
+                                    ("Thursday<time-of-day> am|pm", -4.916847763996088),
+                                    ("weekyear", -5.764145624383292),
+                                    ("time-of-day (latent)Thursday", -5.764145624383292),
+                                    ("<named-month> <day-of-month> (non ordinal)until <time>",
+                                     -6.169610732491456),
+                                    ("<day-of-month> (ordinal)April", -6.169610732491456),
+                                    ("yyyy-mm-dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.764145624383292),
+                                    ("intersect by \",\", \"of\", \"from\" for yearhh:mm",
+                                     -5.476463551931511),
+                                    ("Sundayfrom|since|after <time>", -6.169610732491456),
+                                    ("absorption of , after named dayFebruary", -5.253320000617301),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -5.764145624383292),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -6.169610732491456),
+                                    ("tomorrowat <time-of-day>", -6.169610732491456),
+                                    ("daynograin", -5.764145624383292),
+                                    ("Fridayin|during <named-month>|year", -6.169610732491456),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.764145624383292),
+                                    ("last <cycle> of <time>year (latent)", -5.764145624383292),
+                                    ("tomorrow<time-of-day> am|pm", -6.169610732491456),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -5.476463551931511),
+                                    ("Diwaliyear (latent)", -5.764145624383292),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -6.169610732491456),
+                                    ("this <part-of-day>at <time-of-day>", -5.253320000617301),
+                                    ("Fridayyear (latent)", -5.253320000617301),
+                                    ("time-of-day (latent)April", -6.169610732491456),
+                                    ("minuteyear", -3.9723861551552364)],
+                               n = 325}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.18924199963852842),
+                                    ("integer (0..19)", -1.7578579175523736)],
+                               n = 27}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.3737155789130304, unseen = -4.532599493153256,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -3.4231762883809305),
+                                    ("minuteminute", -2.91235066461494),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.4231762883809305),
+                                    ("hh:mmhh:mm", -2.91235066461494),
+                                    ("dayday", -1.9568392195875037),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -3.4231762883809305),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -3.828641396489095),
+                                    ("hourhour", -3.4231762883809305),
+                                    ("minutehour", -3.4231762883809305),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.828641396489095),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.828641396489095),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -3.828641396489095)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.29191040856130207, unseen = -5.14166355650266,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.570849079588725),
+                                    ("dayhour", -3.056356895370426),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)intersect", -4.442651256490317),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.7495040759303713),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.442651256490317),
+                                    ("hh:mmtime-of-day (latent)", -3.5263605246161616),
+                                    ("hh:mm<time-of-day> am|pm", -4.037186148382152),
+                                    ("minuteminute", -3.5263605246161616),
+                                    ("<day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.5263605246161616),
+                                    ("hh:mmhh:mm", -4.442651256490317),
+                                    ("dayday", -1.916922612182061),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (number)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)intersect", -4.442651256490317),
+                                    ("hourhour", -3.1898882879949486),
+                                    ("time-of-day (latent)the <day-of-month> (ordinal)",
+                                     -4.442651256490317),
+                                    ("dayyear", -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("minutehour", -3.3440389678222067),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.442651256490317),
+                                    ("hh:mmintersect", -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -4.442651256490317),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("time-of-day (latent)the <day-of-month> (number)",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) of <named-month>",
+                                     -4.037186148382152),
+                                    ("<day-of-month> (ordinal)the <day-of-month> (number)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (ordinal)intersect", -4.037186148382152),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -4.442651256490317),
+                                    ("the <day-of-month> (number)intersect", -4.037186148382152)],
+                               n = 59}}),
+       ("Saturday",
+        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}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.845826690498331),
+                                    ("weekmonth", -1.845826690498331),
+                                    ("week (grain)October", -1.845826690498331),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.845826690498331),
+                                    ("weekday", -1.3350010667323402)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second (grain) March", -1.5040773967762742),
+                                    ("secondmonth", -1.5040773967762742)],
+                               n = 1}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.5649493574615367),
+                                    ("minuteminute", -1.8718021769015913),
+                                    ("hh:mmhh:mm", -1.8718021769015913),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.5649493574615367),
+                                    ("hourhour", -2.5649493574615367),
+                                    ("hourminute", -2.5649493574615367),
+                                    ("minutehour", -2.0541237336955462),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.9704144655697013),
+                                    ("time-of-day (latent)hh:mm", -2.9704144655697013),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.5649493574615367)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.9218125974762528),
+                                    ("hh:mm<time-of-day> am|pm", -2.6149597780361984),
+                                    ("minuteminute", -2.6149597780361984),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -1.9218125974762528),
+                                    ("hh:mmhh:mm", -3.0204248861443626),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("minutehour", -1.7676619176489945),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.0204248861443626)],
+                               n = 14}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (20..90)integer (0..19)", -0.2876820724517809)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.2231435513142097)],
+                               n = 3}}),
+       ("Global Youth Service 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}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.14701474296180966,
+                               unseen = -5.420534999272286,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.702867238791926e-2),
+                                    ("intersect 2 numbers", -4.029806041084529)],
+                               n = 221},
+                   koData =
+                     ClassData{prior = -1.9898293829901488,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.5841201044498106),
+                                    ("negative numbers", -0.40546510810816444),
+                                    ("compose by multiplication", -2.277267285009756)],
+                               n = 35}}),
+       ("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}}),
+       ("<time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.833213344056216),
+                                    ("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -2.1400661634962708),
+                                    ("dayday", -1.4469189829363254),
+                                    ("hourminute", -1.916922612182061),
+                                    ("hhhmm<integer> <unit-of-duration>", -2.833213344056216),
+                                    ("intersect<integer> <unit-of-duration>", -2.1400661634962708),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -2.4277482359480516),
+                                    ("from|since|after <time><integer> <unit-of-duration>",
+                                     -2.1400661634962708)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.540445040947149),
+                                    ("December<integer> <unit-of-duration>", -1.540445040947149)],
+                               n = 2}}),
+       ("hhhmm",
+        Classifier{okData =
+                     ClassData{prior = -2.150620522096362e-2,
+                               unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
+                   koData =
+                     ClassData{prior = -3.8501476017100584,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("as soon as possible",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mahavir Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.21357410029805904,
+                               unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
+                   koData =
+                     ClassData{prior = -1.6486586255873816,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dayananda Saraswati Jayanti",
+        Classifier{okData =
+                     ClassData{prior = 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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        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}}),
+       ("first|second|third|fourth|fifth <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8649974374866046),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdaythis|last|next <cycle>",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.9444389791664407),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -2.538973871058276),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.538973871058276),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6916760106710724),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.538973871058276)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -2.5649493574615367),
+                                    ("time-of-day (latent)integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer 21..99", -2.159484249353372),
+                                    ("hour", -0.8602012652231115),
+                                    ("at <time-of-day>integer (numeric)", -2.159484249353372),
+                                    ("time-of-day (latent)integer (20..90)", -1.8718021769015913)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("time-of-day (latent)integer (20..90)", -1.3862943611198906)],
+                               n = 1}}),
+       ("Rama Navami",
+        Classifier{okData =
+                     ClassData{prior = 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.2876820724517809, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.5257286443082556),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -2.120263536200091),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mondaythis|last|next <cycle>",
+                                     -1.6094379124341003),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -2.120263536200091)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.8718021769015913),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.466337068793427)],
+                               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.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("half a <time-grain>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("King's Day",
+        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}}),
+       ("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}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) of <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.9810014688665833),
+                                    ("integer (numeric)integer (numeric)July", -1.9810014688665833),
+                                    ("integer (numeric)ordinal (digits)July", -1.9810014688665833),
+                                    ("ordinal (digits)integer (numeric)July", -1.9810014688665833),
+                                    ("month", -0.8023464725249373)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.546237407675729e-2,
+                               unseen = -4.477336814478207,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 86},
+                   koData =
+                     ClassData{prior = -3.1135153092103742, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.4849066497880004),
+                                    ("part of daysintersect", -2.4849066497880004),
+                                    ("hourday", -0.9808292530117262),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.4849066497880004),
+                                    ("part of daysthis <time>", -2.4849066497880004),
+                                    ("part of daysthe <day-of-month> (ordinal or number) of <named-month>",
+                                     -2.4849066497880004),
+                                    ("part of daysChristmas", -2.0794415416798357)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time> for <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayday", -1.2992829841302609),
+                                    ("hourminute", -1.7047480922384253),
+                                    ("intersect<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("<day-of-month> (ordinal or number) <named-month><integer> <unit-of-duration>",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("one twenty two", -1.0986122886681098),
+                                    ("one eleven", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <day-of-week> from <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Fridaynow", -2.2512917986064953),
+                                    ("integer (0..19)Tuesdaynow", -2.2512917986064953),
+                                    ("integer (0..19)Sundaynow", -2.2512917986064953),
+                                    ("integer (0..19)Fridaynow", -2.2512917986064953),
+                                    ("daynograin", -0.9985288301111273),
+                                    ("integer (numeric)Sundaynow", -2.2512917986064953),
+                                    ("integer (numeric)Tuesdaynow", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7339691750802004,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.740840023925201),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.6422277352570913),
+                                    ("ordinal (digits)February", -2.740840023925201),
+                                    ("integer (numeric)February", -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("ordinal (digits)March", -2.3353749158170367),
+                                    ("integer (numeric)July", -2.740840023925201)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.6539264674066639,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.550597412411167),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("month", -0.8574502318512216),
+                                    ("integer (numeric)July", -1.550597412411167)],
+                               n = 13}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> minutes to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("minutehour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rabindra Jayanti",
+        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}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pargat Diwas",
+        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}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.740840023925201),
+                                    ("hour", -0.7259370033829361),
+                                    ("part of days", -0.7949298748698876)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("St Patrick'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}}),
+       ("tomorrow",
+        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}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0116009116784799),
+                                    ("hh:mm", -1.9924301646902063), ("hour", -1.0116009116784799),
+                                    ("minute", -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.4166384087062897, unseen = -5.25227342804663,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2580400255962119),
+                                    ("month (grain)", -2.356652314264321),
+                                    ("year (grain)", -2.474435349920705),
+                                    ("week (grain)", -1.2580400255962119),
+                                    ("quarter", -3.6375861597263857), ("year", -2.474435349920705),
+                                    ("month", -2.356652314264321),
+                                    ("quarter (grain)", -3.6375861597263857)],
+                               n = 89},
+                   koData =
+                     ClassData{prior = -1.0766333819493346, unseen = -4.653960350157523,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8111775550851565),
+                                    ("month (grain)", -2.4471663218051534),
+                                    ("year (grain)", -3.0349529867072724),
+                                    ("second", -3.0349529867072724),
+                                    ("week (grain)", -1.8111775550851565),
+                                    ("day", -2.2464956263430023), ("quarter", -3.0349529867072724),
+                                    ("year", -3.0349529867072724),
+                                    ("second (grain) ", -3.0349529867072724),
+                                    ("month", -2.4471663218051534),
+                                    ("quarter (grain)", -3.0349529867072724),
+                                    ("day (grain)", -2.2464956263430023)],
+                               n = 46}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ratha-Yatra",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.4818380868927383,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.5260563034950494),
+                                    ("ordinal (digits)", -0.24512245803298496)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.9614111671546247, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.6286086594223742),
+                                    ("ordinal (digits)", -0.7621400520468967)],
+                               n = 13}}),
+       ("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.8649974374866046,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.5465437063680699,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21}}),
+       ("Guru Ravidass Jayanti",
+        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.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}}),
+       ("Chinese New Year",
+        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}}),
+       ("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 = -7.696104113612832e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -2.6026896854443837,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("Orthodox Good Friday",
+        Classifier{okData =
+                     ClassData{prior = 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.7126409752409464, unseen = -4.867534450455582,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.763846956391606e-2),
+                                    ("integer (0..19)", -2.374905754573672)],
+                               n = 127},
+                   koData =
+                     ClassData{prior = -0.6740261391131669, unseen = -4.90527477843843,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.15290767158766128),
+                                    ("integer (0..19)", -1.9534008207844709)],
+                               n = 132}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -2.0149030205422647),
+                                    ("MondayMarch", -2.0149030205422647),
+                                    ("FridayOctober", -1.6094379124341003),
+                                    ("Sundayintersect", -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6031989438970057, unseen = -5.356586274672012,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.712800803860808),
+                                    ("integer (0..19)year (grain)", -3.2724165917962305),
+                                    ("integer (numeric)day (grain)", -2.712800803860808),
+                                    ("integer (0..19)second (grain) ", -3.965563772356176),
+                                    ("integer (0..19)hour (grain)", -3.154633556139847),
+                                    ("second", -3.5600986642480117),
+                                    ("integer (numeric)second (grain) ", -4.253245844807957),
+                                    ("integer (numeric)year (grain)", -3.154633556139847),
+                                    ("day", -2.4614863755799017), ("year", -2.579269411236285),
+                                    ("integer (numeric)week (grain)", -3.2724165917962305),
+                                    ("integer (0..19)month (grain)", -3.742420221041966),
+                                    ("integer (20..90)minute (grain)", -4.658710952916121),
+                                    ("hour", -2.78690877601453), ("month", -3.0492730404820207),
+                                    ("integer (numeric)minute (grain)", -2.6438079323738566),
+                                    ("integer (0..19)minute (grain)", -3.2724165917962305),
+                                    ("integer (numeric)month (grain)", -3.5600986642480117),
+                                    ("minute", -2.216363917546917),
+                                    ("integer (numeric)hour (grain)", -3.742420221041966),
+                                    ("integer (0..19)day (grain)", -3.742420221041966),
+                                    ("integer (0..19)week (grain)", -3.405947984420753)],
+                               n = 93},
+                   koData =
+                     ClassData{prior = -0.7919930151965779, unseen = -5.19295685089021,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.577947893406655),
+                                    ("integer (0..19)year (grain)", -4.088773517172645),
+                                    ("integer (numeric)day (grain)", -4.088773517172645),
+                                    ("integer (numeric)quarter (grain)", -4.088773517172645),
+                                    ("integer (numeric)year (grain)", -4.088773517172645),
+                                    ("day", -3.577947893406655), ("quarter", -3.577947893406655),
+                                    ("year", -3.577947893406655),
+                                    ("integer (numeric)week (grain)", -4.088773517172645),
+                                    ("integer (0..19)month (grain)", -4.088773517172645),
+                                    ("hour", -1.1443345380062049), ("month", -3.577947893406655),
+                                    ("integer (numeric)minute (grain)", -4.4942386252808095),
+                                    ("integer (numeric)month (grain)", -4.088773517172645),
+                                    ("minute", -4.4942386252808095),
+                                    ("integer (numeric)hour (grain)", -1.1443345380062049),
+                                    ("integer (0..19)day (grain)", -4.088773517172645),
+                                    ("integer (0..19)week (grain)", -4.088773517172645),
+                                    ("integer (0..19)quarter (grain)", -4.088773517172645)],
+                               n = 77}}),
+       ("from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.3217558399823195),
+                                    ("integer (numeric)integer (numeric)July", -1.3217558399823195),
+                                    ("month", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guru Gobind Singh Jayanti",
+        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}}),
+       ("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}}),
+       ("Krishna Janmashtami",
+        Classifier{okData =
+                     ClassData{prior = 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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2607262624632527, unseen = -5.71042701737487,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>", -3.7612001156935624),
+                                    ("integer after|past <hour-of-day>", -4.3208159036289855),
+                                    ("at <time-of-day>", -2.374905754573672),
+                                    ("<time-of-day> o'clock", -4.608497976080766),
+                                    ("half after|past <hour-of-day>", -4.608497976080766),
+                                    ("second", -5.01396308418893), ("hh:mm:ss", -5.01396308418893),
+                                    ("<hour-of-day> <integer>", -4.097672352314775),
+                                    ("<integer> minutes to|till|before <hour-of-day>",
+                                     -5.01396308418893),
+                                    ("time-of-day (latent)", -1.6997770795164049),
+                                    ("hhmm (latent)", -5.01396308418893),
+                                    ("hh:mm", -2.374905754573672),
+                                    ("quarter after|past <hour-of-day>", -3.5098856874126563),
+                                    ("until <time>", -4.3208159036289855),
+                                    ("about|exactly <time-of-day>", -5.01396308418893),
+                                    ("hour", -1.252762968495368),
+                                    ("<time-of-day> sharp|exactly", -5.01396308418893),
+                                    ("minute", -1.6817585740137264)],
+                               n = 141},
+                   koData =
+                     ClassData{prior = -1.4718165345580525,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.248434627109745),
+                                    ("from|since|after <time>", -3.248434627109745),
+                                    ("at <time-of-day>", -3.536116699561526),
+                                    ("time-of-day (latent)", -1.1689930854299093),
+                                    ("hh:mm", -3.536116699561526),
+                                    ("until <time>", -3.9415818076696905),
+                                    ("hour", -1.0238110755854113), ("minute", -2.6888188391743224)],
+                               n = 42}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <day>",
+        Classifier{okData =
+                     ClassData{prior = -0.21511137961694557, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.8803128665695), ("mm/dd", -3.3843902633457743),
+                                    ("absorption of , after named day", -2.691243082785829),
+                                    ("intersect", -2.691243082785829),
+                                    ("Saturday", -2.691243082785829),
+                                    ("Friday", -2.9789251552376097), ("day", -0.8194409058842375),
+                                    ("the <day-of-month> (ordinal)", -2.9789251552376097),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.691243082785829)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.6422277352570913,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.6582280766035324),
+                                    ("day", -1.0986122886681098),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.6582280766035324)],
+                               n = 6}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thanksgiving Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.9694005571881036,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1972245773362196),
+                                    ("year (grain)", -2.1972245773362196),
+                                    ("second", -2.890371757896165),
+                                    ("week (grain)", -2.1972245773362196),
+                                    ("day", -2.1972245773362196),
+                                    ("minute (grain)", -2.890371757896165),
+                                    ("year", -2.1972245773362196),
+                                    ("second (grain) ", -2.890371757896165),
+                                    ("minute", -2.890371757896165),
+                                    ("day (grain)", -2.1972245773362196)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.4769240720903093,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -2.3025850929940455),
+                                    ("quarter", -1.3470736479666092),
+                                    ("minute (grain)", -2.8134107167600364),
+                                    ("hour", -2.3025850929940455),
+                                    ("quarter (grain)", -1.3470736479666092),
+                                    ("minute", -2.8134107167600364)],
+                               n = 18}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.2237754316221157),
+                                    ("this|last|next <cycle>", -1.4469189829363254),
+                                    ("year", -0.7537718023763802)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.916290731874155),
+                                    ("year", -0.916290731874155)],
+                               n = 1}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.276666119016055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 70},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("upcoming <integer> <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Rosh Hashanah",
+        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> <named-day> ago|back",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Thursday", -0.6931471805599453),
+                                    ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> upcoming <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -2.908720896564361),
+                                    ("integer (numeric)day (grain)", -2.908720896564361),
+                                    ("integer (numeric)quarter (grain)", -2.908720896564361),
+                                    ("integer (numeric)year (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("integer (numeric)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)month (grain)", -2.908720896564361),
+                                    ("month", -2.3978952727983707),
+                                    ("integer (numeric)month (grain)", -2.908720896564361),
+                                    ("integer (0..19)day (grain)", -2.908720896564361),
+                                    ("integer (0..19)week (grain)", -2.908720896564361),
+                                    ("integer (0..19)quarter (grain)", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = -0.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}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -3.077165866675366e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 32},
+                   koData =
+                     ClassData{prior = -3.4965075614664802,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from|past <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7932306391169278, unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration>hhhmm", -3.4965075614664802),
+                                    ("a <unit-of-duration>Christmas", -3.4965075614664802),
+                                    ("minuteminute", -3.4965075614664802),
+                                    ("dayday", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration>today", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.3978952727983707),
+                                    ("minutehour", -1.791759469228055),
+                                    ("daysecond", -3.4965075614664802),
+                                    ("a <unit-of-duration>right now", -3.4965075614664802),
+                                    ("minutenograin", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration>Christmas", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -3.4965075614664802),
+                                    ("secondnograin", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration><time-of-day> am|pm",
+                                     -2.580216829592325),
+                                    ("yearday", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.4965075614664802),
+                                    ("daynograin", -3.4965075614664802),
+                                    ("<integer> <unit-of-duration>now", -3.0910424533583156)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.6021754023542185, unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterhour", -1.3596261140377293),
+                                    ("dayhour", -3.6109179126442243),
+                                    ("<integer> <unit-of-duration>intersect", -3.6109179126442243),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -3.6109179126442243),
+                                    ("monthnograin", -3.6109179126442243),
+                                    ("a <unit-of-duration><time-of-day> am|pm", -2.10684051586795),
+                                    ("a <unit-of-duration>time-of-day (latent)", -2.10684051586795),
+                                    ("dayday", -2.917770732084279),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -3.6109179126442243),
+                                    ("a <unit-of-duration>noon|midnight|EOD|end of day",
+                                     -3.20545280453606),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -3.6109179126442243),
+                                    ("<integer> <unit-of-duration>now", -3.6109179126442243)],
+                               n = 23}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -2.03688192726104),
+                                    ("time-of-day (latent)", -0.9382696385929302),
+                                    ("hour", -0.7375989431307791)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm",
+        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}}),
+       ("until <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -2.159484249353372),
+                                    ("time-of-day (latent)", -2.5649493574615367),
+                                    ("year", -2.159484249353372),
+                                    ("<time-of-day> am|pm", -1.8718021769015913),
+                                    ("hh:mm", -2.159484249353372), ("hour", -2.159484249353372),
+                                    ("minute", -1.6486586255873816)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.3025850929940455),
+                                    ("yesterday", -2.8134107167600364),
+                                    ("day", -2.8134107167600364),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("<time-of-day> am|pm", -3.2188758248682006),
+                                    ("hh:mm", -2.3025850929940455), ("hour", -1.4271163556401458),
+                                    ("minute", -1.8325814637483102)],
+                               n = 20}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.3025850929940455),
+                                    ("monthyear", -1.8971199848858813),
+                                    ("Marcha <unit-of-duration>", -2.3025850929940455),
+                                    ("March<integer> <unit-of-duration>", -2.3025850929940455),
+                                    ("Thanksgiving Daya <unit-of-duration>", -2.3025850929940455),
+                                    ("Thanksgiving Day<integer> <unit-of-duration>",
+                                     -1.8971199848858813),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -2.3025850929940455),
+                                    ("dayyear", -1.6094379124341003)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.5540343780972276, unseen = -5.420534999272286,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectthis|last|next <cycle>", -4.722953221644475),
+                                    ("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.722953221644475),
+                                    ("dayhour", -4.31748811353631),
+                                    ("daymonth", -2.0149030205422647),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.722953221644475),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.4701902531491067),
+                                    ("Wednesdayintersect", -4.722953221644475),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.3366588605245844),
+                                    ("Black Fridaythis|last|next <cycle>", -4.722953221644475),
+                                    ("<part-of-day> of <time>February", -4.722953221644475),
+                                    ("Saturday<time-of-day> am|pm", -4.722953221644475),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -4.31748811353631),
+                                    ("hourmonth", -4.722953221644475),
+                                    ("Fridayintersect by \",\", \"of\", \"from\" for year",
+                                     -4.029806041084529),
+                                    ("dayday", -2.4716614230379794),
+                                    ("the <day-of-month> (ordinal)February", -4.31748811353631),
+                                    ("WednesdayOctober", -4.722953221644475),
+                                    ("Wednesdaythis|last|next <cycle>", -4.31748811353631),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.4701902531491067),
+                                    ("dayyear", -3.8066624897703196),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.722953221644475),
+                                    ("Thursdayhh:mm", -4.31748811353631),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.722953221644475),
+                                    ("TuesdayOctober", -4.722953221644475),
+                                    ("the <day-of-month> (ordinal)March", -3.624340932976365),
+                                    ("Mondaythis|last|next <cycle>", -3.8066624897703196),
+                                    ("Fridayintersect", -4.029806041084529),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -4.31748811353631),
+                                    ("intersectOctober", -4.31748811353631),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.8066624897703196),
+                                    ("Tuesdaythis|last|next <cycle>", -4.31748811353631),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.722953221644475),
+                                    ("dayminute", -2.9311937524164198),
+                                    ("minuteday", -3.4701902531491067),
+                                    ("this|last|next <cycle>Sunday", -4.722953221644475),
+                                    ("Sundaythis|last|next <cycle>", -4.722953221644475),
+                                    ("on <day><time-of-day> am|pm", -4.722953221644475),
+                                    ("intersectintersect", -4.722953221644475),
+                                    ("weekday", -4.722953221644475),
+                                    ("dayweek", -3.624340932976365),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.31748811353631),
+                                    ("<datetime> - <datetime> (interval)July", -3.8066624897703196),
+                                    ("on <day><named-month> <day-of-month> (non ordinal)",
+                                     -4.029806041084529)],
+                               n = 77},
+                   koData =
+                     ClassData{prior = -0.8547885321163612, unseen = -5.225746673713201,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.527208644518379),
+                                    ("week-endOctober", -3.834061463958434),
+                                    ("daymonth", -1.7863686205931786),
+                                    ("TuesdaySeptember", -4.527208644518379),
+                                    ("Wednesdayintersect", -4.527208644518379),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -3.42859635585027),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -4.527208644518379),
+                                    ("hournograin", -4.121743536410215),
+                                    ("from|since|after <time>July", -4.121743536410215),
+                                    ("hourmonth", -2.581298495463066),
+                                    ("Fridaythis|last|next <cycle>", -4.527208644518379),
+                                    ("SundayFebruary", -4.527208644518379),
+                                    ("on <day>September", -3.834061463958434),
+                                    ("WednesdayOctober", -4.527208644518379),
+                                    ("intersectnow", -4.121743536410215),
+                                    ("week-endintersect", -4.527208644518379),
+                                    ("dayyear", -4.527208644518379),
+                                    ("FridayJuly", -3.6109179126442243),
+                                    ("FridaySeptember", -4.121743536410215),
+                                    ("the <day-of-month> (ordinal)July", -3.6109179126442243),
+                                    ("WednesdayFebruary", -4.527208644518379),
+                                    ("minutemonth", -3.0231312477421053),
+                                    ("Mondaythis|last|next <cycle>", -4.527208644518379),
+                                    ("SundayMarch", -4.527208644518379),
+                                    ("MondayFebruary", -4.121743536410215),
+                                    ("Fridayintersect", -4.527208644518379),
+                                    ("intersectOctober", -4.527208644518379),
+                                    ("dayminute", -4.527208644518379),
+                                    ("SaturdaySeptember", -4.527208644518379),
+                                    ("intersectSeptember", -3.1409142833984887),
+                                    ("Tuesdaynow", -4.121743536410215),
+                                    ("MondayMarch", -4.527208644518379),
+                                    ("FridayOctober", -4.527208644518379),
+                                    ("daynograin", -4.121743536410215),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -4.527208644518379),
+                                    ("Tuesdayintersect", -4.527208644518379),
+                                    ("<time-of-day> - <time-of-day> (interval)July",
+                                     -4.527208644518379),
+                                    ("<datetime> - <datetime> (interval)July", -4.527208644518379),
+                                    ("Sundayintersect", -4.527208644518379)],
+                               n = 57}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.6741486494265287),
+                                    ("day", -1.1700712526502546), ("Sunday", -2.6741486494265287),
+                                    ("Chinese New Year", -1.9810014688665833),
+                                    ("Thanksgiving Day", -2.6741486494265287),
+                                    ("Easter Sunday", -2.6741486494265287),
+                                    ("hour", -2.6741486494265287), ("Tuesday", -2.6741486494265287),
+                                    ("week-end", -2.6741486494265287)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.6741486494265287), ("Friday", -2.268683541318364),
+                                    ("day", -1.7578579175523736), ("Sunday", -2.6741486494265287),
+                                    ("hour", -1.575536360758419), ("week-end", -1.575536360758419)],
+                               n = 9}}),
+       ("March",
+        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}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0149030205422647),
+                                    ("Thursdayordinal (digits)", -2.70805020110221),
+                                    ("day", -2.3025850929940455),
+                                    ("Augustordinal (digits)", -2.70805020110221),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.3025850929940455),
+                                    ("Tuesdayordinal (digits)", -2.70805020110221),
+                                    ("Octoberordinals (first..twentieth,thirtieth,...)",
+                                     -2.70805020110221),
+                                    ("month", -1.2039728043259361),
+                                    ("Marchordinal (digits)", -2.70805020110221)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>ordinal (digits)",
+                                     -1.9459101490553135),
+                                    ("Augustordinal (digits)", -1.9459101490553135),
+                                    ("month", -1.540445040947149)],
+                               n = 2}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6061358035703156, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.3862943611198906),
+                                    ("ordinal (digits)", -0.2876820724517809)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.5306282510621704),
+                                    ("ordinal (digits)", -0.8873031950009028)],
+                               n = 15}}),
+       ("<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}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval) timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.8109302162163288),
+                                    ("hh:mmhh:mm", -1.5040773967762742),
+                                    ("hhhmmhhhmm", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm.dd.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -0.5679840376059393, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -3.068052935133617),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -1.9694406464655074),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.374905754573672),
+                                    ("integer (numeric)this|last|next <cycle>", -2.662587827025453),
+                                    ("ordinal (digits)February", -3.068052935133617),
+                                    ("integer (numeric)February", -2.662587827025453),
+                                    ("month", -0.8708283577973976),
+                                    ("ordinal (digits)March", -2.662587827025453),
+                                    ("integer (numeric)July", -3.068052935133617)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.8362480242006186, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.6094379124341003),
+                                    ("ordinal (digits)February", -2.8622008809294686),
+                                    ("month", -0.916290731874155),
+                                    ("integer (numeric)July", -1.6094379124341003)],
+                               n = 13}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<day-of-month>(ordinal or number)/<named-month>/year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -1.252762968495368),
+                                    ("month", -0.8472978603872037),
+                                    ("integer (numeric)October", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyyqq",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.1670540846631662,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.1102132003465894),
+                                    ("Halloween", -2.803360380906535),
+                                    ("Boss's Day", -2.803360380906535),
+                                    ("Monday", -2.3978952727983707), ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -2.803360380906535),
+                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
+                                    ("Tuesday", -2.3978952727983707)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.8718021769015913, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.0149030205422647),
+                                    ("Saturday", -2.0149030205422647),
+                                    ("day", -1.6094379124341003)],
+                               n = 2}}),
+       ("<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}}),
+       ("the <ordinal> closest <day> to <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)Christmastoday",
+                                     -1.791759469228055),
+                                    ("dayday", -1.0986122886681098),
+                                    ("ordinal (digits)Christmastoday", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("ordinals (first..twentieth,thirtieth,...)MondayOctober",
+                                     -1.3862943611198906)],
+                               n = 1}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.652001563489282e-2),
+                                    ("integer (0..19)", -3.0910424533583156)],
+                               n = 42}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half a <time-grain>", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Purim",
+        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> 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 = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.8109302162163288),
+                                    ("year", -1.5040773967762742), ("month", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour (abbrev).",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               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 = -1.1631508098056809, unseen = -4.770684624465665,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.6635616461296463),
+                                    ("from|since|after <time>hh:mm", -3.152736022363656),
+                                    ("minuteminute", -1.5841201044498106),
+                                    ("<time> timezone<time> timezone", -3.3758795736778655),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal)",
+                                     -3.6635616461296463),
+                                    ("hh:mmhh:mm", -2.5649493574615367),
+                                    ("dayday", -2.5649493574615367),
+                                    ("hhhmmhhhmm", -3.152736022363656),
+                                    ("hourhour", -3.6635616461296463),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.6635616461296463),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.6635616461296463),
+                                    ("<time-of-day> am|pmhh:mm:ss", -4.069026754237811),
+                                    ("hoursecond", -3.6635616461296463),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -3.3758795736778655),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -3.152736022363656)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -0.3746934494414107, unseen = -5.308267697401205,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.204692619390966),
+                                    ("<time> timezonehhhmm", -4.204692619390966),
+                                    ("hourday", -3.00071981506503),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -4.61015772749913),
+                                    ("dayhour", -4.61015772749913),
+                                    ("daymonth", -3.6938669956249752),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <month>",
+                                     -3.6938669956249752),
+                                    ("<time-of-day> am|pmintersect", -4.61015772749913),
+                                    ("MondayOctober", -4.204692619390966),
+                                    ("from|since|after <time>hh:mm", -4.61015772749913),
+                                    ("hh:mm<time-of-day> am|pm", -3.5115454388310208),
+                                    ("hhhmmintersect", -4.61015772749913),
+                                    ("minuteminute", -2.167810692129926),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.917010546939185),
+                                    ("hh:mmhh:mm", -3.917010546939185),
+                                    ("dayday", -1.8067973465925955),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) <named-month>",
+                                     -3.6938669956249752),
+                                    ("hhhmmhhhmm", -4.204692619390966),
+                                    ("hourhour", -3.6938669956249752),
+                                    ("hourminute", -4.61015772749913),
+                                    ("minutehour", -3.6938669956249752),
+                                    ("<time> timezonehh:mm", -4.61015772749913),
+                                    ("hh:mm<time> timezone", -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.61015772749913),
+                                    ("from|since|after <time><day-of-month> (ordinal or number) of <named-month>",
+                                     -3.6938669956249752),
+                                    ("hh:mmintersect", -3.6938669956249752),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -4.61015772749913),
+                                    ("Christmastoday", -3.917010546939185),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.61015772749913),
+                                    ("from|since|after <time>intersect", -3.1060803307228566),
+                                    ("from|since|after <time>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -3.6938669956249752),
+                                    ("Monday<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.204692619390966),
+                                    ("<time-of-day> am|pmhh:mm", -4.61015772749913),
+                                    ("from|since|after <time>the <day-of-month> (ordinal or number) of <named-month>",
+                                     -3.1060803307228566),
+                                    ("the <day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -4.61015772749913),
+                                    ("from|since|after <time>the <day-of-month> (ordinal)",
+                                     -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)the <day-of-month> (ordinal or number) of <named-month>",
+                                     -4.204692619390966),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.61015772749913),
+                                    ("the <day-of-month> (ordinal)intersect", -4.204692619390966)],
+                               n = 77}}),
+       ("Tuesday",
+        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}}),
+       ("New Year's Day",
+        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}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.1340142157190256, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>hh:mm", -3.0633909220278057),
+                                    ("hh:mmtime-of-day (latent)", -3.2865344733420154),
+                                    ("minuteminute", -1.6770965609079151),
+                                    ("<time> timezone<time> timezone", -3.2865344733420154),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.979681653901961),
+                                    ("hh:mmhh:mm", -2.4756042571256867),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("hhhmmhhhmm", -3.0633909220278057),
+                                    ("hourhour", -2.4756042571256867),
+                                    ("minutehour", -2.4756042571256867),
+                                    ("<time-of-day> am|pmhh:mm:ss", -3.979681653901961),
+                                    ("hhhmmtime-of-day (latent)", -3.2865344733420154),
+                                    ("hoursecond", -3.5742165457937967),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.2865344733420154),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -3.0633909220278057)],
+                               n = 37},
+                   koData =
+                     ClassData{prior = -0.38822330167365837,
+                               unseen = -5.247024072160486,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hhhmm<time> timezone", -4.143134726391533),
+                                    ("<time> timezonehhhmm", -4.143134726391533),
+                                    ("about|exactly <time-of-day>time-of-day (latent)",
+                                     -4.548599834499697),
+                                    ("until <time>time-of-day (latent)", -3.295836866004329),
+                                    ("from|since|after <time>hh:mm", -4.548599834499697),
+                                    ("hh:mmtime-of-day (latent)", -2.5336968139574325),
+                                    ("hh:mm<time-of-day> am|pm", -3.295836866004329),
+                                    ("minuteminute", -2.469158292819861),
+                                    ("from|since|after <time><time-of-day> am|pm",
+                                     -3.632309102625542),
+                                    ("hh:mmhh:mm", -3.855452653939752),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -4.143134726391533),
+                                    ("hhhmmhhhmm", -4.143134726391533),
+                                    ("at <time-of-day><time-of-day> am|pm", -4.548599834499697),
+                                    ("hourhour", -1.9836504770381604),
+                                    ("from|since|after <time><integer> to|till|before <hour-of-day>",
+                                     -3.855452653939752),
+                                    ("hourminute", -3.4499875458315876),
+                                    ("minutehour", -1.715386490443481),
+                                    ("<time> timezonehh:mm", -4.548599834499697),
+                                    ("hh:mm<time> timezone", -4.548599834499697),
+                                    ("hhhmmtime-of-day (latent)", -3.855452653939752),
+                                    ("until <time><time-of-day> am|pm", -4.143134726391533),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<time-of-day> am|pmhh:mm", -4.548599834499697),
+                                    ("<part-of-day> at <time-of-day>time-of-day (latent)",
+                                     -3.855452653939752),
+                                    ("from|since|after <time>time-of-day (latent)",
+                                     -3.044522437723423),
+                                    ("at <time-of-day>time-of-day (latent)", -3.632309102625542),
+                                    ("<time> timezonetime-of-day (latent)", -3.855452653939752),
+                                    ("<integer> to|till|before <hour-of-day><time-of-day> am|pm",
+                                     -4.548599834499697),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.855452653939752)],
+                               n = 78}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("Ugadi",
+        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}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.3646431135879093, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.691243082785829),
+                                    ("Marchinteger (numeric)", -2.9789251552376097),
+                                    ("Aprilinteger (numeric)", -3.3843902633457743),
+                                    ("month", -0.8194409058842375),
+                                    ("Februaryinteger (numeric)", -2.1316272948504063),
+                                    ("Septemberinteger (numeric)", -2.691243082785829),
+                                    ("Octoberinteger (numeric)", -2.691243082785829),
+                                    ("Julyinteger (numeric)", -1.9980959022258835)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.1856236656577395,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.3978952727983707),
+                                    ("Wednesday", -2.3978952727983707),
+                                    ("Saturday", -2.3978952727983707),
+                                    ("Monday", -1.7047480922384253), ("day", -0.8938178760220964),
+                                    ("Tuesday", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.1588830833596715,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 62},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9924301646902063),
+                                    ("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.9924301646902063),
+                                    ("week (grain)intersect", -2.3978952727983707),
+                                    ("week (grain)September", -2.3978952727983707)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2335922215070942),
+                                    ("day (grain)May", -2.2335922215070942),
+                                    ("week (grain)year (latent)", -1.9459101490553135),
+                                    ("weekmonth", -1.7227665977411035),
+                                    ("week (grain)October", -2.2335922215070942),
+                                    ("weekyear", -1.9459101490553135),
+                                    ("week (grain)intersect", -2.2335922215070942)],
+                               n = 9}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -1.252762968495368),
+                                    ("ordinal (digits)April", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("daymonth", -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)May", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinal (digits)week (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("weekyear", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vaisakhi",
+        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.3364722366212129, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>intersect", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.2512917986064953),
+                                    ("<integer> + '\"from|since|after <time>", -2.2512917986064953),
+                                    ("dayday", -1.55814461804655),
+                                    ("minutehour", -1.845826690498331),
+                                    ("<integer> + '\"<time-of-day> am|pm", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.2512917986064953)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.8718021769015913),
+                                    ("<integer> + '\"from|since|after <time>", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.8718021769015913),
+                                    ("minutehour", -1.8718021769015913)],
+                               n = 2}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.791759469228055),
+                                    ("hh:mmhh:mm", -2.1972245773362196),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hhhmmhhhmm", -2.1972245773362196),
+                                    ("minutehour", -1.791759469228055),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.1972245773362196)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -2.1972245773362196),
+                                    ("hhhmmintersect", -2.1972245773362196),
+                                    ("minuteminute", -1.791759469228055),
+                                    ("minutehour", -1.791759469228055),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("hhhmmtime-of-day (latent)", -2.1972245773362196)],
+                               n = 4}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("from|since|after <time>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\" for year",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Black Fridaythis|last|next <cycle>", -2.890371757896165),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -2.4849066497880004),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -2.1972245773362196),
+                                    ("dayyear", -0.8754687373538999),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -2.890371757896165),
+                                    ("intersectyear (latent)", -2.1972245773362196),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -1.9740810260220096)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Fridaythis|last|next <cycle>", -1.6094379124341003),
+                                    ("dayyear", -1.6094379124341003)],
+                               n = 1}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -4.1672696400568074e-2,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
+                   koData =
+                     ClassData{prior = -3.1986731175506815,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime>/<datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("secondsecond", -0.916290731874155),
+                                    ("intersectintersect", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm:ssintersect", -0.916290731874155),
+                                    ("secondsecond", -0.916290731874155)],
+                               n = 1}}),
+       ("Mid-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}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)July", -1.9924301646902063),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.3978952727983707),
+                                    ("integer (numeric)integer (numeric)July", -1.9924301646902063),
+                                    ("month", -0.8938178760220964),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shushan Purim",
+        Classifier{okData =
+                     ClassData{prior = 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 =
diff --git a/Duckling/Ranking/Classifiers/ES_XX.hs b/Duckling/Ranking/Classifiers/ES_XX.hs
--- a/Duckling/Ranking/Classifiers/ES_XX.hs
+++ b/Duckling/Ranking/Classifiers/ES_XX.hs
@@ -48,11 +48,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.5839478885949533, unseen = -4.0943445622221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
+                     ClassData{prior = -0.5930637220029626, unseen = -4.174387269895637,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 63},
                    koData =
-                     ClassData{prior = -0.8157495026522777, unseen = -3.871201010907891,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 46}}),
+                     ClassData{prior = -0.8043728156701697, unseen = -3.970291913552122,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 51}}),
        ("the day before yesterday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -81,11 +81,13 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Abril",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("dd[/-]mm",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -95,64 +97,63 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by `de`",
         Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -4.859812404361672,
+                     ClassData{prior = -0.1416505170630268, unseen = -4.875197323201151,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Miercoleseste|en un <cycle>", -4.1588830833596715),
+                                   [("Miercoleseste|en un <cycle>", -4.174387269895637),
+                                    ("<day-of-month> de <named-month>year (value by adding three composing numbers together)",
+                                     -4.174387269895637),
                                     ("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),
+                                     -3.7689221617874726),
+                                    ("daymonth", -1.8230120127321594),
+                                    ("monthyear", -3.7689221617874726),
+                                    ("el <day-of-month> (non ordinal)Abril", -4.174387269895637),
+                                    ("Marteseste|en un <cycle>", -4.174387269895637),
+                                    ("Miercolesel <cycle> (proximo|que viene)", -4.174387269895637),
+                                    ("el <time>Marzo", -3.7689221617874726),
                                     ("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),
+                                     -4.174387269895637),
+                                    ("Miercolesel proximo <cycle> ", -4.174387269895637),
+                                    ("Luneseste|en un <cycle>", -4.174387269895637),
+                                    ("dayyear", -2.159484249353372),
+                                    ("dd-dd <month>(interval)year", -4.174387269895637),
+                                    ("el <time>el <cycle> (proximo|que viene)", -4.174387269895637),
+                                    ("el <day-of-month> (non ordinal)Julio", -4.174387269895637),
+                                    ("el <time>year", -3.7689221617874726),
+                                    ("Septiembreyear", -4.174387269895637),
+                                    ("el <time>la <cycle> pasado", -4.174387269895637),
+                                    ("day of month (1st)Marzo", -3.258096538021482),
+                                    ("el <day-of-month> de <named-month>year", -3.7689221617874726),
+                                    ("el <time>este|en un <cycle>", -3.7689221617874726),
+                                    ("Mayoyear", -4.174387269895637),
+                                    ("<day-of-month> de <named-month>year", -3.7689221617874726),
+                                    ("two time tokens separated by \",\"year", -3.481240089335692),
+                                    ("el <day-of-month> (non ordinal)Febrero", -4.174387269895637),
                                     ("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),
+                                     -4.174387269895637),
+                                    ("dayweek", -2.469639177657212),
+                                    ("intersect by `de`year", -3.481240089335692),
+                                    ("el <day-of-month> (non ordinal)Marzo", -3.481240089335692),
+                                    ("Domingola <cycle> pasado", -4.174387269895637),
                                     ("two time tokens separated by \",\"Septiembre",
-                                     -4.1588830833596715),
-                                    ("el <day-of-month> (non ordinal)Mayo", -3.4657359027997265)],
-                               n = 45},
+                                     -4.174387269895637),
+                                    ("el <day-of-month> (non ordinal)Mayo", -3.481240089335692)],
+                               n = 46},
                    koData =
-                     ClassData{prior = -2.3025850929940455, unseen = -3.891820298110627,
+                     ClassData{prior = -2.0243817644968085, unseen = -3.970291913552122,
                                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}}),
+                                   [("Mayoyear (value by adding three composing numbers together)",
+                                     -3.258096538021482),
+                                    ("monthyear", -2.5649493574615367),
+                                    ("Julioyear", -3.258096538021482),
+                                    ("hourmonth", -2.8526314299133175),
+                                    ("a las <time-of-day>Julio", -3.258096538021482),
+                                    ("dayyear", -2.8526314299133175),
+                                    ("Mayoyear", -3.258096538021482),
+                                    ("<day-of-month> de <named-month>year", -2.8526314299133175),
+                                    ("a las <time-of-day>Enero", -3.258096538021482)],
+                               n = 7}}),
        ("n pasados <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -200,8 +201,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("semana (grain)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                     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}}),
@@ -246,10 +247,17 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("D\237a de la Prematuridad Mundial",
+        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}}),
        ("Mayo",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                     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}}),
@@ -262,24 +270,24 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> de <named-month>",
         Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.951243718581427,
+                     ClassData{prior = -9.097177820572676e-2,
+                               unseen = -3.9889840465642745,
                                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},
+                                   [("number (0..15)Marzo", -2.871679624884012),
+                                    ("integer (numeric)Abril", -2.871679624884012),
+                                    ("integer (numeric)Diciembre", -3.2771447329921766),
+                                    ("number (0..15)Mayo", -2.583997552432231),
+                                    ("integer (numeric)Enero", -3.2771447329921766),
+                                    ("integer (numeric)Marzo", -2.3608540011180215),
+                                    ("integer (numeric)Febrero", -2.178532444324067),
+                                    ("integer (numeric)Septiembre", -3.2771447329921766),
+                                    ("month", -0.8792494601938059),
+                                    ("integer (numeric)Mayo", -3.2771447329921766),
+                                    ("integer (numeric)Julio", -3.2771447329921766)],
+                               n = 21},
                    koData =
-                     ClassData{prior = -2.3978952727983707, unseen = -2.772588722239781,
+                     ClassData{prior = -2.4423470353692043, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
                                    [("month", -1.6094379124341003),
@@ -287,138 +295,136 @@
                                n = 2}}),
        ("<time-of-day> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.3528213746227423, unseen = -4.31748811353631,
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.3694478524670215,
                                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),
+                                     -3.6635616461296463),
+                                    ("dayhour", -2.277267285009756),
+                                    ("Lunesin the <part-of-day>", -3.6635616461296463),
+                                    ("tomorrowin the <part-of-day>", -3.6635616461296463),
+                                    ("a las <time-of-day>del mediod\237a", -3.6635616461296463),
                                     ("el <day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.6109179126442243),
-                                    ("hourhour", -2.2246235515243336),
+                                     -3.6635616461296463),
+                                    ("hourhour", -2.159484249353372),
                                     ("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),
+                                     -2.4107986776342782),
+                                    ("intersectin the <part-of-day>", -3.6635616461296463),
+                                    ("minutehour", -1.717651497074333),
+                                    ("intersect by `de`in the <part-of-day>", -3.6635616461296463),
                                     ("<hour-of-day> and halfin the <part-of-day>",
-                                     -3.20545280453606),
+                                     -3.258096538021482),
+                                    ("<hour-of-day> <integer> (as relative minutes)in the <part-of-day>",
+                                     -3.6635616461296463),
                                     ("<hour-of-day> and <relative minutes>del mediod\237a",
-                                     -3.20545280453606),
-                                    ("el <time>in the <part-of-day>", -3.6109179126442243),
+                                     -3.258096538021482),
+                                    ("el <time>in the <part-of-day>", -3.6635616461296463),
                                     ("<hour-of-day> and quarterin the <part-of-day>",
-                                     -2.6946271807700692),
-                                    ("yesterdayin the <part-of-day>", -3.6109179126442243),
+                                     -2.7472709142554916),
+                                    ("yesterdayin the <part-of-day>", -3.6635616461296463),
                                     ("time-of-day (latent)in the <part-of-day>",
-                                     -2.917770732084279)],
-                               n = 26},
+                                     -2.7472709142554916)],
+                               n = 28},
                    koData =
-                     ClassData{prior = -1.213022639845854, unseen = -3.8066624897703196,
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -3.4339872044851463,
                                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),
+                                   [("yearhour", -2.70805020110221),
+                                    ("year (latent)del mediod\237a", -2.70805020110221),
+                                    ("monthhour", -2.70805020110221),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("Febreroin the <part-of-day>", -2.70805020110221),
                                     ("time-of-day (latent)in the <part-of-day>",
-                                     -3.0910424533583156)],
-                               n = 11}}),
+                                     -2.3025850929940455)],
+                               n = 4}}),
        ("de <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("monthday", -1.791759469228055),
-                                    ("monthyear", -1.791759469228055),
-                                    ("Diciembretime-of-day (latent)", -1.791759469228055),
-                                    ("monthhour", -1.791759469228055),
-                                    ("Diciembreyear (latent)", -1.791759469228055),
+                                   [("monthday", -1.3862943611198906),
+                                    ("Diciembretime-of-day (latent)", -1.3862943611198906),
+                                    ("monthhour", -1.3862943611198906),
                                     ("Diciembre<day-of-month> de <named-month>",
-                                     -1.791759469228055)],
-                               n = 3}}),
+                                     -1.3862943611198906)],
+                               n = 2}}),
        ("<time-of-day> horas",
         Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("a las <time-of-day>", -1.252762968495368),
-                                    ("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037)],
-                               n = 2},
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
                    koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.7884573603642702),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4}}),
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.2113090936672069, unseen = -4.624972813284271,
+                     ClassData{prior = -0.20585205420414873,
+                               unseen = -4.663439094112067,
                                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),
+                                     -3.960813169597578),
+                                    ("dayhour", -2.0149030205422647),
+                                    ("Lunesin the <part-of-day>", -3.960813169597578),
+                                    ("tomorrowin the <part-of-day>", -3.960813169597578),
                                     ("el <day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.9219733362813143),
-                                    ("hourhour", -3.005682604407159),
+                                     -3.960813169597578),
+                                    ("D\237a Internacional de las Cooperativasel <time>",
+                                     -3.960813169597578),
+                                    ("hourhour", -3.044522437723423),
                                     ("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),
+                                     -3.960813169597578),
+                                    ("dayyear", -3.044522437723423),
+                                    ("a las <time-of-day>in the <part-of-day>", -2.70805020110221),
+                                    ("intersectin the <part-of-day>", -3.960813169597578),
+                                    ("<named-month> <day-of-month>del <year>", -3.960813169597578),
+                                    ("minutehour", -2.256065077359153),
+                                    ("intersect by `de`in the <part-of-day>", -3.960813169597578),
+                                    ("now<hour-of-day> and <relative minutes>", -3.960813169597578),
                                     ("<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),
+                                     -3.5553480614894135),
+                                    ("tomorrowa las <time-of-day>", -3.5553480614894135),
+                                    ("Miercoles<time-of-day> <part-of-day>", -3.960813169597578),
+                                    ("<hour-of-day> <integer> (as relative minutes)in the <part-of-day>",
+                                     -3.960813169597578),
+                                    ("Miercoles<dim time> de la manana", -3.960813169597578),
+                                    ("dayminute", -3.044522437723423),
+                                    ("<named-month> <day-of-month>el <time>", -3.960813169597578),
+                                    ("Miercolesa las <time-of-day>", -3.960813169597578),
+                                    ("el <time>in the <part-of-day>", -3.960813169597578),
+                                    ("Miercolesintersect", -3.960813169597578),
+                                    ("nowa las <time-of-day>", -3.5553480614894135),
+                                    ("D\237a Internacional de las Cooperativasdel <year>",
+                                     -3.960813169597578),
                                     ("<hour-of-day> and quarterin the <part-of-day>",
-                                     -3.005682604407159),
-                                    ("yesterdayin the <part-of-day>", -3.9219733362813143)],
-                               n = 34},
+                                     -3.044522437723423),
+                                    ("yesterdayin the <part-of-day>", -3.960813169597578)],
+                               n = 35},
                    koData =
-                     ClassData{prior = -1.6582280766035324, unseen = -3.912023005428146,
+                     ClassData{prior = -1.6817585740137264, unseen = -3.951243718581427,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.505525936990736),
+                                   [("hourday", -3.2386784521643803),
+                                    ("dayhour", -2.5455312716044354),
                                     ("<day-of-month> de <named-month>a las <time-of-day>",
-                                     -3.1986731175506815),
+                                     -3.2386784521643803),
                                     ("<time-of-day> am|pm<day-of-month> de <named-month>",
-                                     -3.1986731175506815),
-                                    ("monthhour", -2.793208009442517),
+                                     -3.2386784521643803),
+                                    ("monthhour", -2.833213344056216),
                                     ("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)],
+                                     -3.2386784521643803),
+                                    ("Diciembrea las <time-of-day>", -3.2386784521643803),
+                                    ("dayminute", -2.833213344056216),
+                                    ("Febreroin the <part-of-day>", -3.2386784521643803),
+                                    ("nowa las <time-of-day>", -2.5455312716044354)],
                                n = 8}}),
        ("Miercoles",
         Classifier{okData =
@@ -429,31 +435,33 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("a las <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -8.338160893905101e-2,
-                               unseen = -4.634728988229636,
+                     ClassData{prior = -7.320340402329494e-2,
+                               unseen = -5.135798437050262,
                                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> and half", -3.7436043538031827),
+                                    ("<time-of-day> horas", -4.436751534363128),
+                                    ("<hour-of-day> and quarter", -3.520460802488973),
+                                    ("time-of-day (latent)", -1.4163266482187657),
+                                    ("<hour-of-day> and <relative minutes>", -3.3381392456950185),
+                                    ("<time-of-day> am|pm", -2.5649493574615367),
                                     ("<hour-of-day> minus <integer> (as relative minutes)",
-                                     -3.9318256327243257),
+                                     -4.436751534363128),
                                     ("<hour-of-day> minus quarter (as relative minutes)",
-                                     -3.5263605246161616),
-                                    ("hour", -1.1592369104845446), ("minute", -1.8523840910444898)],
-                               n = 46},
+                                     -4.0312864262549635),
+                                    ("hour", -1.3686985992295109), ("minute", -1.4923125551966876),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.644992065135073)],
+                               n = 79},
                    koData =
-                     ClassData{prior = -2.5257286443082556,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -2.6508917872622613,
+                               unseen = -3.1780538303479458,
                                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}}),
+                                   [("time-of-day (latent)", -1.5260563034950494),
+                                    ("<hour-of-day> and <relative minutes>", -2.03688192726104),
+                                    ("hour", -1.5260563034950494), ("minute", -2.03688192726104)],
+                               n = 6}}),
        ("minutos (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -473,16 +481,12 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("year (latent)",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                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}}),
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("number (20..90)", 0.0)],
+                               n = 1}}),
        ("Viernes",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -512,6 +516,17 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> de la tarde",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)number (0..15)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("<hour-of-day> and quarter",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.0910424533583156,
@@ -565,28 +580,49 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -2.3025850929940455,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("D\237a Mundial de la Lengua \193rabe",
+        Classifier{okData =
+                     ClassData{prior = 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\237a de los Inocentes de Abril",
+        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}}),
+       ("dia <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("number (0..15)", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("el <time>",
         Classifier{okData =
-                     ClassData{prior = -2.7398974188114388e-2,
-                               unseen = -4.477336814478207,
+                     ClassData{prior = -2.6668247082161294e-2,
+                               unseen = -4.48863636973214,
                                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},
+                                   [("Martes", -3.378724525810097),
+                                    ("<named-month|named-day> past", -3.378724525810097),
+                                    ("dd[/-]mm", -3.0910424533583156),
+                                    ("intersect by `de`", -2.280112237141987),
+                                    ("<day-of-month> de <named-month>", -2.0794415416798357),
+                                    ("<time-of-day> <part-of-day>", -3.784189633918261),
+                                    ("intersect", -3.784189633918261),
+                                    ("Miercoles", -3.378724525810097),
+                                    ("Domingo", -3.378724525810097), ("Lunes", -3.784189633918261),
+                                    ("day", -0.9509762898620451), ("year", -3.378724525810097),
+                                    ("day of month (1st)", -3.378724525810097),
+                                    ("<named-month|named-day> next", -3.784189633918261),
+                                    ("hour", -3.378724525810097)],
+                               n = 37},
                    koData =
-                     ClassData{prior = -3.6109179126442243,
+                     ClassData{prior = -3.6375861597263857,
                                unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
@@ -633,9 +669,17 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("number (0..15)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9318256327243257,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 49},
+                     ClassData{prior = -0.13858616328614667,
+                               unseen = -4.330733340286331,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 74},
                    koData =
+                     ClassData{prior = -2.044755983691946, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
+       ("D\237a Internacional de las Cooperativas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Domingo",
@@ -688,11 +732,10 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("tomorrow",
         Classifier{okData =
-                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                     ClassData{prior = -0.12188981760903689, unseen = -4.02535169073515,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 54},
                    koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -2.1972245773362196,
+                     ClassData{prior = -2.164963715117998, unseen = -2.1972245773362196,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
        ("mes (grain)",
         Classifier{okData =
@@ -710,8 +753,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("number (20..90)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                     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}}),
@@ -735,29 +778,29 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
        ("afternoon",
         Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
                    koData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.20359895524123955,
-                               unseen = -3.5263605246161616,
+                     ClassData{prior = -0.6592456288842639, unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.1939224684724346),
-                                    ("number (0..15)", -0.3610133455373305)],
-                               n = 31},
+                                   [("integer (numeric)", -1.3062516534463542),
+                                    ("number (0..15)", -0.3448404862917295)],
+                               n = 45},
                    koData =
-                     ClassData{prior = -1.6916760106710724,
-                               unseen = -2.3025850929940455,
+                     ClassData{prior = -0.7282385003712154, unseen = -3.828641396489095,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.587786664902119),
-                                    ("number (0..15)", -0.8109302162163288)],
-                               n = 7}}),
+                                   [("integer (numeric)", -1.5040773967762742),
+                                    ("number (0..15)", -0.7156200364120039),
+                                    ("integer (0-9) with two digits", -1.241713132308783)],
+                               n = 42}}),
        ("<hour-of-day> and <relative minutes>",
         Classifier{okData =
                      ClassData{prior = -0.3364722366212129, unseen = -3.332204510175204,
@@ -783,15 +826,19 @@
                                n = 4}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
+                     ClassData{prior = -0.8754687373538999,
                                unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 6},
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -0.15415067982725836)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3}}),
+                     ClassData{prior = -0.5389965007326869,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.40546510810816444),
+                                    ("number 100..1000 ", -1.0986122886681098)],
+                               n = 7}}),
        ("en <duration>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.6635616461296463,
@@ -887,21 +934,24 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> am|pm",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.0794415416798357,
+                     ClassData{prior = -0.7069405026922811, unseen = -4.356708826689592,
                                likelihoods =
                                  HashMap.fromList
-                                   [("a las <time-of-day>", -1.252762968495368),
-                                    ("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037)],
-                               n = 2},
+                                   [("a las <time-of-day>", -1.7788560643921472),
+                                    ("time-of-day (latent)", -3.6506582412937383),
+                                    ("hour", -3.245193133185574), ("minute", -0.7884573603642702),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -1.1657515915057381)],
+                               n = 36},
                    koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                     ClassData{prior = -0.6795415285041666, unseen = -4.382026634673881,
                                likelihoods =
                                  HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
+                                   [("time-of-day (latent)", -1.1113513144455396),
+                                    ("hour", -1.1113513144455396), ("minute", -1.8044984950054848),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -1.8044984950054848)],
+                               n = 37}}),
        ("n proximas <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
@@ -977,6 +1027,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("D\237a de la Cero Discriminaci\243n",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("a\241o (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.639057329615259,
@@ -1025,18 +1082,26 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<dim time> de la tarde",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.713572066704308,
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -3.784189633918261,
                                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},
+                                   [("<hour-of-day> and half", -2.662587827025453),
+                                    ("a las <time-of-day>", -1.6817585740137264),
+                                    ("<hour-of-day> and quarter", -2.151762203259462),
+                                    ("time-of-day (latent)", -2.151762203259462),
+                                    ("hour", -1.563975538357343), ("minute", -1.363304842895192),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.068052935133617)],
+                               n = 18},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.5040773967762742),
+                                    ("hour", -1.5040773967762742)],
+                               n = 1}}),
        ("el proximo <cycle> ",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -1073,9 +1138,9 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("del <year>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
+                               n = 2},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1088,17 +1153,17 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("noon",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
+                     ClassData{prior = -1.3862943611198906,
                                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},
+                     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}}),
@@ -1109,6 +1174,23 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("next week",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("semana (grain)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("semana (grain)", -0.6931471805599453)],
+                               n = 1}}),
        ("<datetime> - <datetime> (interval)",
         Classifier{okData =
                      ClassData{prior = -0.916290731874155, unseen = -2.5649493574615367,
@@ -1159,6 +1241,22 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("next week (alt)",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("semana (grain)", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("semana (grain)", -0.6931471805599453)],
+                               n = 2}}),
        ("Marzo",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -1177,6 +1275,15 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("number 100..1000 ",
+        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}}),
        ("dia (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
@@ -1186,15 +1293,16 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("in the <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.3101549283038396, unseen = -3.295836866004329,
+                     ClassData{prior = -0.2682639865946794,
+                               unseen = -3.4339872044851463,
                                likelihoods =
                                  HashMap.fromList
-                                   [("afternoon", -1.466337068793427),
-                                    ("hour", -0.7731898882334817), ("evening", -2.159484249353372),
-                                    ("morning", -1.6486586255873816)],
-                               n = 11},
+                                   [("afternoon", -1.455287232606842),
+                                    ("hour", -0.7621400520468967), ("evening", -2.0149030205422647),
+                                    ("morning", -1.791759469228055)],
+                               n = 13},
                    koData =
-                     ClassData{prior = -1.3217558399823195,
+                     ClassData{prior = -1.4469189829363254,
                                unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
@@ -1225,6 +1333,15 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (value by adding three composing numbers together)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("number 100..1000 number (20..90)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("hora (grain)",
         Classifier{okData =
                      ClassData{prior = -0.15415067982725836,
@@ -1247,6 +1364,39 @@
                                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 = -0.40546510810816444,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>integer (0-9) with two digits",
+                                     -1.4853852637641216),
+                                    ("time-of-day (latent)integer (0-9) with two digits",
+                                     -1.405342556090585),
+                                    ("time-of-day (latent)number (0..15)", -3.2771447329921766),
+                                    ("hour", -0.7514160886839211)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)integer (numeric)", -1.9810014688665833),
+                                    ("time-of-day (latent)number (0..15)", -1.0647107369924282),
+                                    ("hour", -0.8023464725249373)],
+                               n = 12}}),
+       ("integer (0-9) with two digits",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.252762968495368),
+                                    ("number (0..15)", -0.3364722366212129)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ce <time>",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/FA_XX.hs b/Duckling/Ranking/Classifiers/FA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/FA_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.FA_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/FI_XX.hs b/Duckling/Ranking/Classifiers/FI_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/FI_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.FI_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_XX.hs b/Duckling/Ranking/Classifiers/FR_XX.hs
--- a/Duckling/Ranking/Classifiers/FR_XX.hs
+++ b/Duckling/Ranking/Classifiers/FR_XX.hs
@@ -78,2484 +78,2394 @@
                                     ("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 = -1.6094379124341003,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.6094379124341003),
-                                    ("hour", -1.2039728043259361),
-                                    ("<time-of-day> heures", -1.6094379124341003)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.7047480922384253),
-                                    ("<hour-of-day> et quart", -1.9924301646902063),
-                                    ("hour", -1.9924301646902063),
-                                    ("<hour-of-day> et demi", -1.9924301646902063),
-                                    ("minute", -1.1451323043030026),
-                                    ("<time-of-day> heures", -2.3978952727983707)],
-                               n = 8}}),
-       ("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.2318016140573243, unseen = -6.974478911025045,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> <named-month><dim time> <part-of-day>",
-                                     -6.280395838960195),
-                                    ("intersect<dim time> du matin", -6.280395838960195),
-                                    ("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -5.87493073085203),
-                                    ("<day-of-month> <named-month>d\233but de journ\233e",
-                                     -6.280395838960195),
-                                    ("hourday", -4.0291040403537),
-                                    ("<day-of-month> <named-month>year", -5.58724865840025),
-                                    ("dayhour", -1.917297214171832),
-                                    ("<datetime> - <datetime> (interval)Juillet",
-                                     -5.027632870464827),
-                                    ("daymonth", -2.862669155346829),
-                                    ("monthyear", -4.77631844218392),
-                                    ("<day-of-month> <named-month>d\233but de matin\233e",
-                                     -6.280395838960195),
-                                    ("dernier <cycle> de <time> (latent)year", -5.36410510708604),
-                                    ("aujourd'huimilieu d'apr\232s-midi", -6.280395838960195),
-                                    ("<day-of-month> <named-month>\224|vers <time-of-day>",
-                                     -4.77631844218392),
-                                    ("dd mmyear", -5.027632870464827),
-                                    ("Vendredi\224|vers <time-of-day>", -5.87493073085203),
-                                    ("Mercredidu|dans le <part-of-day>", -6.280395838960195),
-                                    ("aujourd'huifin d'apr\232s-midi", -6.280395838960195),
-                                    ("day of month (premier)Novembre", -5.58724865840025),
-                                    ("le <day-of-month> (non ordinal)<dim time> du matin",
-                                     -6.280395838960195),
-                                    ("aujourd'huimilieu de matin\233e", -6.280395838960195),
-                                    ("hh(:|h)mm (time-of-day)<day-of-week> <day-of-month>",
-                                     -6.280395838960195),
-                                    ("le <day-of-month> (non ordinal)Fevrier", -4.200954297280359),
-                                    ("Mars<dim time> <part-of-day>", -6.280395838960195),
-                                    ("Lundiday of month (premier)", -5.87493073085203),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -5.58724865840025),
-                                    ("<hour-of-day> et quart<dim time> <part-of-day>",
-                                     -5.87493073085203),
-                                    ("le <time>du|dans le <part-of-day>", -5.58724865840025),
-                                    ("aujourd'huifin de matin\233e", -6.280395838960195),
-                                    ("Marsyear", -5.87493073085203),
-                                    ("aujourd'huifin de soir\233e", -6.280395838960195),
-                                    ("\224|vers <time-of-day>ce <part-of-day>", -5.58724865840025),
-                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
-                                     -6.280395838960195),
-                                    ("le <day-of-month> (non ordinal)<dim time> du soir",
-                                     -5.58724865840025),
-                                    ("intersectSeptembre", -5.87493073085203),
-                                    ("aujourd'huid\233but de soir\233e", -6.280395838960195),
-                                    ("<day-of-week> <day-of-month>Fevrier", -5.87493073085203),
-                                    ("<hour-of-day> et demice <part-of-day>", -5.87493073085203),
-                                    ("apr\232s <time-of-day>Jeudi", -5.87493073085203),
-                                    ("le <time>fin de matin\233e", -6.280395838960195),
-                                    ("Jeudide <time-of-day> - <time-of-day> (interval)",
-                                     -5.87493073085203),
-                                    ("day of month (premier)Mars", -5.36410510708604),
-                                    ("intersectmilieu de journ\233e", -6.280395838960195),
-                                    ("intersectfin de journ\233e", -6.280395838960195),
-                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
-                                     -6.280395838960195),
-                                    ("Octobreyear", -5.36410510708604),
-                                    ("Fevrierd\233but de matin\233e", -6.280395838960195),
-                                    ("de <datetime> - <datetime> (interval)Juillet",
-                                     -5.87493073085203),
-                                    ("<hour-of-day> <integer> (as relative minutes)<day-of-week> <day-of-month>",
-                                     -6.280395838960195),
-                                    ("monthhour", -4.083171261623976),
-                                    ("Marsintersect", -6.280395838960195),
-                                    ("Lundile <cycle> prochain|suivant|d'apr\232s",
-                                     -6.280395838960195),
-                                    ("le <time>fin d'apr\232s-midi", -6.280395838960195),
-                                    ("hourmonth", -4.77631844218392),
-                                    ("<time-of-day> heuresle <time>", -4.77631844218392),
-                                    ("entre <datetime> et <datetime> (interval)Jeudi",
-                                     -5.87493073085203),
-                                    ("dayday", -3.929020581796717),
-                                    ("Septembreyear", -5.87493073085203),
-                                    ("aujourd'hui<hour-of-day> <integer> (as relative minutes)",
-                                     -5.87493073085203),
-                                    ("apr\232s <time-of-day>Novembre", -5.58724865840025),
-                                    ("hourhour", -3.7546671946519394),
-                                    ("Fevrierd\233but d'apr\232s-midi", -6.280395838960195),
-                                    ("<day-of-week> <day-of-month>\224|vers <time-of-day>",
-                                     -5.181783550292085),
-                                    ("<day-of-week> <day-of-month>Septembre", -6.280395838960195),
-                                    ("le <time>intersect", -5.87493073085203),
-                                    ("\224|vers <time-of-day><dim time> <part-of-day>",
-                                     -6.280395838960195),
-                                    ("aujourd'huiau d\233jeuner", -6.280395838960195),
-                                    ("Vendrediday of month (premier)", -6.280395838960195),
-                                    ("le <day-of-month> (non ordinal)Avril", -6.280395838960195),
-                                    ("<time-of-day> heuresintersect", -5.36410510708604),
-                                    ("<hour-of-day> et quartce <part-of-day>", -5.87493073085203),
-                                    ("Jeudi\224|vers <time-of-day>", -6.280395838960195),
-                                    ("dayyear", -3.8825005661618244),
-                                    ("le <day-of-month> (non ordinal)Juin", -6.280395838960195),
-                                    ("Lundice|dans le <cycle>", -6.280395838960195),
-                                    ("apr\232s-demain\224|vers <time-of-day>", -5.87493073085203),
-                                    ("intersectfin d'apr\232s-midi", -6.280395838960195),
-                                    ("le <ordinal> <cycle> de <time>year", -6.280395838960195),
-                                    ("intersectmilieu d'apr\232s-midi", -6.280395838960195),
-                                    ("<hour-of-day> <integer> (as relative minutes)Jeudi",
-                                     -6.280395838960195),
-                                    ("le <time>milieu de journ\233e", -6.280395838960195),
-                                    ("aujourd'huid\233but de journ\233e", -6.280395838960195),
-                                    ("demain\224|vers <time-of-day>", -5.87493073085203),
-                                    ("le <day-of-month> (non ordinal)Mars", -4.894101477840304),
-                                    ("le <day-of-month> (non ordinal)intersect",
-                                     -3.7954891891721947),
-                                    ("hourminute", -6.280395838960195),
-                                    ("dd-dd <month>(interval)year", -6.280395838960195),
-                                    ("intersect<day-of-month> <named-month>", -5.87493073085203),
-                                    ("<hour-of-day> <integer> (as relative minutes)Samedi",
-                                     -6.280395838960195),
-                                    ("minutemonth", -5.87493073085203),
-                                    ("\224|vers <time-of-day>demain", -6.280395838960195),
-                                    ("minutehour", -4.6709579265260945),
-                                    ("Lundidu|dans le <part-of-day>", -6.280395838960195),
-                                    ("aujourd'huimilieu de journ\233e", -6.280395838960195),
-                                    ("Mars\224|vers <time-of-day>", -5.58724865840025),
-                                    ("intersectd\233but de soir\233e", -6.280395838960195),
-                                    ("Mardile <cycle> prochain|suivant|d'apr\232s",
-                                     -5.58724865840025),
-                                    ("aujourd'huifin de journ\233e", -6.280395838960195),
-                                    ("le <day-of-month> (non ordinal)Octobre", -6.280395838960195),
-                                    ("intersectdu|dans le <part-of-day>", -4.48863636973214),
-                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
-                                     -5.87493073085203),
-                                    ("hh(:|h)mm (time-of-day)Jeudi", -6.280395838960195),
-                                    ("le <day-of-month> (non ordinal)apr\232s <time-of-day>",
-                                     -6.280395838960195),
-                                    ("le <time>Juillet", -6.280395838960195),
-                                    ("Lundi<day-of-month> <named-month>", -6.280395838960195),
-                                    ("Mercredile <cycle> prochain|suivant|d'apr\232s",
-                                     -5.58724865840025),
-                                    ("Lundifin d'apr\232s-midi", -5.87493073085203),
-                                    ("Lundile <time>", -5.87493073085203),
-                                    ("le <day-of-month> (non ordinal)<dim time> <part-of-day>",
-                                     -4.140329675463924),
-                                    ("Mardi<named-month|named-day> suivant|d'apr\232s",
-                                     -5.87493073085203),
-                                    ("apr\232s <time-of-day>le <time>", -5.36410510708604),
-                                    ("Mars<dim time> du matin", -6.280395838960195),
-                                    ("le <time>Novembre", -5.58724865840025),
-                                    ("intersectd\233but d'apr\232s-midi", -6.280395838960195),
-                                    ("<datetime> - <datetime> (interval)Jeudi", -5.36410510708604),
-                                    ("Mercredi<named-month|named-day> suivant|d'apr\232s",
-                                     -5.87493073085203),
-                                    ("<time-of-day> - <time-of-day> (interval)Jeudi",
-                                     -5.027632870464827),
-                                    ("Samedi<day-of-month> <named-month>", -6.280395838960195),
-                                    ("<hour-of-day> et quartdemain", -5.87493073085203),
-                                    ("<time-of-day> heuresce <time>", -6.280395838960195),
-                                    ("le <time>d\233but d'apr\232s-midi", -6.280395838960195),
-                                    ("day of month (premier)Juillet", -5.58724865840025),
-                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
-                                     -5.87493073085203),
-                                    ("Fevriermilieu d'apr\232s-midi", -6.280395838960195),
-                                    ("Mercredi\224|vers <time-of-day>", -6.280395838960195),
-                                    ("intersectNovembre", -5.027632870464827),
-                                    ("le <time><dim time> du matin", -6.280395838960195),
-                                    ("Fevrierfin d'apr\232s-midi", -6.280395838960195),
-                                    ("apr\232s <time-of-day>intersect", -5.87493073085203),
-                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
-                                     -4.77631844218392),
-                                    ("<day-of-month> <named-month>d\233but de soir\233e",
-                                     -6.280395838960195),
-                                    ("hierdu|dans le <part-of-day>", -6.280395838960195),
-                                    ("le <time>d\233but de soir\233e", -6.280395838960195),
-                                    ("Mercredice|dans le <cycle>", -6.280395838960195),
-                                    ("Fevrierfin de soir\233e", -6.280395838960195),
-                                    ("intersect<dim time> <part-of-day>", -6.280395838960195),
-                                    ("Mardice|dans le <cycle>", -6.280395838960195),
-                                    ("dayminute", -4.6709579265260945),
-                                    ("intersectd\233but de journ\233e", -6.280395838960195),
-                                    ("<ordinal> <cycle> de <time>year", -5.87493073085203),
-                                    ("Fevriermilieu de matin\233e", -6.280395838960195),
-                                    ("le <time>\224|vers <time-of-day>", -5.181783550292085),
-                                    ("<day-of-month> <named-month><dim time> du matin",
-                                     -6.280395838960195),
-                                    ("intersectyear", -5.58724865840025),
-                                    ("Fevrierfin de matin\233e", -6.280395838960195),
-                                    ("minuteday", -3.3359568597937543),
-                                    ("le <time>d\233but de matin\233e", -6.280395838960195),
-                                    ("Mardile <time>", -4.894101477840304),
-                                    ("aujourd'hui\224|vers <time-of-day>", -5.36410510708604),
-                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
-                                     -6.280395838960195),
-                                    ("day of month (premier)intersect", -6.280395838960195),
-                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
-                                     -6.280395838960195),
-                                    ("day of month (premier)Janvier", -6.280395838960195),
-                                    ("de <datetime> - <datetime> (interval)Jeudi",
-                                     -5.87493073085203),
-                                    ("le <time>milieu de matin\233e", -6.280395838960195),
-                                    ("aujourd'huid\233but de matin\233e", -5.181783550292085),
-                                    ("Fevrierd\233but de soir\233e", -6.280395838960195),
-                                    ("Jeudiapr\232s <time-of-day>", -5.36410510708604),
-                                    ("Mercredile <time>", -4.894101477840304),
-                                    ("<dim time> <part-of-day>apr\232s <time-of-day>",
-                                     -6.280395838960195),
-                                    ("le <time>fin de soir\233e", -6.280395838960195),
-                                    ("de <time-of-day> - <time-of-day> (interval)Jeudi",
-                                     -5.36410510708604),
-                                    ("<day-of-month> <named-month>milieu de matin\233e",
-                                     -6.280395838960195),
-                                    ("<day-of-month> <named-month>fin de soir\233e",
-                                     -6.280395838960195),
-                                    ("<day-of-month> <named-month>fin de matin\233e",
-                                     -6.280395838960195),
-                                    ("<time-of-day> heuresce <part-of-day>", -5.87493073085203),
-                                    ("Mercredi<day-of-month> <named-month>", -6.280395838960195),
-                                    ("aujourd'huid\233but d'apr\232s-midi", -6.280395838960195),
-                                    ("le <time>milieu d'apr\232s-midi", -6.280395838960195),
-                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
-                                     -5.181783550292085),
-                                    ("entre <time-of-day> et <time-of-day> (interval)Jeudi",
-                                     -5.87493073085203),
-                                    ("intersectintersect", -6.280395838960195),
-                                    ("dayweek", -4.083171261623976),
-                                    ("entre <datetime> et <datetime> (interval)Juillet",
-                                     -6.280395838960195),
-                                    ("intersectMars", -6.280395838960195),
-                                    ("weekyear", -4.894101477840304),
-                                    ("le <time>Mars", -5.87493073085203),
-                                    ("apr\232s le <day-of-month>Mars", -6.280395838960195),
-                                    ("hh(:|h)mm (time-of-day)intersect", -5.87493073085203),
-                                    ("<day-of-month> <named-month>fin de journ\233e",
-                                     -6.280395838960195),
-                                    ("<day-of-month> <named-month>milieu de journ\233e",
-                                     -6.280395838960195),
-                                    ("le <time>fin de journ\233e", -6.280395838960195),
-                                    ("dd/-mm\224|vers <time-of-day>", -5.87493073085203),
-                                    ("intersectfin de matin\233e", -6.280395838960195),
-                                    ("Fevrierd\233but de journ\233e", -6.280395838960195),
-                                    ("Vendrediintersect", -6.280395838960195),
-                                    ("<day-of-month> <named-month>intersect", -6.280395838960195),
-                                    ("intersectfin de soir\233e", -6.280395838960195),
-                                    ("intersectmilieu de matin\233e", -6.280395838960195),
-                                    ("intersect\224|vers <time-of-day>", -5.58724865840025),
-                                    ("le <time>year", -4.77631844218392),
-                                    ("Vendrediapr\232s <time-of-day>", -6.280395838960195),
-                                    ("hh(:|h)mm (time-of-day)Samedi", -6.280395838960195),
-                                    ("le <time><dim time> <part-of-day>", -6.280395838960195),
-                                    ("Fevrierfin de journ\233e", -6.280395838960195),
-                                    ("Fevriermilieu de journ\233e", -6.280395838960195),
-                                    ("le <time>d\233but de journ\233e", -6.280395838960195),
-                                    ("intersectd\233but de matin\233e", -6.280395838960195)],
-                               n = 414},
-                   koData =
-                     ClassData{prior = -1.575536360758419, unseen = -6.124683390894205,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year<time-of-day> - <time-of-day> (interval)",
-                                     -4.736198448394496),
-                                    ("demain<time-of-day> heures", -5.429345628954441),
-                                    ("hourday", -3.2321210516182215),
-                                    ("<day-of-month> <named-month>year", -5.429345628954441),
-                                    ("demainavant <time-of-day>", -5.429345628954441),
-                                    ("dayhour", -2.755196979527912),
-                                    ("<time-of-day> - <time-of-day> (interval)Juillet",
-                                     -4.736198448394496),
-                                    ("Jeudi<time-of-day> - <time-of-day> (interval)",
-                                     -5.0238805208462765),
-                                    ("daymonth", -3.8199077165203406),
-                                    ("monthday", -5.429345628954441),
-                                    ("monthyear", -4.736198448394496),
-                                    ("yearhour", -4.736198448394496),
-                                    ("le <cycle> de <time>Octobre", -5.0238805208462765),
-                                    ("houryear", -5.0238805208462765),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -4.736198448394496),
-                                    ("le <time>du|dans le <part-of-day>", -5.0238805208462765),
-                                    ("Marsyear", -5.429345628954441),
-                                    ("Dimanche<day-of-month> <named-month>", -4.736198448394496),
-                                    ("<time-of-day> heuresle <day-of-month> (non ordinal)",
-                                     -4.513054897080286),
-                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
-                                     -5.429345628954441),
-                                    ("aujourd'huidu|dans le <part-of-day>", -5.0238805208462765),
-                                    ("de <datetime> - <datetime> (interval)Juillet",
-                                     -5.429345628954441),
-                                    ("monthhour", -4.04305126783455),
-                                    ("hourmonth", -4.176582660459073),
-                                    ("Vendredi<time-of-day> - <time-of-day> (interval)",
-                                     -4.176582660459073),
-                                    ("dayday", -3.6375861597263857),
-                                    ("Septembreyear", -5.429345628954441),
-                                    ("Lundiapr\232s <time-of-day>", -5.429345628954441),
-                                    ("hourhour", -3.5575434520528493),
-                                    ("\224|vers <time-of-day>Jeudi", -4.736198448394496),
-                                    ("dayyear", -4.176582660459073),
-                                    ("le lendemain du <time>Fevrier", -5.429345628954441),
-                                    ("demain\224|vers <time-of-day>", -5.0238805208462765),
-                                    ("<time> timezoneapr\232s <time-of-day>", -5.0238805208462765),
-                                    ("Mars\224|vers <time-of-day>", -4.330733340286331),
-                                    ("Lundi<datetime> - <datetime> (interval)",
-                                     -5.0238805208462765),
-                                    ("intersect by 'de' or ','year", -5.0238805208462765),
-                                    ("hh(:|h)mm (time-of-day)Jeudi", -5.429345628954441),
-                                    ("weekmonth", -5.0238805208462765),
-                                    ("le <day-of-month> (non ordinal)Juillet", -5.429345628954441),
-                                    ("le <day-of-month> (non ordinal)year", -5.0238805208462765),
-                                    ("Juillet<day-of-month> <named-month>", -5.429345628954441),
-                                    ("<time-of-day> - <time-of-day> (interval)Septembre",
-                                     -5.429345628954441),
-                                    ("Samedi<time-of-day> - <time-of-day> (interval)",
-                                     -5.0238805208462765),
-                                    ("<time-of-day> heuresdd/-mm", -5.429345628954441),
-                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
-                                     -5.0238805208462765),
-                                    ("intersectyear", -5.429345628954441),
-                                    ("minuteday", -5.429345628954441),
-                                    ("Mardile <time>", -5.429345628954441),
-                                    ("Fevrierdu|dans le <part-of-day>", -5.0238805208462765),
-                                    ("aujourd'hui\224|vers <time-of-day>", -5.0238805208462765),
-                                    ("<datetime>-dd <month>(interval)year", -5.0238805208462765),
-                                    ("Jeudiapr\232s <time-of-day>", -5.0238805208462765),
-                                    ("Mercredile <time>", -5.429345628954441),
-                                    ("le <day-of-month> (non ordinal)avant <time-of-day>",
-                                     -5.429345628954441),
-                                    ("<dim time> <part-of-day>apr\232s <time-of-day>",
-                                     -5.429345628954441),
-                                    ("Mercredi<day-of-month> <named-month>", -4.513054897080286),
-                                    ("demainapr\232s <time-of-day>", -5.429345628954441),
-                                    ("<day-of-week> <day-of-month>Juillet", -4.04305126783455),
-                                    ("<time-of-day> - <time-of-day> (interval)intersect",
-                                     -5.429345628954441),
-                                    ("apr\232s <time-of-day>\224|vers <time-of-day>",
-                                     -5.0238805208462765),
-                                    ("\224|vers <time-of-day>apr\232s <time-of-day>",
-                                     -5.429345628954441),
-                                    ("Fevrieryear", -5.429345628954441),
-                                    ("Jeudi<time-of-day> heures", -5.0238805208462765),
-                                    ("apr\232s <time-of-day>le <day-of-month> (non ordinal)",
-                                     -5.0238805208462765),
-                                    ("avant <time-of-day>Jeudi", -5.429345628954441),
-                                    ("de <datetime> - <datetime> (interval)<day-of-month> <named-month>",
-                                     -5.429345628954441),
-                                    ("<dim time> <part-of-day><time-of-day> heures",
-                                     -5.429345628954441),
-                                    ("<time-of-day> heuresJeudi", -4.330733340286331)],
-                               n = 108}}),
-       ("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.23293155768037255, 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.5712166996139025,
-                               unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -2.3978952727983707),
-                                    ("hh(:|h)mm (time-of-day)", -2.6855773452501515),
-                                    ("hour", -1.3862943611198906), ("minute", -1.8382794848629478),
-                                    ("<time-of-day> heures", -1.4816045409242156),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -2.6855773452501515)],
-                               n = 16}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22}}),
-       ("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 = -0.1823215567939546, unseen = -5.730099782973574,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Mercredisoir", -5.033700567027251),
-                                    ("<day-of-month> <named-month>d\233but de journ\233e",
-                                     -5.033700567027251),
-                                    ("dayhour", -1.5073400424110905),
-                                    ("<day-of-month> <named-month>d\233but de matin\233e",
-                                     -5.033700567027251),
-                                    ("aujourd'huimilieu d'apr\232s-midi", -5.033700567027251),
-                                    ("Mercredidu|dans le <part-of-day>", -5.033700567027251),
-                                    ("aujourd'huifin d'apr\232s-midi", -5.033700567027251),
-                                    ("aujourd'huimilieu de matin\233e", -5.033700567027251),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -4.340553386467307),
-                                    ("le <time>du|dans le <part-of-day>", -4.340553386467307),
-                                    ("aujourd'huifin de matin\233e", -5.033700567027251),
-                                    ("aujourd'huifin de soir\233e", -5.033700567027251),
-                                    ("\224|vers <time-of-day>ce <part-of-day>", -4.340553386467307),
-                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
-                                     -5.033700567027251),
-                                    ("demainsoir", -5.033700567027251),
-                                    ("aujourd'huid\233but de soir\233e", -5.033700567027251),
-                                    ("Lundimatin", -5.033700567027251),
-                                    ("<hour-of-day> et demice <part-of-day>", -4.628235458919088),
-                                    ("le <time>fin de matin\233e", -5.033700567027251),
-                                    ("intersectmilieu de journ\233e", -5.033700567027251),
-                                    ("intersectfin de journ\233e", -5.033700567027251),
-                                    ("Fevrierd\233but de matin\233e", -5.033700567027251),
-                                    ("monthhour", -3.241941097799197),
-                                    ("le <time>fin d'apr\232s-midi", -5.033700567027251),
-                                    ("hourhour", -2.5487939172392515),
-                                    ("Fevrierd\233but d'apr\232s-midi", -5.033700567027251),
-                                    ("aujourd'huiau d\233jeuner", -5.033700567027251),
-                                    ("<hour-of-day> et quartce <part-of-day>", -4.628235458919088),
-                                    ("intersectfin d'apr\232s-midi", -5.033700567027251),
-                                    ("intersectmilieu d'apr\232s-midi", -5.033700567027251),
-                                    ("le <time>milieu de journ\233e", -5.033700567027251),
-                                    ("aujourd'huid\233but de journ\233e", -5.033700567027251),
-                                    ("demainapr\232s-midi", -5.033700567027251),
-                                    ("minutehour", -3.4242626545931514),
-                                    ("Lundidu|dans le <part-of-day>", -5.033700567027251),
-                                    ("aujourd'huimilieu de journ\233e", -5.033700567027251),
-                                    ("intersectd\233but de soir\233e", -5.033700567027251),
-                                    ("aujourd'huifin de journ\233e", -5.033700567027251),
-                                    ("intersectdu|dans le <part-of-day>", -3.241941097799197),
-                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
-                                     -4.628235458919088),
-                                    ("Lundifin d'apr\232s-midi", -4.628235458919088),
-                                    ("intersectd\233but d'apr\232s-midi", -5.033700567027251),
-                                    ("le <time>d\233but d'apr\232s-midi", -5.033700567027251),
-                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
-                                     -4.628235458919088),
-                                    ("Fevriermilieu d'apr\232s-midi", -5.033700567027251),
-                                    ("Fevrierfin d'apr\232s-midi", -5.033700567027251),
-                                    ("<day-of-month> <named-month>d\233but de soir\233e",
-                                     -5.033700567027251),
-                                    ("hierdu|dans le <part-of-day>", -5.033700567027251),
-                                    ("le <time>d\233but de soir\233e", -5.033700567027251),
-                                    ("Fevrierfin de soir\233e", -5.033700567027251),
-                                    ("intersectd\233but de journ\233e", -5.033700567027251),
-                                    ("Fevriermilieu de matin\233e", -5.033700567027251),
-                                    ("Fevrierfin de matin\233e", -5.033700567027251),
-                                    ("le <time>d\233but de matin\233e", -5.033700567027251),
-                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
-                                     -5.033700567027251),
-                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
-                                     -5.033700567027251),
-                                    ("le <time>milieu de matin\233e", -5.033700567027251),
-                                    ("aujourd'huid\233but de matin\233e", -3.9350882783591423),
-                                    ("Fevrierd\233but de soir\233e", -5.033700567027251),
-                                    ("le <time>fin de soir\233e", -5.033700567027251),
-                                    ("<day-of-month> <named-month>milieu de matin\233e",
-                                     -5.033700567027251),
-                                    ("<day-of-month> <named-month>fin de soir\233e",
-                                     -5.033700567027251),
-                                    ("<day-of-month> <named-month>fin de matin\233e",
-                                     -5.033700567027251),
-                                    ("<time-of-day> heuresce <part-of-day>", -4.628235458919088),
-                                    ("aujourd'huid\233but d'apr\232s-midi", -5.033700567027251),
-                                    ("le <time>milieu d'apr\232s-midi", -5.033700567027251),
-                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
-                                     -3.9350882783591423),
-                                    ("Jeudimatin", -5.033700567027251),
-                                    ("<day-of-month> <named-month>fin de journ\233e",
-                                     -5.033700567027251),
-                                    ("<day-of-month> <named-month>milieu de journ\233e",
-                                     -5.033700567027251),
-                                    ("le <time>fin de journ\233e", -5.033700567027251),
-                                    ("Lundiapr\232s-midi", -5.033700567027251),
-                                    ("intersectfin de matin\233e", -5.033700567027251),
-                                    ("Fevrierd\233but de journ\233e", -5.033700567027251),
-                                    ("intersectfin de soir\233e", -5.033700567027251),
-                                    ("intersectmilieu de matin\233e", -5.033700567027251),
-                                    ("intersectapr\232s-midi", -4.340553386467307),
-                                    ("Fevrierfin de journ\233e", -5.033700567027251),
-                                    ("Fevriermilieu de journ\233e", -5.033700567027251),
-                                    ("le <time>d\233but de journ\233e", -5.033700567027251),
-                                    ("intersectd\233but de matin\233e", -5.033700567027251),
-                                    ("hiersoir", -5.033700567027251)],
-                               n = 110},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -4.882801922586371,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -3.776585034533042),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -3.488902962081261),
-                                    ("le <time>du|dans le <part-of-day>", -3.776585034533042),
-                                    ("aujourd'huidu|dans le <part-of-day>", -3.776585034533042),
-                                    ("monthhour", -3.776585034533042),
-                                    ("\224|vers <time-of-day>apr\232s-midi", -3.488902962081261),
-                                    ("hourhour", -2.477302050402781),
-                                    ("minutehour", -2.677972745864932),
-                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
-                                     -3.776585034533042),
-                                    ("Fevrierdu|dans le <part-of-day>", -3.776585034533042),
-                                    ("<time> timezoneapr\232s-midi", -2.677972745864932)],
-                               n = 22}}),
-       ("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)],
+       ("du dd au dd (interval) (latent month)",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)integer (numeric)", -1.6094379124341003),
+                                    ("integer (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("number (0..16)integer (numeric)", -1.6094379124341003),
+                                    ("ordinal (digits)number (17..19)", -1.6094379124341003),
+                                    ("ordinal (digits)number (0..16)", -1.6094379124341003)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)number (0..16)", -1.0986122886681098)],
+                               n = 1}}),
+       ("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 = -1.6094379124341003,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>", -1.6094379124341003),
+                                    ("hour", -1.2039728043259361),
+                                    ("<time-of-day> heures", -1.6094379124341003)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>", -1.7047480922384253),
+                                    ("<hour-of-day> et quart", -1.9924301646902063),
+                                    ("hour", -1.9924301646902063),
+                                    ("<hour-of-day> et demi", -1.9924301646902063),
+                                    ("minute", -1.1451323043030026),
+                                    ("<time-of-day> heures", -2.3978952727983707)],
+                               n = 8}}),
+       ("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.4740936144972606,
+                               unseen = -5.5053315359323625,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 244},
+                   koData =
+                     ClassData{prior = -0.9740495660263475,
+                               unseen = -5.0106352940962555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 148}}),
+       ("<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.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("entre <datetime> et <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3483066942682157,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("le <time>le <day-of-month> (non ordinal)",
+                                     -2.890371757896165),
+                                    ("le <time>le <time>", -2.4849066497880004),
+                                    ("dayday", -1.0986122886681098),
+                                    ("hourhour", -2.890371757896165),
+                                    ("le <time>intersect", -2.890371757896165),
+                                    ("miditime-of-day (latent)", -2.890371757896165),
+                                    ("intersectle <day-of-month> (non ordinal)",
+                                     -2.890371757896165),
+                                    ("le <day-of-month> (non ordinal)le <day-of-month> (non ordinal)",
+                                     -2.1972245773362196),
+                                    ("intersectintersect", -2.890371757896165),
+                                    ("intersectle <time>", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.2237754316221157,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -1.2992829841302609),
+                                    ("le <day-of-month> (non ordinal)intersect",
+                                     -1.9924301646902063),
+                                    ("le <day-of-month> (non ordinal)le <time>",
+                                     -1.9924301646902063),
+                                    ("le <day-of-month> (non ordinal)le <day-of-month> (non ordinal)",
+                                     -2.3978952727983707)],
+                               n = 5}}),
+       ("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 = -6.899287148695143e-2,
+                               unseen = -4.1588830833596715,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.5336968139574325),
+                                    ("en semaine", -1.9459101490553135),
+                                    ("Mercredi", -3.044522437723423), ("Mardi", -3.044522437723423),
+                                    ("intersect by 'de' or ','", -2.5336968139574325),
+                                    ("day", -0.7758388964050588),
+                                    ("le <time>", -1.9459101490553135)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("en semaine", -1.7047480922384253),
+                                    ("day", -1.2992829841302609),
+                                    ("le <time>", -1.7047480922384253)],
+                               n = 2}}),
+       ("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}}),
+       ("apr\232s <time-of-day|day>",
+        Classifier{okData =
+                     ClassData{prior = -0.3677247801253174, unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7047480922384253),
+                                    ("hh(:|h)mm (time-of-day)", -2.803360380906535),
+                                    ("midi", -3.4965075614664802), ("day", -2.803360380906535),
+                                    ("time-of-day (latent)", -2.803360380906535),
+                                    ("hour", -1.4170660197866443), ("minute", -1.8870696490323797),
+                                    ("<time-of-day> heures", -2.803360380906535),
+                                    ("le <time>", -3.0910424533583156),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.580216829592325)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -1.1786549963416462,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.4849066497880004),
+                                    ("le <day-of-month> (non ordinal)", -2.890371757896165),
+                                    ("day", -2.890371757896165),
+                                    ("time-of-day (latent)", -1.9740810260220096),
+                                    ("au d\233jeuner", -2.890371757896165),
+                                    ("hour", -1.0986122886681098),
+                                    ("<time-of-day> heures", -1.9740810260220096)],
+                               n = 12}}),
+       ("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 = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8472978603872037),
+                                    ("day of month (premier)number (0..16)Juillet",
+                                     -1.540445040947149),
+                                    ("<day-of-month> <named-month>integer (numeric)Juillet",
+                                     -1.540445040947149),
+                                    ("day of month (premier)integer (numeric)Juillet",
+                                     -1.9459101490553135)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.3978952727983707),
+                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
+                                     -2.3978952727983707),
+                                    ("dayminute", -0.8938178760220964),
+                                    ("Jeudientre <time-of-day> et <time-of-day> (interval)",
+                                     -0.8938178760220964)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("de <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0560526742493137,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day of month (premier)<day-of-week> <day-of-month>",
+                                     -2.9444389791664407),
+                                    ("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
+                                     -2.9444389791664407),
+                                    ("minuteminute", -2.0281482472922856),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -2.9444389791664407),
+                                    ("dayday", -2.0281482472922856),
+                                    ("<day-of-month> <named-month>day of month (premier)",
+                                     -2.9444389791664407),
+                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
+                                     -2.9444389791664407),
+                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
+                                     -2.9444389791664407),
+                                    ("<day-of-month> <named-month>intersect", -2.9444389791664407),
+                                    ("intersect<day-of-week> <day-of-month>", -2.9444389791664407)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.4274440148269396, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-week> <day-of-month>Dimanche", -3.258096538021482),
+                                    ("yearyear", -2.8526314299133175),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.8526314299133175),
+                                    ("dayday", -1.466337068793427),
+                                    ("year (latent)year (latent)", -2.8526314299133175),
+                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
+                                     -3.258096538021482),
+                                    ("hourhour", -2.8526314299133175),
+                                    ("day of month (premier)<day-of-month> <named-month>",
+                                     -3.258096538021482),
+                                    ("day of month (premier)intersect", -2.8526314299133175),
+                                    ("intersectintersect", -2.8526314299133175),
+                                    ("day of month (premier)Mercredi", -3.258096538021482),
+                                    ("intersectMercredi", -3.258096538021482),
+                                    ("<day-of-week> <day-of-month>intersect", -2.8526314299133175)],
+                               n = 15}}),
+       ("<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.21850556309818536, unseen = -6.90975328164481,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect<dim time> du matin", -6.215607598755275),
+                                    ("<hour-of-day> <integer> (as relative minutes)intersect",
+                                     -5.810142490647111),
+                                    ("<day-of-month> <named-month>d\233but de journ\233e",
+                                     -6.215607598755275),
+                                    ("hourday", -3.96431580014878),
+                                    ("<day-of-month> <named-month>year", -5.52246041819533),
+                                    ("apr\232s <time-of-day|day>le <time>", -5.29931686688112),
+                                    ("dayhour", -1.9887738534870956),
+                                    ("<datetime> - <datetime> (interval)Juillet",
+                                     -5.116995310087166),
+                                    ("daymonth", -2.749871695955549),
+                                    ("monthyear", -4.711530201979001),
+                                    ("<day-of-month> <named-month>d\233but de matin\233e",
+                                     -6.215607598755275),
+                                    ("dernier <cycle> de <time> (latent)year", -5.29931686688112),
+                                    ("apr\232s <time-of-day|day>intersect", -5.810142490647111),
+                                    ("aujourd'huimilieu d'apr\232s-midi", -6.215607598755275),
+                                    ("<day-of-month> <named-month>\224|vers <time-of-day>",
+                                     -4.711530201979001),
+                                    ("dd mmyear", -4.962844630259907),
+                                    ("Vendredi\224|vers <time-of-day>", -5.810142490647111),
+                                    ("Mercredidu|dans le <part-of-day>", -6.215607598755275),
+                                    ("aujourd'huifin d'apr\232s-midi", -6.215607598755275),
+                                    ("day of month (premier)Novembre", -5.52246041819533),
+                                    ("le <day-of-month> (non ordinal)<dim time> du matin",
+                                     -6.215607598755275),
+                                    ("aujourd'huimilieu de matin\233e", -6.215607598755275),
+                                    ("hh(:|h)mm (time-of-day)<day-of-week> <day-of-month>",
+                                     -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)Fevrier", -4.13616605707544),
+                                    ("Lundiday of month (premier)", -5.810142490647111),
+                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
+                                     -5.52246041819533),
+                                    ("<hour-of-day> et quart<dim time> <part-of-day>",
+                                     -5.810142490647111),
+                                    ("le <time>du|dans le <part-of-day>", -5.52246041819533),
+                                    ("aujourd'huifin de matin\233e", -6.215607598755275),
+                                    ("Marsyear", -5.810142490647111),
+                                    ("aujourd'huifin de soir\233e", -6.215607598755275),
+                                    ("\224|vers <time-of-day>ce <part-of-day>", -5.52246041819533),
+                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
+                                     -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)<dim time> du soir",
+                                     -5.52246041819533),
+                                    ("intersectSeptembre", -5.810142490647111),
+                                    ("aujourd'huid\233but de soir\233e", -6.215607598755275),
+                                    ("<day-of-week> <day-of-month>Fevrier", -5.810142490647111),
+                                    ("<hour-of-day> et demice <part-of-day>", -5.810142490647111),
+                                    ("<dim time> <part-of-day>apr\232s <time-of-day|day>",
+                                     -6.215607598755275),
+                                    ("le <time>fin de matin\233e", -6.215607598755275),
+                                    ("Jeudide <time-of-day> - <time-of-day> (interval)",
+                                     -5.810142490647111),
+                                    ("day of month (premier)Mars", -5.29931686688112),
+                                    ("intersectmilieu de journ\233e", -6.215607598755275),
+                                    ("intersectfin de journ\233e", -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
+                                     -6.215607598755275),
+                                    ("Octobreyear", -5.29931686688112),
+                                    ("Jeudiapr\232s <time-of-day|day>", -5.29931686688112),
+                                    ("Fevrierd\233but de matin\233e", -6.215607598755275),
+                                    ("de <datetime> - <datetime> (interval)Juillet",
+                                     -5.810142490647111),
+                                    ("<hour-of-day> <integer> (as relative minutes)<day-of-week> <day-of-month>",
+                                     -6.215607598755275),
+                                    ("monthhour", -4.075541435259004),
+                                    ("Marsintersect", -6.215607598755275),
+                                    ("Lundile <cycle> prochain|suivant|d'apr\232s",
+                                     -6.215607598755275),
+                                    ("le <time>fin d'apr\232s-midi", -6.215607598755275),
+                                    ("hourmonth", -4.711530201979001),
+                                    ("<time-of-day> heuresle <time>", -4.711530201979001),
+                                    ("dayday", -3.8642323415917974),
+                                    ("Septembreyear", -5.810142490647111),
+                                    ("aujourd'hui<hour-of-day> <integer> (as relative minutes)",
+                                     -5.810142490647111),
+                                    ("hourhour", -3.68987895444702),
+                                    ("Fevrierd\233but d'apr\232s-midi", -6.215607598755275),
+                                    ("<day-of-week> <day-of-month>\224|vers <time-of-day>",
+                                     -5.116995310087166),
+                                    ("<day-of-week> <day-of-month>Septembre", -6.215607598755275),
+                                    ("le <time>intersect", -5.810142490647111),
+                                    ("\224|vers <time-of-day><dim time> <part-of-day>",
+                                     -6.215607598755275),
+                                    ("aujourd'huiau d\233jeuner", -6.215607598755275),
+                                    ("du dd au dd (interval) (latent month)Juillet",
+                                     -5.52246041819533),
+                                    ("Vendrediday of month (premier)", -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)Avril", -6.215607598755275),
+                                    ("<time-of-day> heuresintersect", -5.29931686688112),
+                                    ("<hour-of-day> et quartce <part-of-day>", -5.810142490647111),
+                                    ("Jeudi\224|vers <time-of-day>", -6.215607598755275),
+                                    ("dayyear", -3.817712325956905),
+                                    ("le <day-of-month> (non ordinal)Juin", -6.215607598755275),
+                                    ("Lundice|dans le <cycle>", -6.215607598755275),
+                                    ("apr\232s-demain\224|vers <time-of-day>", -5.810142490647111),
+                                    ("intersectfin d'apr\232s-midi", -6.215607598755275),
+                                    ("le <ordinal> <cycle> de <time>year", -6.215607598755275),
+                                    ("intersectmilieu d'apr\232s-midi", -6.215607598755275),
+                                    ("<hour-of-day> <integer> (as relative minutes)Jeudi",
+                                     -6.215607598755275),
+                                    ("le <time>milieu de journ\233e", -6.215607598755275),
+                                    ("aujourd'huid\233but de journ\233e", -6.215607598755275),
+                                    ("demain\224|vers <time-of-day>", -5.810142490647111),
+                                    ("le <day-of-month> (non ordinal)Mars", -4.829313237635384),
+                                    ("le <day-of-month> (non ordinal)intersect",
+                                     -3.7732605633860707),
+                                    ("hourminute", -6.215607598755275),
+                                    ("dd-dd <month>(interval)year", -6.215607598755275),
+                                    ("intersect<day-of-month> <named-month>", -5.810142490647111),
+                                    ("<hour-of-day> <integer> (as relative minutes)Samedi",
+                                     -6.215607598755275),
+                                    ("minutemonth", -5.810142490647111),
+                                    ("minutehour", -4.6061696863211745),
+                                    ("Lundidu|dans le <part-of-day>", -6.215607598755275),
+                                    ("aujourd'huimilieu de journ\233e", -6.215607598755275),
+                                    ("Vendrediapr\232s <time-of-day|day>", -6.215607598755275),
+                                    ("Mars\224|vers <time-of-day>", -5.52246041819533),
+                                    ("intersectd\233but de soir\233e", -6.215607598755275),
+                                    ("Mardile <cycle> prochain|suivant|d'apr\232s",
+                                     -5.52246041819533),
+                                    ("aujourd'huifin de journ\233e", -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)Octobre", -6.215607598755275),
+                                    ("intersectdu|dans le <part-of-day>", -4.4238481295272205),
+                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
+                                     -5.810142490647111),
+                                    ("hh(:|h)mm (time-of-day)Jeudi", -6.215607598755275),
+                                    ("le <time>Juillet", -6.215607598755275),
+                                    ("Lundi<day-of-month> <named-month>", -6.215607598755275),
+                                    ("Mercredile <cycle> prochain|suivant|d'apr\232s",
+                                     -5.52246041819533),
+                                    ("Lundifin d'apr\232s-midi", -5.810142490647111),
+                                    ("Lundile <time>", -5.810142490647111),
+                                    ("Mardi<named-month|named-day> suivant|d'apr\232s",
+                                     -5.810142490647111),
+                                    ("Mars<dim time> du matin", -6.215607598755275),
+                                    ("le <time>Novembre", -5.52246041819533),
+                                    ("intersectd\233but d'apr\232s-midi", -6.215607598755275),
+                                    ("<datetime> - <datetime> (interval)Jeudi", -5.29931686688112),
+                                    ("Mercredi<named-month|named-day> suivant|d'apr\232s",
+                                     -5.810142490647111),
+                                    ("<time-of-day> - <time-of-day> (interval)Jeudi",
+                                     -4.962844630259907),
+                                    ("Samedi<day-of-month> <named-month>", -6.215607598755275),
+                                    ("<time-of-day> heuresce <time>", -6.215607598755275),
+                                    ("le <time>d\233but d'apr\232s-midi", -6.215607598755275),
+                                    ("day of month (premier)Juillet", -5.52246041819533),
+                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
+                                     -5.810142490647111),
+                                    ("Fevriermilieu d'apr\232s-midi", -6.215607598755275),
+                                    ("Mercredi\224|vers <time-of-day>", -6.215607598755275),
+                                    ("intersectNovembre", -4.962844630259907),
+                                    ("le <time><dim time> du matin", -6.215607598755275),
+                                    ("Fevrierfin d'apr\232s-midi", -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
+                                     -4.711530201979001),
+                                    ("<day-of-month> <named-month>d\233but de soir\233e",
+                                     -6.215607598755275),
+                                    ("hierdu|dans le <part-of-day>", -6.215607598755275),
+                                    ("le <time>d\233but de soir\233e", -6.215607598755275),
+                                    ("Mercredice|dans le <cycle>", -6.215607598755275),
+                                    ("Fevrierfin de soir\233e", -6.215607598755275),
+                                    ("Mardice|dans le <cycle>", -6.215607598755275),
+                                    ("dayminute", -4.6061696863211745),
+                                    ("intersectd\233but de journ\233e", -6.215607598755275),
+                                    ("<ordinal> <cycle> de <time>year", -5.810142490647111),
+                                    ("Fevriermilieu de matin\233e", -6.215607598755275),
+                                    ("le <time>\224|vers <time-of-day>", -5.116995310087166),
+                                    ("<day-of-month> <named-month><dim time> du matin",
+                                     -6.215607598755275),
+                                    ("intersectyear", -5.52246041819533),
+                                    ("Fevrierfin de matin\233e", -6.215607598755275),
+                                    ("minuteday", -3.4747675748300746),
+                                    ("le <time>d\233but de matin\233e", -6.215607598755275),
+                                    ("Mardile <time>", -4.829313237635384),
+                                    ("aujourd'hui\224|vers <time-of-day>", -5.29931686688112),
+                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
+                                     -6.215607598755275),
+                                    ("day of month (premier)intersect", -6.215607598755275),
+                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
+                                     -6.215607598755275),
+                                    ("day of month (premier)Janvier", -6.215607598755275),
+                                    ("le <time>milieu de matin\233e", -6.215607598755275),
+                                    ("aujourd'huid\233but de matin\233e", -5.116995310087166),
+                                    ("Fevrierd\233but de soir\233e", -6.215607598755275),
+                                    ("apr\232s <time-of-day|day>Jeudi", -5.810142490647111),
+                                    ("Mercredile <time>", -4.829313237635384),
+                                    ("le <time>fin de soir\233e", -6.215607598755275),
+                                    ("de <time-of-day> - <time-of-day> (interval)Jeudi",
+                                     -5.29931686688112),
+                                    ("<day-of-month> <named-month>milieu de matin\233e",
+                                     -6.215607598755275),
+                                    ("<day-of-month> <named-month>fin de soir\233e",
+                                     -6.215607598755275),
+                                    ("<day-of-month> <named-month>fin de matin\233e",
+                                     -6.215607598755275),
+                                    ("<time-of-day> heuresce <part-of-day>", -5.810142490647111),
+                                    ("Mercredi<day-of-month> <named-month>", -6.215607598755275),
+                                    ("aujourd'huid\233but d'apr\232s-midi", -6.215607598755275),
+                                    ("le <time>milieu d'apr\232s-midi", -6.215607598755275),
+                                    ("apr\232s <time-of-day|day>Novembre", -5.52246041819533),
+                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
+                                     -5.116995310087166),
+                                    ("entre <time-of-day> et <time-of-day> (interval)Jeudi",
+                                     -5.810142490647111),
+                                    ("intersectintersect", -6.215607598755275),
+                                    ("dayweek", -4.018383021419056),
+                                    ("entre <datetime> et <datetime> (interval)Juillet",
+                                     -5.810142490647111),
+                                    ("intersectMars", -6.215607598755275),
+                                    ("weekyear", -4.829313237635384),
+                                    ("le <time>Mars", -5.810142490647111),
+                                    ("apr\232s le <day-of-month>Mars", -6.215607598755275),
+                                    ("hh(:|h)mm (time-of-day)intersect", -5.810142490647111),
+                                    ("<day-of-month> <named-month>fin de journ\233e",
+                                     -6.215607598755275),
+                                    ("<day-of-month> <named-month>milieu de journ\233e",
+                                     -6.215607598755275),
+                                    ("le <time>fin de journ\233e", -6.215607598755275),
+                                    ("dd/-mm\224|vers <time-of-day>", -5.810142490647111),
+                                    ("intersectfin de matin\233e", -6.215607598755275),
+                                    ("Fevrierd\233but de journ\233e", -6.215607598755275),
+                                    ("Vendrediintersect", -6.215607598755275),
+                                    ("<day-of-month> <named-month>intersect", -6.215607598755275),
+                                    ("intersectfin de soir\233e", -6.215607598755275),
+                                    ("intersectmilieu de matin\233e", -6.215607598755275),
+                                    ("intersect\224|vers <time-of-day>", -5.52246041819533),
+                                    ("le <time>year", -4.711530201979001),
+                                    ("hh(:|h)mm (time-of-day)Samedi", -6.215607598755275),
+                                    ("le <day-of-month> (non ordinal)apr\232s <time-of-day|day>",
+                                     -6.215607598755275),
+                                    ("Fevrierfin de journ\233e", -6.215607598755275),
+                                    ("Fevriermilieu de journ\233e", -6.215607598755275),
+                                    ("le <time>d\233but de journ\233e", -6.215607598755275),
+                                    ("intersectd\233but de matin\233e", -6.215607598755275)],
+                               n = 389},
+                   koData =
+                     ClassData{prior = -1.6282080151160907, unseen = -6.025865973825314,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("demain<time-of-day> heures", -5.330300412401088),
+                                    ("hourday", -3.1902342489048165),
+                                    ("<day-of-month> <named-month>year", -5.330300412401088),
+                                    ("demainavant <time-of-day>", -5.330300412401088),
+                                    ("dayhour", -2.804571768092832),
+                                    ("<time-of-day> - <time-of-day> (interval)Juillet",
+                                     -4.414009680526933),
+                                    ("Jeudi<time-of-day> - <time-of-day> (interval)",
+                                     -4.924835304292923),
+                                    ("daymonth", -3.944006051281197),
+                                    ("monthyear", -4.637153231841142),
+                                    ("le <cycle> de <time>Octobre", -4.924835304292923),
+                                    ("houryear", -5.330300412401088),
+                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
+                                     -4.637153231841142),
+                                    ("le <time>du|dans le <part-of-day>", -4.924835304292923),
+                                    ("Marsyear", -5.330300412401088),
+                                    ("Dimanche<day-of-month> <named-month>", -4.924835304292923),
+                                    ("<time-of-day> heuresle <day-of-month> (non ordinal)",
+                                     -4.414009680526933),
+                                    ("<dim time> <part-of-day>apr\232s <time-of-day|day>",
+                                     -5.330300412401088),
+                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
+                                     -5.330300412401088),
+                                    ("Jeudiapr\232s <time-of-day|day>", -4.924835304292923),
+                                    ("aujourd'huidu|dans le <part-of-day>", -4.924835304292923),
+                                    ("de <datetime> - <datetime> (interval)Juillet",
+                                     -4.924835304292923),
+                                    ("monthhour", -3.944006051281197),
+                                    ("hourmonth", -3.944006051281197),
+                                    ("Vendredi<time-of-day> - <time-of-day> (interval)",
+                                     -4.07753744390572),
+                                    ("dayday", -3.7208624999669873),
+                                    ("Septembreyear", -5.330300412401088),
+                                    ("hourhour", -3.7208624999669873),
+                                    ("\224|vers <time-of-day>Jeudi", -4.637153231841142),
+                                    ("dayyear", -4.231688123732978),
+                                    ("demain\224|vers <time-of-day>", -4.924835304292923),
+                                    ("\224|vers <time-of-day>demain", -5.330300412401088),
+                                    ("Mars\224|vers <time-of-day>", -4.231688123732978),
+                                    ("Lundi<datetime> - <datetime> (interval)", -4.924835304292923),
+                                    ("intersect by 'de' or ','year", -4.924835304292923),
+                                    ("apr\232s <time-of-day|day>le <day-of-month> (non ordinal)",
+                                     -4.924835304292923),
+                                    ("hh(:|h)mm (time-of-day)Jeudi", -5.330300412401088),
+                                    ("weekmonth", -4.924835304292923),
+                                    ("le <day-of-month> (non ordinal)Juillet", -4.924835304292923),
+                                    ("le <day-of-month> (non ordinal)year", -4.924835304292923),
+                                    ("<time-of-day> - <time-of-day> (interval)Septembre",
+                                     -5.330300412401088),
+                                    ("Samedi<time-of-day> - <time-of-day> (interval)",
+                                     -4.924835304292923),
+                                    ("<time-of-day> heuresdd/-mm", -5.330300412401088),
+                                    ("<hour-of-day> et quartdemain", -4.924835304292923),
+                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
+                                     -4.924835304292923),
+                                    ("yearmonth", -5.330300412401088),
+                                    ("intersectyear", -5.330300412401088),
+                                    ("minuteday", -4.414009680526933),
+                                    ("Mardile <time>", -5.330300412401088),
+                                    ("Fevrierdu|dans le <part-of-day>", -4.924835304292923),
+                                    ("aujourd'hui\224|vers <time-of-day>", -4.924835304292923),
+                                    ("Mercredile <time>", -5.330300412401088),
+                                    ("le <day-of-month> (non ordinal)avant <time-of-day>",
+                                     -5.330300412401088),
+                                    ("Mercredi<day-of-month> <named-month>", -4.637153231841142),
+                                    ("<day-of-week> <day-of-month>Juillet", -4.231688123732978),
+                                    ("<time-of-day> - <time-of-day> (interval)intersect",
+                                     -5.330300412401088),
+                                    ("Fevrieryear", -5.330300412401088),
+                                    ("Jeudi<time-of-day> heures", -4.924835304292923),
+                                    ("avant <time-of-day>Jeudi", -5.330300412401088),
+                                    ("<dim time> <part-of-day><time-of-day> heures",
+                                     -5.330300412401088),
+                                    ("<time-of-day> heuresJeudi", -4.231688123732978)],
+                               n = 95}}),
+       ("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 = -8.701137698962981e-2,
+                               unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)<time-of-day> heures", -1.7227665977411035),
+                                    ("integer (numeric)<dim time> du soir", -2.639057329615259),
+                                    ("integer (numeric)intersect", -2.2335922215070942),
+                                    ("integer (numeric)<dim time> du matin", -2.639057329615259),
+                                    ("hour", -0.8472978603872037),
+                                    ("integer (numeric)time-of-day (latent)", -1.9459101490553135)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("integer (numeric)time-of-day (latent)", -1.3862943611198906)],
+                               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}}),
+       ("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 = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1823215567939546),
+                                    ("number (0..16)", -1.791759469228055)],
+                               n = 10}}),
+       ("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
+                                   [("intersectMercrediinteger (numeric)Juillet",
+                                     -1.9459101490553135),
+                                    ("day of month (premier)Mercrediinteger (numeric)Juillet",
+                                     -1.9459101490553135),
+                                    ("daydaymonth", -1.252762968495368),
+                                    ("<day-of-week> <day-of-month>Dimancheinteger (numeric)Juillet",
+                                     -1.9459101490553135)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)Dimancheinteger (numeric)Juillet",
+                                     -1.791759469228055),
+                                    ("hourdaymonth", -1.791759469228055),
+                                    ("year (latent)Dimancheinteger (numeric)Juillet",
+                                     -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.35863380842406534, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.53101798043249e-2),
+                                    ("number (17..19)", -3.3141860046725258),
+                                    ("number (0..16)", -3.3141860046725258)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -1.1994169877900753, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3677247801253174),
+                                    ("numbers 22..29 32..39 .. 52..59", -1.6486586255873816),
+                                    ("number (0..16)", -2.5649493574615367)],
+                               n = 22}}),
+       ("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.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.40546510810816444),
+                                    ("numbers 22..29 32..39 .. 52..59", -2.1972245773362196),
+                                    ("number (0..16)", -1.5040773967762742)],
+                               n = 15}}),
+       ("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.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectMercrediinteger (numeric)Juillet",
+                                     -1.9924301646902063),
+                                    ("<day-of-week> <day-of-month>Dimancheordinal (digits)Juillet",
+                                     -2.3978952727983707),
+                                    ("day of month (premier)Mercrediinteger (numeric)Juillet",
+                                     -1.7047480922384253),
+                                    ("daydaymonth", -0.8938178760220964),
+                                    ("<day-of-week> <day-of-month>Mercrediordinal (digits)Juillet",
+                                     -2.3978952727983707),
+                                    ("<day-of-week> <day-of-month>Dimancheinteger (numeric)Juillet",
+                                     -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<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}}),
+       ("number (17..19)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("number (0..16)number (0..16)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-week> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.3022808718729337,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Vendrediinteger (numeric)", -2.639057329615259),
+                                    ("Jeudiinteger (numeric)", -2.639057329615259),
+                                    ("Lundiinteger (numeric)", -2.639057329615259),
+                                    ("day", -0.8472978603872037),
+                                    ("Mercrediinteger (numeric)", -1.9459101490553135),
+                                    ("Samediinteger (numeric)", -2.128231705849268),
+                                    ("Vendredinumber (0..16)", -2.639057329615259)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -1.3437347467010947, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Dimancheinteger (numeric)", -1.6094379124341003),
+                                    ("Lundiinteger (numeric)", -1.8971199848858813),
+                                    ("day", -1.0498221244986778),
+                                    ("Mercrediinteger (numeric)", -2.3025850929940455)],
+                               n = 6}}),
+       ("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.23293155768037255, 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.5712166996139025,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -2.3978952727983707),
+                                    ("hh(:|h)mm (time-of-day)", -2.6855773452501515),
+                                    ("hour", -1.3862943611198906), ("minute", -1.8382794848629478),
+                                    ("<time-of-day> heures", -1.4816045409242156),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.6855773452501515)],
+                               n = 16}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22}}),
+       ("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 = -2.941388520629334e-2,
+                               unseen = -5.278114659230518,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mercredisoir", -4.579852378003801),
+                                    ("<day-of-month> <named-month>d\233but de journ\233e",
+                                     -4.579852378003801),
+                                    ("dayhour", -1.05349185338764),
+                                    ("<day-of-month> <named-month>d\233but de matin\233e",
+                                     -4.579852378003801),
+                                    ("aujourd'huimilieu d'apr\232s-midi", -4.579852378003801),
+                                    ("Mercredidu|dans le <part-of-day>", -4.579852378003801),
+                                    ("aujourd'huifin d'apr\232s-midi", -4.579852378003801),
+                                    ("aujourd'huimilieu de matin\233e", -4.579852378003801),
+                                    ("le <time>du|dans le <part-of-day>", -4.174387269895637),
+                                    ("aujourd'huifin de matin\233e", -4.579852378003801),
+                                    ("aujourd'huifin de soir\233e", -4.579852378003801),
+                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
+                                     -4.579852378003801),
+                                    ("demainsoir", -4.579852378003801),
+                                    ("aujourd'huid\233but de soir\233e", -4.579852378003801),
+                                    ("Lundimatin", -4.579852378003801),
+                                    ("le <time>fin de matin\233e", -4.579852378003801),
+                                    ("intersectmilieu de journ\233e", -4.579852378003801),
+                                    ("intersectfin de journ\233e", -4.579852378003801),
+                                    ("le <time>fin d'apr\232s-midi", -4.579852378003801),
+                                    ("aujourd'huiau d\233jeuner", -4.579852378003801),
+                                    ("intersectfin d'apr\232s-midi", -4.579852378003801),
+                                    ("intersectmilieu d'apr\232s-midi", -4.579852378003801),
+                                    ("le <time>milieu de journ\233e", -4.579852378003801),
+                                    ("aujourd'huid\233but de journ\233e", -4.579852378003801),
+                                    ("demainapr\232s-midi", -4.579852378003801),
+                                    ("Lundidu|dans le <part-of-day>", -4.579852378003801),
+                                    ("aujourd'huimilieu de journ\233e", -4.579852378003801),
+                                    ("intersectd\233but de soir\233e", -4.579852378003801),
+                                    ("aujourd'huifin de journ\233e", -4.579852378003801),
+                                    ("intersectdu|dans le <part-of-day>", -4.174387269895637),
+                                    ("Lundifin d'apr\232s-midi", -4.174387269895637),
+                                    ("intersectd\233but d'apr\232s-midi", -4.579852378003801),
+                                    ("le <time>d\233but d'apr\232s-midi", -4.579852378003801),
+                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
+                                     -4.174387269895637),
+                                    ("<day-of-month> <named-month>d\233but de soir\233e",
+                                     -4.579852378003801),
+                                    ("hierdu|dans le <part-of-day>", -4.579852378003801),
+                                    ("le <time>d\233but de soir\233e", -4.579852378003801),
+                                    ("intersectd\233but de journ\233e", -4.579852378003801),
+                                    ("le <time>d\233but de matin\233e", -4.579852378003801),
+                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
+                                     -4.579852378003801),
+                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
+                                     -4.579852378003801),
+                                    ("le <time>milieu de matin\233e", -4.579852378003801),
+                                    ("aujourd'huid\233but de matin\233e", -3.481240089335692),
+                                    ("le <time>fin de soir\233e", -4.579852378003801),
+                                    ("<day-of-month> <named-month>milieu de matin\233e",
+                                     -4.579852378003801),
+                                    ("<day-of-month> <named-month>fin de soir\233e",
+                                     -4.579852378003801),
+                                    ("<day-of-month> <named-month>fin de matin\233e",
+                                     -4.579852378003801),
+                                    ("aujourd'huid\233but d'apr\232s-midi", -4.579852378003801),
+                                    ("le <time>milieu d'apr\232s-midi", -4.579852378003801),
+                                    ("Jeudimatin", -4.579852378003801),
+                                    ("<day-of-month> <named-month>fin de journ\233e",
+                                     -4.579852378003801),
+                                    ("<day-of-month> <named-month>milieu de journ\233e",
+                                     -4.579852378003801),
+                                    ("le <time>fin de journ\233e", -4.579852378003801),
+                                    ("Lundiapr\232s-midi", -4.579852378003801),
+                                    ("intersectfin de matin\233e", -4.579852378003801),
+                                    ("intersectfin de soir\233e", -4.579852378003801),
+                                    ("intersectmilieu de matin\233e", -4.579852378003801),
+                                    ("le <time>d\233but de journ\233e", -4.579852378003801),
+                                    ("intersectd\233but de matin\233e", -4.579852378003801),
+                                    ("hiersoir", -4.579852378003801)],
+                               n = 67},
+                   koData =
+                     ClassData{prior = -3.5409593240373143, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.0757749812275272),
+                                    ("aujourd'huidu|dans le <part-of-day>", -3.0757749812275272)],
+                               n = 2}}),
+       ("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.2803019651541584),
+                                    ("number (0..16)", -1.4087672169719492)],
+                               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 = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.0986122886681098),
+                                    ("<day-of-month> <named-month>", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.0986122886681098),
+                                    ("year", -1.0986122886681098)],
+                               n = 1}}),
+       ("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}}),
+       ("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 = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)Juillet",
+                                     -1.252762968495368),
+                                    ("month", -0.8472978603872037),
+                                    ("integer (numeric)number (0..16)Juillet", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               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.22738984219566089,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
+                   koData =
+                     ClassData{prior = -1.5926307941177191, 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 = -1.791759469228055, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.3862943611198906),
+                                    ("Dimanche", -1.3862943611198906)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -2.0794415416798357),
+                                    ("en semaine", -1.6739764335716716),
+                                    ("day", -1.1631508098056809), ("year", -2.0794415416798357),
+                                    ("le <time>", -1.6739764335716716)],
+                               n = 5}}),
+       ("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 = -5.715841383994864e-2,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -2.890371757896165, 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.9858167945227653, unseen = -4.418840607796598,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("demain<time-of-day> heures", -3.713572066704308),
+                                    ("day of month (premier)<day-of-week> <day-of-month>",
+                                     -3.0204248861443626),
+                                    ("dayhour", -3.3081069585961433),
+                                    ("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
+                                     -3.3081069585961433),
+                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
+                                     -3.713572066704308),
+                                    ("minuteminute", -2.0088239744658827),
+                                    ("<day-of-month> <named-month><day-of-month> <named-month>",
+                                     -3.3081069585961433),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -3.0204248861443626),
+                                    ("dayday", -1.9218125974762528),
+                                    ("<day-of-month> <named-month>day of month (premier)",
+                                     -3.3081069585961433),
+                                    ("minutehour", -3.3081069585961433),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.713572066704308),
+                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
+                                     -3.0204248861443626),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.713572066704308),
+                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
+                                     -3.3081069585961433),
+                                    ("<day-of-month> <named-month>intersect", -3.3081069585961433),
+                                    ("intersect<day-of-week> <day-of-month>", -3.3081069585961433)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -0.4670230011075977, unseen = -4.762173934797756,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
+                                     -3.654977902438255),
+                                    ("monthday", -2.8076800420510515),
+                                    ("<day-of-week> <day-of-month>Dimanche", -3.654977902438255),
+                                    ("Juinintersect", -3.654977902438255),
+                                    ("minuteminute", -3.654977902438255),
+                                    ("dayday", -1.4577533251020356),
+                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
+                                     -3.367295829986474),
+                                    ("day of month (premier)<day-of-month> <named-month>",
+                                     -3.367295829986474),
+                                    ("minutehour", -2.5563656137701454),
+                                    ("Juillet<day-of-month> <named-month>", -3.654977902438255),
+                                    ("<day-of-week> <day-of-month>Mercredi", -4.060443010546419),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.367295829986474),
+                                    ("day of month (premier)intersect", -2.8076800420510515),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.367295829986474),
+                                    ("intersectintersect", -3.144152278672264),
+                                    ("Juinday of month (premier)", -3.654977902438255),
+                                    ("hh(:|h)mm (time-of-day)intersect", -3.654977902438255),
+                                    ("day of month (premier)Mercredi", -3.367295829986474),
+                                    ("intersectMercredi", -3.654977902438255),
+                                    ("<day-of-week> <day-of-month>intersect", -3.654977902438255)],
+                               n = 42}}),
+       ("<day-of-month> <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -4.718498871295094,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Juin", -3.3232358401924436),
+                                    ("integer (numeric)Juillet", -3.100092288878234),
+                                    ("integer (numeric)Octobre", -3.100092288878234),
+                                    ("integer (numeric)Avril", -3.6109179126442243),
+                                    ("integer (numeric)Fevrier", -1.5740359853831845),
+                                    ("month", -0.7582864827309068),
+                                    ("integer (numeric)Septembre", -4.0163830207523885),
+                                    ("integer (numeric)Mars", -1.936941479072553)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..16)Juillet", -2.374905754573672),
+                                    ("integer (numeric)Juillet", -1.1962507582320256),
+                                    ("month", -0.8708283577973976),
+                                    ("integer (numeric)Septembre", -3.068052935133617),
+                                    ("integer (numeric)Mars", -3.068052935133617)],
+                               n = 17}}),
+       ("du dd/nth au dd/nth month (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)number (0..16)Juillet", -1.6094379124341003),
+                                    ("ordinal (digits)integer (numeric)Juillet",
+                                     -1.6094379124341003),
+                                    ("number (0..16)integer (numeric)Juillet", -1.6094379124341003),
+                                    ("month", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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.2595426554807467, 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.3337731796520479, unseen = -4.804021044733257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)time-of-day (latent)",
+                                     -1.6602963296675914),
+                                    ("hourhour", -1.2694300209805798),
+                                    ("minutehour", -1.751268107873318),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -3.004031076368686),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.186352633162641),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.186352633162641),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -2.716349003916905),
+                                    ("time-of-day (latent)<time-of-day> heures",
+                                     -2.3108838958087405)],
+                               n = 53}}),
+       ("<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}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.0498221244986778,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.4307829160924542, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13}}),
+       ("avant <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.6739764335716716),
+                                    ("hour", -1.1631508098056809),
+                                    ("<time-of-day> heures", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.772588722239781),
+                                    ("hh(:|h)mm (time-of-day)", -2.772588722239781),
+                                    ("time-of-day (latent)", -1.8562979903656263),
+                                    ("au d\233jeuner", -2.772588722239781),
+                                    ("hour", -1.067840630001356), ("minute", -2.367123614131617),
+                                    ("<time-of-day> heures", -1.8562979903656263),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.772588722239781)],
+                               n = 12}}),
+       ("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
+                                   [("apr\232s <time-of-day|day>", -3.871201010907891),
+                                    ("time-of-day (latent)", -0.7576857016975165),
+                                    ("hour", -0.7036184804272406),
+                                    ("avant <time-of-day>", -4.1588830833596715)],
+                               n = 94},
+                   koData =
+                     ClassData{prior = -1.9832976811269336,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("apr\232s <time-of-day|day>", -1.916922612182061),
+                                    ("time-of-day (latent)", -1.4469189829363254),
+                                    ("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.22440062250426085, unseen = -5.84354441703136,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5825451193519164),
+                                    ("<named-month|named-day> suivant|d'apr\232s",
+                                     -3.643417080037179),
+                                    ("<ordinal> <cycle> de <time>", -4.454347296253507),
+                                    ("premi\232re quinzaine de <named-month>(interval)",
+                                     -5.147494476813453),
+                                    ("intersect", -2.229723744729174),
+                                    ("soir de no\235l", -5.147494476813453),
+                                    ("en semaine", -3.442746384575028),
+                                    ("toussaint", -4.742029368705289), ("day", -1.2973468751033945),
+                                    ("deuxi\232me quinzaine de <named-month>(interval)",
+                                     -5.147494476813453),
+                                    ("<dim time> <part-of-day>", -3.2015843277581397),
+                                    ("dd/-mm", -3.894731508318085),
+                                    ("dd/-mm/-yyyy", -4.454347296253507),
+                                    ("dd mm yyyy", -3.894731508318085),
+                                    ("day of month (premier)", -3.894731508318085),
+                                    ("dd mm", -3.894731508318085), ("hour", -2.177080011243752),
+                                    ("month", -4.454347296253507),
+                                    ("dernier <cycle> de <time> (latent)", -4.231203744939298),
+                                    ("<day-of-month> <named-month>", -2.5825451193519164),
+                                    ("<cycle> prochain|suivant|d'apr\232s", -2.7961192196499756),
+                                    ("dernier week-end de <time>", -5.147494476813453),
+                                    ("<ordinal> week-end de <time>", -4.742029368705289),
+                                    ("<cycle> dernier", -4.048882188145344)],
+                               n = 159},
+                   koData =
+                     ClassData{prior = -1.604425370610556, 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.3312345839368633), ("dd/-mm", -3.2771447329921766),
+                                    ("<named-month|named-day> dernier|pass\233",
+                                     -3.5648268054439574),
+                                    ("day of month (premier)", -3.970291913552122),
+                                    ("dd mm", -3.2771447329921766), ("hour", -2.0243817644968085),
+                                    ("<day-of-month> <named-month>", -3.5648268054439574),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.178532444324067)],
                                n = 40}}),
        ("apr\232s le <day-of-month>",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/HE_XX.hs b/Duckling/Ranking/Classifiers/HE_XX.hs
--- a/Duckling/Ranking/Classifiers/HE_XX.hs
+++ b/Duckling/Ranking/Classifiers/HE_XX.hs
@@ -230,88 +230,87 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -4.867534450455582,
+                     ClassData{prior = -0.37320424588994294,
+                               unseen = -4.859812404361672,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourday", -2.662587827025453),
-                                    ("daymonth", -3.250374491927572),
-                                    ("monthyear", -3.7612001156935624),
+                                   [("hourday", -2.6548056865833978),
+                                    ("daymonth", -3.242592351485517),
+                                    ("monthyear", -3.7534179752515073),
                                     ("the <day-of-month> (ordinal)in <named-month>",
-                                     -3.7612001156935624),
+                                     -3.7534179752515073),
                                     ("\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),
+                                     -4.1588830833596715),
+                                    ("intersect<time-of-day> am|pm", -4.1588830833596715),
+                                    ("<time> <part-of-day>\1489 <named-day>", -3.4657359027997265),
+                                    ("intersect by \",\"<time-of-day> am|pm", -3.242592351485517),
+                                    ("last <day-of-week> of <time>year", -4.1588830833596715),
+                                    ("dayday", -2.772588722239781),
                                     ("the <day-of-month> (ordinal)\1489 <date>",
-                                     -3.7612001156935624),
-                                    ("dayyear", -2.374905754573672),
+                                     -3.7534179752515073),
+                                    ("dayyear", -2.367123614131617),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -3.7612001156935624),
-                                    ("\1489 <date>\1489 <named-day>", -4.1666652238017265),
+                                     -3.7534179752515073),
+                                    ("\1489 <date>\1489 <named-day>", -4.1588830833596715),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.1666652238017265),
+                                     -4.1588830833596715),
                                     ("absorption of , after named day<day-of-month> (ordinal) of <named-month>",
-                                     -4.1666652238017265),
+                                     -4.1588830833596715),
                                     ("<day-of-month> (ordinal) of <named-month>year",
-                                     -3.4735180432417816),
-                                    ("named-daynext <cycle>", -4.1666652238017265),
-                                    ("dayminute", -2.780370862681836),
+                                     -3.4657359027997265),
+                                    ("named-daynext <cycle>", -4.1588830833596715),
+                                    ("dayminute", -2.772588722239781),
                                     ("named-day<day-of-month> (ordinal) of <named-month>",
-                                     -4.1666652238017265),
-                                    ("named-day\1489 <date>", -4.1666652238017265),
+                                     -4.1588830833596715),
+                                    ("named-day\1489 <date>", -4.1588830833596715),
                                     ("absorption of , after named dayintersect",
-                                     -4.1666652238017265),
+                                     -4.1588830833596715),
                                     ("named-day<day-of-month> (non ordinal) of <named-month>",
-                                     -4.1666652238017265),
+                                     -4.1588830833596715),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -3.7612001156935624),
-                                    ("year<time-of-day> am|pm", -4.1666652238017265),
-                                    ("\1489 <date>\1489 <date>", -4.1666652238017265),
+                                     -3.7534179752515073),
+                                    ("year<time-of-day> am|pm", -4.1588830833596715),
+                                    ("\1489 <date>\1489 <date>", -4.1588830833596715),
                                     ("<day-of-month> (non ordinal) of <named-month>year",
-                                     -3.4735180432417816),
+                                     -3.4657359027997265),
                                     ("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),
+                                     -4.1588830833596715),
+                                    ("dayweek", -3.7534179752515073),
+                                    ("\1502\1512\1509year", -4.1588830833596715),
+                                    ("<time> <part-of-day>\1489 <date>", -3.4657359027997265),
+                                    ("named-daythe <day-of-month> (ordinal)", -4.1588830833596715),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -3.7612001156935624),
-                                    ("yearminute", -4.1666652238017265)],
+                                     -3.7534179752515073),
+                                    ("yearminute", -4.1588830833596715)],
                                n = 42},
                    koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -4.477336814478207,
+                     ClassData{prior = -1.1664348850068706, unseen = -4.418840607796598,
                                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),
+                                   [("in <named-month>year", -3.713572066704308),
+                                    ("dayhour", -3.3081069585961433),
+                                    ("daymonth", -3.0204248861443626),
+                                    ("monthyear", -2.6149597780361984),
+                                    ("intersecthh:mm", -3.713572066704308),
+                                    ("dayday", -3.713572066704308),
+                                    ("intersect by \",\"hh:mm", -2.797281334830153),
+                                    ("\1488\1508\1512\1497\1500year", -3.713572066704308),
+                                    ("named-dayin <named-month>", -3.713572066704308),
+                                    ("dayminute", -2.327277705584417),
+                                    ("named-day\1489 <date>", -3.713572066704308),
                                     ("absorption of , after named dayintersect",
-                                     -3.7727609380946383),
-                                    ("yearhh:mm", -3.7727609380946383),
+                                     -3.713572066704308),
+                                    ("yearhh:mm", -3.713572066704308),
                                     ("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),
+                                     -3.713572066704308),
+                                    ("\1502\1512\1509year", -3.3081069585961433),
+                                    ("\1489 <date>year", -3.713572066704308),
+                                    ("named-daythe <day-of-month> (ordinal)", -3.713572066704308),
                                     ("absorption of , after named day\1497\1493\1500\1497",
-                                     -3.7727609380946383),
-                                    ("tomorrownoon", -3.367295829986474),
-                                    ("yearminute", -3.079613757534693)],
-                               n = 21}}),
+                                     -3.713572066704308),
+                                    ("tomorrownoon", -3.3081069585961433),
+                                    ("yearminute", -3.713572066704308)],
+                               n = 19}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -418,16 +417,15 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<hour-of-day> <integer>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("time-of-day (latent)integer 10", -1.7047480922384253),
-                                    ("time-of-day (latent)integer (numeric)", -1.0116009116784799),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4}}),
+                                   [("time-of-day (latent)integer 10", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
        ("ordinal 19",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -587,7 +585,7 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -1.2809338454620642,
+                     ClassData{prior = -1.0986122886681098,
                                unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
@@ -595,13 +593,14 @@
                                     ("integer 9", -1.3862943611198906)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.325422400434628, unseen = -2.833213344056216,
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.639057329615259,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.2876820724517809),
-                                    ("integer (20..90)", -2.0794415416798357),
-                                    ("integer 9", -2.0794415416798357)],
-                               n = 13}}),
+                                   [("integer (numeric)", -0.3677247801253174),
+                                    ("integer (20..90)", -1.8718021769015913),
+                                    ("integer 9", -1.8718021769015913)],
+                               n = 10}}),
        ("year",
         Classifier{okData =
                      ClassData{prior = -0.40546510810816444,
@@ -922,17 +921,6 @@
                    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,
@@ -946,6 +934,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("half",
+        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}}),
        ("ordinal 5",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
diff --git a/Duckling/Ranking/Classifiers/HR_XX.hs b/Duckling/Ranking/Classifiers/HR_XX.hs
--- a/Duckling/Ranking/Classifiers/HR_XX.hs
+++ b/Duckling/Ranking/Classifiers/HR_XX.hs
@@ -44,11 +44,12 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.9780782196398363, unseen = -4.532599493153256,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 91},
+                     ClassData{prior = -0.9456429438866826, unseen = -4.564348191467836,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 94},
                    koData =
-                     ClassData{prior = -0.471657889341762, unseen = -5.030437921392435,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 151}}),
+                     ClassData{prior = -0.49172545239257137,
+                               unseen = -5.0106352940962555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 148}}),
        ("Father's Day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -134,6 +135,7 @@
                                     ("Februarylate night", -3.8607297110405954),
                                     ("dayhour", -3.455264602932431),
                                     ("yearhour", -3.455264602932431),
+                                    ("nograinhour", -3.455264602932431),
                                     ("monthhour", -3.455264602932431),
                                     ("by <time>afternoon", -3.8607297110405954),
                                     ("after <time-of-day>morning", -3.8607297110405954),
@@ -147,7 +149,6 @@
                                     ("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),
@@ -156,12 +157,12 @@
                                n = 22}}),
        ("today",
         Classifier{okData =
-                     ClassData{prior = -1.1526795099383855,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                     ClassData{prior = -1.3350010667323402,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
                    koData =
-                     ClassData{prior = -0.3794896217049037, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13}}),
+                     ClassData{prior = -0.3053816495511819, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
        ("at <time-of-day>",
         Classifier{okData =
                      ClassData{prior = -0.1670540846631662, unseen = -3.912023005428146,
@@ -220,44 +221,49 @@
                                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,
+                     ClassData{prior = -0.3184537311185346,
+                               unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
+                                   [("hh:mmtime-of-day (latent)", -1.9924301646902063),
+                                    ("minuteminute", -1.2992829841302609),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
+                                     -2.3978952727983707),
+                                    ("hh:mmhh:mm", -1.2992829841302609),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("minutehour", -1.9924301646902063)],
+                               n = 8},
                    koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 3}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.995732273553991,
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.1780538303479458,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.1526795099383855),
+                                   [("hh:mmtime-of-day (latent)", -2.03688192726104),
+                                    ("minuteminute", -1.3437347467010947),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.2512917986064953),
-                                    ("hh:mmhh:mm", -1.1526795099383855),
-                                    ("hourhour", -2.2512917986064953)],
-                               n = 6},
+                                     -2.4423470353692043),
+                                    ("hh:mmhh:mm", -1.3437347467010947),
+                                    ("hourhour", -2.4423470353692043),
+                                    ("minutehour", -2.03688192726104)],
+                               n = 8},
                    koData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -3.1780538303479458,
+                     ClassData{prior = -0.8472978603872037, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.3437347467010947),
-                                    ("minuteminute", -1.749199854809259),
-                                    ("minutehour", -1.3437347467010947),
-                                    ("hh:mmintersect", -1.749199854809259)],
-                               n = 8}}),
+                                   [("hh:mmtime-of-day (latent)", -1.55814461804655),
+                                    ("minuteminute", -1.55814461804655),
+                                    ("minutehour", -1.55814461804655),
+                                    ("hh:mmintersect", -1.55814461804655)],
+                               n = 6}}),
        ("October",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -274,24 +280,24 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> o'clock",
         Classifier{okData =
-                     ClassData{prior = -0.7308875085427924,
-                               unseen = -3.5263605246161616,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4657359027997265,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.8870696490323797),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("until <time-of-day>", -2.803360380906535),
-                                    ("hour", -0.8574502318512216)],
+                                   [("at <time-of-day>", -1.824549292051046),
+                                    ("time-of-day (latent)", -1.2367626271489267),
+                                    ("until <time-of-day>", -2.740840023925201),
+                                    ("hour", -0.7949298748698876)],
                                n = 13},
                    koData =
-                     ClassData{prior = -0.6567795363890705, unseen = -3.58351893845611,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4657359027997265,
                                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}}),
+                                   [("time-of-day (latent)", -0.8690378470236094),
+                                    ("hour", -0.7949298748698876),
+                                    ("after <time-of-day>", -2.740840023925201)],
+                               n = 13}}),
        ("January",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
@@ -348,213 +354,197 @@
                                n = 2}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4969802169439377, unseen = -6.093569770045136,
+                     ClassData{prior = -0.44531101665536404,
+                               unseen = -6.100318952020064,
                                likelihoods =
                                  HashMap.fromList
                                    [("u <named-day><day-of-month>(ordinal) <named-month>",
-                                     -5.3981627015177525),
-                                    ("hourday", -4.992697593409589),
-                                    ("dd.mm<time-of-day> o'clock", -5.3981627015177525),
-                                    ("dayhour", -2.724014052091224),
-                                    ("daymonth", -3.606403232289698),
+                                     -5.404927101606295),
+                                    ("hourday", -4.99946199349813),
+                                    ("dd.mm<time-of-day> o'clock", -5.404927101606295),
+                                    ("dayhour", -2.730778452179766),
+                                    ("daymonth", -3.61316763237824),
                                     ("u <named-day><named-month> <day-of-month> (ordinal)",
-                                     -5.3981627015177525),
-                                    ("monthyear", -3.6934146092793276),
-                                    ("Wednesdayintersect", -5.3981627015177525),
-                                    ("christmasyear", -5.3981627015177525),
-                                    ("Wednesdaynext <cycle>", -5.3981627015177525),
-                                    ("u <named-day><time-of-day> o'clock", -5.3981627015177525),
-                                    ("<time> <part-of-day>u <named-day>", -4.011868340397862),
-                                    ("intersectat <time-of-day>", -5.3981627015177525),
-                                    ("Saturday<time> <part-of-day>", -4.992697593409589),
-                                    ("day before yesterdayat <time-of-day>", -4.705015520957807),
-                                    ("Marchyear", -5.3981627015177525),
+                                     -5.404927101606295),
+                                    ("monthyear", -3.7001790093678695),
+                                    ("Wednesdayintersect", -5.404927101606295),
+                                    ("christmasyear", -5.404927101606295),
+                                    ("Wednesdaynext <cycle>", -5.404927101606295),
+                                    ("u <named-day><time-of-day> o'clock", -5.404927101606295),
+                                    ("<time> <part-of-day>u <named-day>", -4.018632740486404),
+                                    ("intersectat <time-of-day>", -5.404927101606295),
+                                    ("Saturday<time> <part-of-day>", -4.99946199349813),
+                                    ("day before yesterdayat <time-of-day>", -4.711779921046349),
+                                    ("Marchyear", -5.404927101606295),
                                     ("<named-day> <day-of-month> (ordinal)September",
-                                     -4.992697593409589),
-                                    ("Saturdayat <time-of-day>", -4.992697593409589),
+                                     -4.99946199349813),
+                                    ("Saturdayat <time-of-day>", -4.99946199349813),
                                     ("between <time-of-day> and <time-of-day> (interval)u <named-day>",
-                                     -4.705015520957807),
+                                     -4.711779921046349),
                                     ("between <datetime> and <datetime> (interval)u <named-day>",
-                                     -4.705015520957807),
-                                    ("last <cycle>u <named-day>", -5.3981627015177525),
-                                    ("<time-of-day> o'clocktonight", -5.3981627015177525),
+                                     -4.711779921046349),
+                                    ("last <cycle>u <named-day>", -5.404927101606295),
+                                    ("<time-of-day> o'clocktonight", -5.404927101606295),
                                     ("from <datetime> - <datetime> (interval)u <named-day>",
-                                     -5.3981627015177525),
-                                    ("today<time> <part-of-day>", -4.992697593409589),
-                                    ("todayat <time-of-day>", -5.3981627015177525),
-                                    ("Thursday<time> timezone", -4.992697593409589),
+                                     -5.404927101606295),
+                                    ("today<time> <part-of-day>", -4.99946199349813),
+                                    ("todayat <time-of-day>", -5.404927101606295),
+                                    ("Thursday<time> timezone", -4.99946199349813),
                                     ("from <time-of-day> - <time-of-day> (interval)u <named-day>",
-                                     -5.3981627015177525),
-                                    ("next <cycle>u <named-day>", -5.3981627015177525),
-                                    ("dayday", -3.1468709029112576),
-                                    ("hourhour", -5.3981627015177525),
+                                     -5.404927101606295),
+                                    ("next <cycle>u <named-day>", -5.404927101606295),
+                                    ("dayday", -3.1536353029998), ("hourhour", -5.404927101606295),
                                     ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.992697593409589),
+                                     -4.99946199349813),
                                     ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.705015520957807),
-                                    ("dayyear", -3.8940853047414787),
+                                     -4.306314812938186),
+                                    ("dayyear", -3.900849704830021),
                                     ("Thursdaybetween <datetime> and <datetime> (interval)",
-                                     -4.705015520957807),
-                                    ("<time-of-day> o'clocktomorrow", -5.3981627015177525),
-                                    ("Thursday<time> <part-of-day>", -4.992697593409589),
+                                     -4.306314812938186),
+                                    ("<time-of-day> o'clocktomorrow", -5.404927101606295),
+                                    ("Thursday<time> <part-of-day>", -4.99946199349813),
                                     ("<time-of-day> - <time-of-day> (interval)u <named-day>",
-                                     -4.481871969643597),
+                                     -4.48863636973214),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.992697593409589),
+                                     -4.99946199349813),
                                     ("<datetime> - <datetime> (interval)u <named-day>",
-                                     -4.481871969643597),
+                                     -4.48863636973214),
                                     ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.011868340397862),
-                                    ("day after tomorrow<time> <part-of-day>", -5.3981627015177525),
-                                    ("Thursdayhh:mm", -4.992697593409589),
-                                    ("minutemonth", -4.481871969643597),
-                                    ("day after tomorrowat <time-of-day>", -4.992697593409589),
+                                     -4.018632740486404),
+                                    ("day after tomorrow<time> <part-of-day>", -5.404927101606295),
+                                    ("Thursdayhh:mm", -4.99946199349813),
+                                    ("minutemonth", -4.48863636973214),
+                                    ("day after tomorrowat <time-of-day>", -4.99946199349813),
                                     ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
-                                     -4.481871969643597),
+                                     -4.48863636973214),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.992697593409589),
+                                     -4.99946199349813),
                                     ("<named-day> <day-of-month> (ordinal)February",
-                                     -4.145399733022385),
-                                    ("this <cycle>u <named-day>", -4.992697593409589),
-                                    ("last <day-of-week> <time>year", -4.992697593409589),
-                                    ("dd.mmat <time-of-day>", -4.992697593409589),
+                                     -4.152164133110927),
+                                    ("this <cycle>u <named-day>", -4.99946199349813),
+                                    ("last <day-of-week> <time>year", -4.99946199349813),
+                                    ("dd.mmat <time-of-day>", -4.99946199349813),
                                     ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.481871969643597),
+                                     -4.48863636973214),
                                     ("intersect<named-month> <day-of-month> (ordinal)",
-                                     -4.992697593409589),
-                                    ("Saturday<time-of-day> o'clock", -5.3981627015177525),
+                                     -4.99946199349813),
+                                    ("Saturday<time-of-day> o'clock", -5.404927101606295),
                                     ("day before yesterday<time-of-day> o'clock",
-                                     -5.3981627015177525),
+                                     -5.404927101606295),
                                     ("<time> <part-of-day><named-day> <day-of-month> (ordinal)",
-                                     -4.481871969643597),
-                                    ("dayminute", -3.2009381241815333),
-                                    ("u <named-day>at <time-of-day>", -4.992697593409589),
-                                    ("<time> <part-of-day>intersect", -3.5263605246161616),
-                                    ("u <named-day><time> <part-of-day>", -4.992697593409589),
-                                    ("Tuesdayu <named-month>", -5.3981627015177525),
-                                    ("intersectyear", -5.3981627015177525),
-                                    ("intersectSeptember", -4.481871969643597),
-                                    ("<ordinal> <cycle> of <time>year", -5.3981627015177525),
-                                    ("minuteday", -2.102325835513424),
+                                     -4.48863636973214),
+                                    ("dayminute", -3.0070318288079245),
+                                    ("u <named-day>at <time-of-day>", -4.99946199349813),
+                                    ("<time> <part-of-day>intersect", -3.5331249247047034),
+                                    ("u <named-day><time> <part-of-day>", -4.99946199349813),
+                                    ("Tuesdayu <named-month>", -5.404927101606295),
+                                    ("intersectyear", -5.404927101606295),
+                                    ("intersectSeptember", -4.48863636973214),
+                                    ("<ordinal> <cycle> of <time>year", -5.404927101606295),
+                                    ("minuteday", -2.1090902356019656),
                                     ("absorption of , after named dayintersect",
-                                     -5.3981627015177525),
-                                    ("<time> <part-of-day>intersect by \",\"", -4.481871969643597),
-                                    ("Octoberyear", -4.299550412849643),
-                                    ("intersect by \",\"at <time-of-day>", -4.481871969643597),
+                                     -5.404927101606295),
+                                    ("<time> <part-of-day>intersect by \",\"", -4.48863636973214),
+                                    ("Octoberyear", -4.306314812938186),
+                                    ("intersect by \",\"at <time-of-day>", -4.48863636973214),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -4.299550412849643),
-                                    ("yearat <time-of-day>", -5.3981627015177525),
-                                    ("Septemberyear", -4.992697593409589),
+                                     -4.306314812938186),
+                                    ("yearat <time-of-day>", -5.404927101606295),
+                                    ("Septemberyear", -4.99946199349813),
                                     ("<time> <part-of-day>absorption of , after named day",
-                                     -4.705015520957807),
-                                    ("todaytonight", -5.3981627015177525),
-                                    ("weekday", -4.481871969643597),
-                                    ("dayweek", -5.3981627015177525),
-                                    ("weekyear", -4.992697593409589),
-                                    ("Wednesdayu <named-month>", -5.3981627015177525),
+                                     -4.711779921046349),
+                                    ("todaytonight", -5.404927101606295),
+                                    ("weekday", -4.48863636973214), ("dayweek", -5.404927101606295),
+                                    ("weekyear", -4.99946199349813),
+                                    ("Wednesdayu <named-month>", -5.404927101606295),
                                     ("u <named-day><named-month> <day-of-month> (non ordinal)",
-                                     -5.3981627015177525),
-                                    ("u <named-month>year", -4.992697593409589),
-                                    ("last <cycle> of <time>year", -4.992697593409589),
+                                     -5.404927101606295),
+                                    ("u <named-month>year", -4.99946199349813),
+                                    ("last <cycle> of <time>year", -4.99946199349813),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -5.3981627015177525),
-                                    ("yearminute", -5.3981627015177525)],
-                               n = 160},
+                                     -5.404927101606295),
+                                    ("yearminute", -5.404927101606295)],
+                               n = 164},
                    koData =
-                     ClassData{prior = -0.9374250439481288, unseen = -5.796057750765372,
+                     ClassData{prior = -1.0233888674305223, unseen = -5.71042701737487,
                                likelihoods =
                                  HashMap.fromList
-                                   [("since <time-of-day>by <time>", -4.406719247264253),
+                                   [("since <time-of-day>by <time>", -4.3208159036289855),
                                     ("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),
+                                     -5.01396308418893),
+                                    ("hourday", -5.01396308418893), ("dayhour", -3.142160907287339),
+                                    ("daymonth", -2.9990600636466658),
+                                    ("monthday", -3.915350795520821),
+                                    ("monthyear", -3.40452517175483),
+                                    ("yearhour", -4.608497976080766),
+                                    ("Wednesdayintersect", -5.01396308418893),
+                                    ("hh:mmu <named-day>", -3.915350795520821),
+                                    ("intersectat <time-of-day>", -5.01396308418893),
+                                    ("Marchyear", -4.608497976080766),
+                                    ("u <named-day>September", -5.01396308418893),
                                     ("<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),
+                                     -5.01396308418893),
+                                    ("Thursdayafter <time-of-day>", -4.097672352314775),
+                                    ("until <time-of-day>u <named-day>", -5.01396308418893),
+                                    ("since <time-of-day>u <named-day>", -4.608497976080766),
+                                    ("Sundayu <named-month>", -5.01396308418893),
+                                    ("absorption of , after named dayJuly", -4.608497976080766),
+                                    ("JanuaryWednesday", -5.01396308418893),
+                                    ("Marchintersect", -5.01396308418893),
+                                    ("dayday", -3.915350795520821),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.01396308418893),
+                                    ("monthmonth", -4.097672352314775),
+                                    ("hourhour", -5.01396308418893),
+                                    ("<time> <part-of-day>Thursday", -5.01396308418893),
+                                    ("dayyear", -4.3208159036289855),
+                                    ("Thursday<time> <part-of-day>", -4.608497976080766),
                                     ("<time-of-day> - <time-of-day> (interval)u <named-day>",
-                                     -5.099866427824199),
-                                    ("FebruaryWednesday", -5.099866427824199),
-                                    ("monthminute", -5.099866427824199),
+                                     -5.01396308418893),
+                                    ("FebruaryWednesday", -5.01396308418893),
+                                    ("monthminute", -5.01396308418893),
                                     ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -5.099866427824199),
-                                    ("minutemonth", -4.694401319716034),
-                                    ("MarchTuesday", -4.694401319716034),
+                                     -5.01396308418893),
+                                    ("minutemonth", -4.608497976080766),
+                                    ("MarchTuesday", -4.608497976080766),
                                     ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
-                                     -5.099866427824199),
+                                     -5.01396308418893),
                                     ("intersect<time-of-day> - <time-of-day> (interval)",
-                                     -5.099866427824199),
+                                     -5.01396308418893),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.406719247264253),
+                                     -4.3208159036289855),
                                     ("intersect by \",\"<time-of-day> - <time-of-day> (interval)",
-                                     -4.183575695950044),
-                                    ("Aprilyear", -5.099866427824199),
+                                     -4.097672352314775),
+                                    ("Aprilyear", -5.01396308418893),
                                     ("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),
+                                     -5.01396308418893),
+                                    ("Thursdaysince <time-of-day>", -4.097672352314775),
+                                    ("minutenograin", -3.40452517175483),
+                                    ("dayminute", -3.309214991950505),
+                                    ("<time> <part-of-day>intersect", -4.608497976080766),
+                                    ("Tuesdayu <named-month>", -5.01396308418893),
+                                    ("intersectyear", -4.097672352314775),
+                                    ("after <time-of-day>by <time>", -4.3208159036289855),
+                                    ("intersectSeptember", -4.608497976080766),
+                                    ("minuteday", -2.9990600636466658),
+                                    ("absorption of , after named dayintersect", -5.01396308418893),
+                                    ("<time> <part-of-day>intersect by \",\"", -5.01396308418893),
+                                    ("intersect by \",\"at <time-of-day>", -4.097672352314775),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -5.099866427824199),
-                                    ("yearat <time-of-day>", -5.099866427824199),
+                                     -5.01396308418893),
+                                    ("yearat <time-of-day>", -5.01396308418893),
                                     ("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}}),
+                                     -4.608497976080766),
+                                    ("MarchMarch", -4.3208159036289855),
+                                    ("after <time-of-day>u <named-day>", -4.608497976080766),
+                                    ("Wednesdayu <named-month>", -5.01396308418893),
+                                    ("absorption of , after named dayFebruary", -5.01396308418893),
+                                    ("hh:mmby <time>", -4.3208159036289855),
+                                    ("u <named-month>year", -3.915350795520821),
+                                    ("Tuesdayintersect", -5.01396308418893),
+                                    ("JanuaryTuesday", -5.01396308418893),
+                                    ("Sundayintersect", -5.01396308418893),
+                                    ("Mondayu <named-month>", -5.01396308418893)],
+                               n = 92}}),
        ("early morning",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
@@ -579,13 +569,6 @@
                    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,
@@ -666,15 +649,6 @@
                                    [("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,
@@ -817,17 +791,6 @@
                                     ("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,
@@ -1092,22 +1055,22 @@
                                n = 3}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.898999234764094, unseen = -3.713572066704308,
+                     ClassData{prior = -0.5965203448708736,
+                               unseen = -3.7612001156935624,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.2231435513142097),
-                                    ("integer (0..19)", -2.0794415416798357)],
-                               n = 35},
+                                   [("integer (numeric)", -0.1823215567939546),
+                                    ("integer (0..19)", -2.128231705849268)],
+                               n = 38},
                    koData =
-                     ClassData{prior = -0.5225216635291818, unseen = -4.04305126783455,
+                     ClassData{prior = -0.8001193001121132, unseen = -3.58351893845611,
                                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}}),
+                                   [("integer (numeric)", -0.37729423114146804),
+                                    ("few", -2.8622008809294686),
+                                    ("integer (0..19)", -1.6094379124341003),
+                                    ("a pair", -2.8622008809294686)],
+                               n = 31}}),
        ("for <duration>",
         Classifier{okData =
                      ClassData{prior = -0.11441035117774422,
@@ -1208,10 +1171,10 @@
                                  HashMap.fromList
                                    [("quarter of an hourtime-of-day (latent)", -2.0149030205422647),
                                     ("minutehour", -1.6094379124341003),
+                                    ("minutenograin", -2.0149030205422647),
                                     ("<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 =
@@ -1368,23 +1331,17 @@
                                n = 1}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.7047480922384253, unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("evening|night", -2.0794415416798357),
-                                    ("day", -1.6739764335716716), ("Sunday", -2.0794415416798357),
-                                    ("hour", -1.6739764335716716), ("Tuesday", -2.0794415416798357),
-                                    ("week-end", -2.0794415416798357)],
+                                   [("evening|night", -1.9459101490553135),
+                                    ("day", -1.540445040947149), ("Sunday", -1.9459101490553135),
+                                    ("hour", -1.540445040947149), ("Tuesday", -1.9459101490553135),
+                                    ("week-end", -1.9459101490553135)],
                                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}}),
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = -0.4795730802618862, unseen = -2.70805020110221,
@@ -1408,10 +1365,10 @@
                                  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),
+                                    ("nograin", -2.0541237336955462),
                                     ("<datetime> - <datetime> (interval)", -2.5649493574615367),
                                     ("<time-of-day> - <time-of-day> (interval)",
                                      -2.5649493574615367),
@@ -1480,23 +1437,18 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next <time>",
         Classifier{okData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -3.1780538303479458,
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -2.4423470353692043),
-                                    ("Monday", -2.4423470353692043),
-                                    ("Friday", -2.4423470353692043), ("day", -1.1895840668738362),
-                                    ("March", -2.4423470353692043), ("month", -2.4423470353692043),
-                                    ("Tuesday", -1.749199854809259)],
+                                   [("Wednesday", -2.3513752571634776),
+                                    ("Monday", -2.3513752571634776),
+                                    ("Friday", -2.3513752571634776), ("day", -1.0986122886681098),
+                                    ("March", -2.3513752571634776), ("month", -2.3513752571634776),
+                                    ("Tuesday", -1.6582280766035324)],
                                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}}),
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("last <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.044522437723423,
@@ -1563,18 +1515,17 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("by the end of <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
                                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},
+                                   [("today", -1.8718021769015913),
+                                    ("next <cycle>", -1.8718021769015913),
+                                    ("day", -1.466337068793427),
+                                    ("this <cycle>", -1.466337068793427),
+                                    ("month", -1.466337068793427)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("in <duration>",
         Classifier{okData =
@@ -1632,30 +1583,39 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -3.1780538303479458,
+                     ClassData{prior = -0.8266785731844679, unseen = -3.258096538021482,
                                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},
+                                   [("since <time-of-day>hh:mm", -2.5257286443082556),
+                                    ("hh:mmtime-of-day (latent)", -2.5257286443082556),
+                                    ("minuteminute", -1.2729656758128873),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("minutehour", -2.5257286443082556),
+                                    ("after <time-of-day>hh:mm", -2.5257286443082556)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.4700036292457356,
-                               unseen = -3.4657359027997265,
+                     ClassData{prior = -0.5753641449035618,
+                               unseen = -3.4011973816621555,
                                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),
+                                   [("since <time-of-day>time-of-day (latent)",
+                                     -2.6741486494265287),
+                                    ("hh:mmtime-of-day (latent)", -1.9810014688665833),
+                                    ("hourhour", -2.6741486494265287),
+                                    ("minutehour", -1.1700712526502546),
                                     ("numeral to|till|before <integer> (hour-of-day)time-of-day (latent)",
-                                     -2.0476928433652555),
-                                    ("at <time-of-day>time-of-day (latent)", -2.740840023925201),
+                                     -1.9810014688665833),
+                                    ("at <time-of-day>time-of-day (latent)", -2.6741486494265287),
                                     ("after <time-of-day>time-of-day (latent)",
-                                     -2.740840023925201)],
-                               n = 10}}),
+                                     -2.6741486494265287)],
+                               n = 9}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 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 after|past (hour-of-day)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -1744,22 +1704,15 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)April", -1.0986122886681098),
-                                    ("month", -1.0986122886681098)],
+                                   [("integer (numeric)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
                                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}}),
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this|next <day-of-week>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.1780538303479458,
@@ -1856,12 +1809,12 @@
                                    [("<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),
+                                    ("hh:mm", -2.4423470353692043),
+                                    ("nograin", -2.2192034840549946), ("hour", -2.7300291078209855),
                                     ("<datetime> - <datetime> (interval)", -2.7300291078209855),
                                     ("<time-of-day> - <time-of-day> (interval)",
                                      -2.7300291078209855),
@@ -1932,29 +1885,33 @@
                                     ("October", -1.1631508098056809),
                                     ("month", -0.8266785731844679)],
                                n = 6}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -3.5553480614894135,
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.258096538021482,
                                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},
+                                   [("Wednesday", -2.5257286443082556),
+                                    ("evening|night", -2.5257286443082556),
+                                    ("Monday", -2.5257286443082556), ("day", -1.4271163556401458),
+                                    ("hour", -1.8325814637483102), ("winter", -2.5257286443082556),
+                                    ("week-end", -2.120263536200091),
+                                    ("summer", -2.120263536200091)],
+                               n = 8},
                    koData =
-                     ClassData{prior = -1.8718021769015913, unseen = -2.833213344056216,
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.4849066497880004,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -2.0794415416798357), ("hour", -2.0794415416798357),
-                                    ("late night", -2.0794415416798357),
-                                    ("Tuesday", -2.0794415416798357)],
-                               n = 2}}),
+                                   [("day", -1.7047480922384253), ("Tuesday", -1.7047480922384253)],
+                               n = 1}}),
        ("<named-month> <day-of-month> (ordinal)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
diff --git a/Duckling/Ranking/Classifiers/IS_XX.hs b/Duckling/Ranking/Classifiers/IS_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/IS_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.IS_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_XX.hs b/Duckling/Ranking/Classifiers/IT_XX.hs
--- a/Duckling/Ranking/Classifiers/IT_XX.hs
+++ b/Duckling/Ranking/Classifiers/IT_XX.hs
@@ -77,12 +77,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.5421761536500667,
-                               unseen = -5.0689042022202315,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 157},
+                     ClassData{prior = -0.5084130773606067, unseen = -5.123963979403259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 166},
                    koData =
-                     ClassData{prior = -0.8710341402860342, unseen = -4.74493212836325,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 113}}),
+                     ClassData{prior = -0.9199204999247338, unseen = -4.718498871295094,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 110}}),
        ("the day before yesterday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -105,6 +104,13 @@
                    koData =
                      ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Giornata Internazionale delle cooperative",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("today",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -121,38 +127,39 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("at <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.616186139423817, unseen = -4.804021044733257,
+                     ClassData{prior = -0.5978370007556204, unseen = -4.820281565605037,
                                likelihoods =
                                  HashMap.fromList
-                                   [("midnight", -4.102643365036796),
-                                    ("<time> timezone", -3.6971782569286313),
-                                    ("<integer 0 12> del <part of day>", -2.716349003916905),
-                                    ("<integer> (latent time-of-day)", -1.5769147207285403),
-                                    ("hh(:|h)mm (time-of-day)", -2.087740344494531),
-                                    ("<hour-of-day> and <relative minutes>", -4.102643365036796),
-                                    ("noon", -3.6971782569286313),
+                                   [("midnight", -4.119037174812472),
+                                    ("<time> timezone", -3.713572066704308),
+                                    ("<integer 0 12> del <part of day>", -2.7327428136925813),
+                                    ("<integer> (latent time-of-day)", -1.5540878173509354),
+                                    ("hh(:|h)mm (time-of-day)", -2.1041341542702074),
+                                    ("<hour-of-day> and <relative minutes>", -4.119037174812472),
+                                    ("noon", -3.713572066704308),
                                     ("hh <relative-minutes> del pomeriggio(time-of-day)",
-                                     -3.6971782569286313),
-                                    ("<hour-of-day> minus quart", -4.102643365036796),
-                                    ("hour", -1.2404424841073274), ("minute", -1.751268107873318)],
-                               n = 54},
+                                     -3.713572066704308),
+                                    ("<hour-of-day> minus quart", -4.119037174812472),
+                                    ("hour", -1.2286654169163076), ("minute", -1.7676619176489945)],
+                               n = 55},
                    koData =
-                     ClassData{prior = -0.7765287894989963, unseen = -4.663439094112067,
+                     ClassData{prior = -0.7985076962177716,
+                               unseen = -4.6443908991413725,
                                likelihoods =
                                  HashMap.fromList
-                                   [("una", -3.960813169597578),
-                                    ("<integer> (latent time-of-day)", -1.043042437513299),
-                                    ("hh(:|h)mm (time-of-day)", -2.8622008809294686),
-                                    ("<hour-of-day> and <relative minutes>", -3.5553480614894135),
+                                   [("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.960813169597578),
-                                    ("noon", -3.960813169597578), ("hour", -0.9903987040278769),
-                                    ("minute", -2.456735772821304)],
-                               n = 46}}),
+                                     -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},
+                     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}}),
@@ -235,8 +242,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("semaine (grain)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 34},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -252,8 +259,8 @@
                                n = 4}}),
        ("mois (grain)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                     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}}),
@@ -415,6 +422,13 @@
                                      -0.9808292530117262),
                                     ("weekhour", -0.9808292530117262)],
                                n = 2}}),
+       ("Giornata Mondiale della Prematurit\224",
+        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}}),
        ("yyyy-mm-dd",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -553,23 +567,21 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -1.0904489780289488,
-                               unseen = -3.8066624897703196,
+                     ClassData{prior = -1.0198314108149953, unseen = -3.871201010907891,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("number (0..19)", -1.3862943611198906)],
-                               n = 41},
+                                   [("integer (numeric)", -0.294799540220645),
+                                    ("number (0..19)", -1.452252328911688)],
+                               n = 44},
                    koData =
-                     ClassData{prior = -0.40957189006081784,
-                               unseen = -4.442651256490317,
+                     ClassData{prior = -0.4473122180436648, unseen = -4.406719247264253,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.3364722366212129),
+                                   [("integer (numeric)", -0.3513978868378886),
                                     ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-                                     -3.332204510175204),
-                                    ("number (0..19)", -1.3862943611198906)],
-                               n = 81}}),
+                                     -3.295836866004329),
+                                    ("number (0..19)", -1.349926716949016)],
+                               n = 78}}),
        ("nth <time> of <time>",
         Classifier{okData =
                      ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
@@ -629,63 +641,65 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \"di\", \"della\", \"del\"",
         Classifier{okData =
-                     ClassData{prior = -0.41616039722491244,
-                               unseen = -4.574710978503383,
+                     ClassData{prior = -0.40546510810816444, unseen = -4.61512051684126,
                                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)Sabato", -3.912023005428146),
+                                    ("hourday", -2.659260036932778),
+                                    ("daymonth", -2.5257286443082556),
+                                    ("MartediOttobre", -3.912023005428146),
+                                    ("Mercoleditwo time tokens in a row", -3.912023005428146),
                                     ("hh(:|h)mm (time-of-day)<day-of-month> <named-month>",
-                                     -3.871201010907891),
+                                     -3.912023005428146),
+                                    ("Giornata Internazionale delle cooperativeyear (1000-2100 not latent)",
+                                     -3.912023005428146),
                                     ("two time tokens in a rowtwo time tokens in a row",
-                                     -3.871201010907891),
-                                    ("two time tokens in a rowOttobre", -3.4657359027997265),
+                                     -3.912023005428146),
+                                    ("two time tokens in a rowOttobre", -3.506557897319982),
                                     ("<integer 0 12> del <part of day>tomorrow",
-                                     -3.871201010907891),
+                                     -3.912023005428146),
+                                    ("dayyear", -3.912023005428146),
                                     ("hh(:|h)mm (time-of-day)two time tokens in a row",
-                                     -2.9549102790337356),
-                                    ("Lunedithis <cycle>", -3.871201010907891),
-                                    ("Martedithis <cycle>", -3.871201010907891),
+                                     -2.995732273553991),
+                                    ("Lunedithis <cycle>", -3.912023005428146),
+                                    ("Martedithis <cycle>", -3.912023005428146),
                                     ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
-                                     -3.4657359027997265),
-                                    ("day of month (1st)Marzo", -3.871201010907891),
-                                    ("MercolediOttobre", -3.871201010907891),
+                                     -3.506557897319982),
+                                    ("day of month (1st)Marzo", -3.912023005428146),
+                                    ("MercolediOttobre", -3.912023005428146),
                                     ("at <time-of-day>two time tokens in a row",
-                                     -3.4657359027997265),
-                                    ("minuteday", -1.791759469228055),
+                                     -3.506557897319982),
+                                    ("minuteday", -1.8325814637483102),
                                     ("dalle <time-of-day> alle <time-of-day> (interval)Giovedi",
-                                     -3.1780538303479458),
-                                    ("at <time-of-day>Sabato", -3.871201010907891),
+                                     -3.2188758248682006),
+                                    ("at <time-of-day>Sabato", -3.912023005428146),
                                     ("at <time-of-day><named-day> <day-of-month>",
-                                     -3.871201010907891),
-                                    ("dayweek", -3.1780538303479458),
-                                    ("at <time-of-day>Venerdi", -3.871201010907891),
+                                     -3.912023005428146),
+                                    ("dayweek", -3.2188758248682006),
+                                    ("at <time-of-day>Venerdi", -3.912023005428146),
                                     ("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},
+                                     -3.506557897319982),
+                                    ("<dim time> al <part-of-day>tomorrow", -3.912023005428146),
+                                    ("Mercoledithis <cycle>", -3.912023005428146),
+                                    ("hh(:|h)mm (time-of-day)Venerdi", -3.912023005428146)],
+                               n = 32},
                    koData =
-                     ClassData{prior = -1.0775588794702773, unseen = -4.204692619390966,
+                     ClassData{prior = -1.0986122886681098, unseen = -4.23410650459726,
                                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)],
+                                   [("hourday", -2.4277482359480516),
+                                    ("daymonth", -2.1400661634962708),
+                                    ("Mercoleditwo time tokens in a row", -3.5263605246161616),
+                                    ("stanottetomorrow", -3.120895416507997),
+                                    ("MartediSettembre", -3.5263605246161616),
+                                    ("LunediMarzo", -3.5263605246161616),
+                                    ("MercolediOttobre", -3.5263605246161616),
+                                    ("Marteditwo time tokens in a row", -3.5263605246161616),
+                                    ("minuteday", -2.6100697927420065),
+                                    ("DomenicaMarzo", -3.5263605246161616),
+                                    ("at <time-of-day>Giovedi", -2.4277482359480516),
+                                    ("Domenicatwo time tokens in a row", -3.5263605246161616),
+                                    ("hh(:|h)mm (time-of-day)Giovedi", -3.120895416507997)],
                                n = 16}}),
        ("<hour-of-day> and a quart",
         Classifier{okData =
@@ -906,6 +920,13 @@
                    koData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("Giornata Mondiale contro la discriminazione",
+        Classifier{okData =
+                     ClassData{prior = 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.6931471805599453,
@@ -986,23 +1007,24 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
        ("tra il <datetime> e il <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -2.639057329615259,
+                     ClassData{prior = -0.587786664902119, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.466337068793427),
-                                    ("at <time-of-day>at <time-of-day>", -0.9555114450274363),
-                                    ("hourhour", -1.466337068793427)],
-                               n = 4},
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("at <time-of-day>at <time-of-day>", -0.916290731874155),
+                                    ("hourhour", -1.6094379124341003),
+                                    ("minutehour", -2.0149030205422647)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.772588722239781,
+                     ClassData{prior = -0.8109302162163288, unseen = -2.639057329615259,
                                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}}),
+                                     -1.1786549963416462),
+                                    ("at <time-of-day>at <time-of-day>", -1.8718021769015913),
+                                    ("hourhour", -1.1786549963416462),
+                                    ("minutehour", -1.8718021769015913)],
+                               n = 4}}),
        ("gli ultimi <n> <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -4.343805421853684,
@@ -1144,19 +1166,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -2.9444389791664407,
-                               unseen = -3.4339872044851463,
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -3.8501476017100584,
                                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},
+                                   [("week", -2.2192034840549946),
+                                    ("integer (numeric)ann\233e (grain)", -3.1354942159291497),
+                                    ("integer (numeric)jour (grain)", -3.1354942159291497),
+                                    ("day", -3.1354942159291497), ("year", -2.7300291078209855),
+                                    ("number (0..19)ann\233e (grain)", -3.1354942159291497),
+                                    ("number (0..19)semaine (grain)", -2.7300291078209855),
+                                    ("hour", -3.1354942159291497),
+                                    ("number (0..19)mois (grain)", -3.1354942159291497),
+                                    ("month", -2.7300291078209855),
+                                    ("integer (numeric)minute (grain)", -2.7300291078209855),
+                                    ("integer (numeric)mois (grain)", -3.1354942159291497),
+                                    ("minute", -2.7300291078209855),
+                                    ("integer (numeric)semaine (grain)", -2.7300291078209855),
+                                    ("integer (numeric)heure (grain)", -3.1354942159291497)],
+                               n = 12},
                    koData =
-                     ClassData{prior = -5.406722127027582e-2,
+                     ClassData{prior = -0.15415067982725836,
                                unseen = -5.117993812416755,
                                likelihoods =
                                  HashMap.fromList
@@ -1247,27 +1277,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("dalle <time-of-day> alle <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.1354942159291497,
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.295836866004329,
                                likelihoods =
                                  HashMap.fromList
-                                   [("midnight<integer> (latent time-of-day)", -2.3978952727983707),
-                                    ("minuteminute", -1.7047480922384253),
+                                   [("midnight<integer> (latent time-of-day)", -2.5649493574615367),
+                                    ("minuteminute", -1.8718021769015913),
                                     ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -1.7047480922384253),
+                                     -1.8718021769015913),
                                     ("<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},
+                                     -2.159484249353372),
+                                    ("hourhour", -1.6486586255873816),
+                                    ("minutehour", -2.159484249353372),
+                                    ("hh(:|h)mm (time-of-day)<integer> (latent time-of-day)",
+                                     -2.159484249353372),
+                                    ("<integer> (latent time-of-day)una", -2.5649493574615367)],
+                               n = 9},
                    koData =
-                     ClassData{prior = -1.2039728043259361, unseen = -2.70805020110221,
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minutehour", -1.252762968495368),
+                                   [("minutehour", -1.6094379124341003),
                                     ("hh(:|h)mm (time-of-day)<integer> (latent time-of-day)",
-                                     -1.252762968495368)],
-                               n = 3}}),
+                                     -1.6094379124341003)],
+                               n = 1}}),
        ("ferragosto",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -1307,20 +1341,21 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("number (0..19)",
         Classifier{okData =
-                     ClassData{prior = -0.14058195062118944,
-                               unseen = -4.007333185232471,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 53},
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.060443010546419,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 56},
                    koData =
-                     ClassData{prior = -2.031432322493475, unseen = -2.3025850929940455,
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.3025850929940455,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
        ("year (1000-2100 not latent)",
         Classifier{okData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -3.1780538303479458,
+                     ClassData{prior = -0.16034265007517937,
+                               unseen = -3.2188758248682006,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 22},
+                               n = 23},
                    koData =
-                     ClassData{prior = -1.8718021769015913, unseen = -1.791759469228055,
+                     ClassData{prior = -1.9095425048844386, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
                                n = 4}}),
        ("il <time>",
@@ -1412,15 +1447,31 @@
                                n = 3}}),
        ("une <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("heure (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
+                                   [("week", -1.3862943611198906),
+                                    ("semaine (grain)", -1.3862943611198906),
+                                    ("heure (grain)", -1.3862943611198906),
+                                    ("hour", -1.3862943611198906)],
+                               n = 2},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5686159179138452), ("day", -2.4849066497880004),
+                                    ("year", -2.0794415416798357),
+                                    ("<integer> <unit-of-duration>", -0.9808292530117262),
+                                    ("une <unit-of-duration>", -2.4849066497880004),
+                                    ("month", -2.0794415416798357)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("next <cycle> ",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.1354942159291497,
@@ -1457,195 +1508,188 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("two time tokens in a row",
         Classifier{okData =
-                     ClassData{prior = -0.3456466128972542, unseen = -6.030685260261263,
+                     ClassData{prior = -0.31730232051349283,
+                               unseen = -6.037870919922137,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Lunedi<day-of-month> <named-month>", -4.929666231562589),
+                                   [("Lunedi<day-of-month> <named-month>", -4.936869143856646),
                                     ("<datetime> - <datetime> (interval)Giovedi",
-                                     -5.3351313396707525),
+                                     -5.342334251964811),
                                     ("intersect by \"di\", \"della\", \"del\"year (1000-2100 not latent)",
-                                     -4.929666231562589),
-                                    ("dayhour", -3.3202283191284883),
-                                    ("Febbraioyear (1000-2100 not latent)", -5.3351313396707525),
-                                    ("Settembreat <time-of-day>", -4.641984159110808),
-                                    ("daymonth", -2.562542617430972),
-                                    ("<named-day> <day-of-month>Settembre", -4.236519051002643),
+                                     -4.936869143856646),
+                                    ("dayhour", -3.3274312314225463),
+                                    ("Febbraioyear (1000-2100 not latent)", -5.342334251964811),
+                                    ("Settembreat <time-of-day>", -4.6491870714048655),
+                                    ("daymonth", -2.56974552972503),
+                                    ("<named-day> <day-of-month>Settembre", -4.243721963296701),
                                     ("day of month (1st)intersect by \"di\", \"della\", \"del\"",
-                                     -4.641984159110808),
-                                    ("Ottobreyear (1000-2100 not latent)", -4.082368371175385),
-                                    ("monthyear", -3.195065176174482),
+                                     -4.6491870714048655),
+                                    ("Ottobreyear (1000-2100 not latent)", -4.089571283469443),
+                                    ("monthyear", -3.20226808846854),
                                     ("day of month (1st)two time tokens in a row",
-                                     -4.236519051002643),
+                                     -4.243721963296701),
                                     ("<ordinal> <cycle> of <time>year (1000-2100 not latent)",
-                                     -5.3351313396707525),
-                                    ("christmasyear (1000-2100 not latent)", -4.929666231562589),
+                                     -5.342334251964811),
+                                    ("christmasyear (1000-2100 not latent)", -4.936869143856646),
                                     ("<named-day> <day-of-month>two time tokens in a row",
-                                     -4.929666231562589),
-                                    ("tomorrowdopo <time>", -5.3351313396707525),
+                                     -4.936869143856646),
+                                    ("tomorrowdopo <time>", -5.342334251964811),
                                     ("Giovedidalle <time-of-day> alle <time-of-day> (interval)",
-                                     -4.929666231562589),
+                                     -4.6491870714048655),
                                     ("intersect by \"di\", \"della\", \"del\"<day-of-month> <named-month>",
-                                     -4.641984159110808),
+                                     -4.6491870714048655),
                                     ("two time tokens separated by `di`Settembre",
-                                     -4.641984159110808),
-                                    ("day of month (1st)Maggio", -5.3351313396707525),
+                                     -4.6491870714048655),
+                                    ("day of month (1st)Maggio", -5.342334251964811),
                                     ("tra il <integer> e il <integer> (interval)Luglio",
-                                     -4.929666231562589),
-                                    ("day of month (1st)Mercoledi", -5.3351313396707525),
-                                    ("dayday", -2.770181982209216),
-                                    ("il <time>year (1000-2100 not latent)", -5.3351313396707525),
-                                    ("Giovediat <time-of-day>", -4.929666231562589),
-                                    ("entro il <integer>Aprile", -5.3351313396707525),
-                                    ("dayyear", -3.195065176174482),
+                                     -4.936869143856646),
+                                    ("day of month (1st)Mercoledi", -5.342334251964811),
+                                    ("dayday", -2.777384894503274),
+                                    ("il <time>year (1000-2100 not latent)", -5.342334251964811),
+                                    ("Giovediat <time-of-day>", -4.936869143856646),
+                                    ("entro il <integer>Aprile", -5.342334251964811),
+                                    ("dayyear", -3.20226808846854),
                                     ("tomorrowdalle <time-of-day> alle <time-of-day> (interval)",
-                                     -5.3351313396707525),
+                                     -4.936869143856646),
                                     ("hh(:|h)mm (time-of-day)two time tokens in a row",
-                                     -4.929666231562589),
-                                    ("dd[/-]mmat <time-of-day>", -5.3351313396707525),
+                                     -4.936869143856646),
+                                    ("dd[/-]mmat <time-of-day>", -5.342334251964811),
                                     ("dal <integer> al <integer> (interval)Luglio",
-                                     -4.929666231562589),
-                                    ("tomorrowdopo le <time-of-day>", -4.929666231562589),
-                                    ("monthminute", -4.641984159110808),
-                                    ("minutemonth", -3.8310539428944788),
-                                    ("il <time>Marzo", -5.3351313396707525),
-                                    ("<named-day> <day-of-month>Febbraio", -4.418840607796598),
+                                     -4.936869143856646),
+                                    ("tomorrowdopo le <time-of-day>", -4.936869143856646),
+                                    ("monthminute", -4.6491870714048655),
+                                    ("minutemonth", -3.8382568551885368),
+                                    ("il <time>Marzo", -5.342334251964811),
+                                    ("<named-day> <day-of-month>Febbraio", -4.426043520090656),
                                     ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
-                                     -5.3351313396707525),
-                                    ("Settembreyear (1000-2100 not latent)", -4.929666231562589),
-                                    ("Mercoledi<day-of-month> <named-month>", -5.3351313396707525),
+                                     -5.342334251964811),
+                                    ("Settembreyear (1000-2100 not latent)", -4.936869143856646),
+                                    ("Mercoledi<day-of-month> <named-month>", -5.342334251964811),
                                     ("il <day-of-month> <named-month>at <time-of-day>",
-                                     -5.3351313396707525),
-                                    ("day of month (1st)Marzo", -4.929666231562589),
-                                    ("Sabato<day-of-month> <named-month>", -5.3351313396707525),
-                                    ("il <day-of-month>Settembre", -5.3351313396707525),
-                                    ("Venerdi<day-of-month> <named-month>", -4.418840607796598),
+                                     -5.342334251964811),
+                                    ("day of month (1st)Marzo", -4.936869143856646),
+                                    ("Sabato<day-of-month> <named-month>", -5.342334251964811),
+                                    ("il <day-of-month>Settembre", -5.342334251964811),
+                                    ("Venerdi<day-of-month> <named-month>", -4.426043520090656),
                                     ("<day-of-month> <named-month>at <time-of-day>",
-                                     -4.641984159110808),
+                                     -4.6491870714048655),
                                     ("il <day-of-month> <named-month>year (1000-2100 not latent)",
-                                     -5.3351313396707525),
+                                     -5.342334251964811),
                                     ("two time tokens separated by `di`year (1000-2100 not latent)",
-                                     -4.929666231562589),
+                                     -4.936869143856646),
                                     ("last <cycle> of <time>year (1000-2100 not latent)",
-                                     -4.641984159110808),
+                                     -4.6491870714048655),
                                     ("day of month (1st)two time tokens separated by `di`",
-                                     -4.641984159110808),
-                                    ("il <day-of-month>Febbraio", -4.418840607796598),
-                                    ("Gennaioyear (1000-2100 not latent)", -4.641984159110808),
-                                    ("the day after tomorrowat <time-of-day>", -4.929666231562589),
+                                     -4.6491870714048655),
+                                    ("il <day-of-month>Febbraio", -4.426043520090656),
+                                    ("Gennaioyear (1000-2100 not latent)", -4.6491870714048655),
+                                    ("the day after tomorrowat <time-of-day>", -4.936869143856646),
                                     ("two time tokens in a rowyear (1000-2100 not latent)",
-                                     -4.641984159110808),
+                                     -4.6491870714048655),
                                     ("il <day-of-month>two time tokens in a row",
-                                     -4.929666231562589),
-                                    ("Giovedientro <time>", -5.3351313396707525),
+                                     -4.936869143856646),
+                                    ("Giovedientro <time>", -5.342334251964811),
                                     ("at <time-of-day>two time tokens in a row",
-                                     -4.929666231562589),
-                                    ("dayminute", -2.8502246898827526),
-                                    ("Venerditwo time tokens in a row", -4.929666231562589),
+                                     -4.936869143856646),
+                                    ("dayminute", -2.739644566520427),
+                                    ("Venerditwo time tokens in a row", -4.936869143856646),
                                     ("two time tokens in a rowat <time-of-day>",
-                                     -4.236519051002643),
-                                    ("minuteday", -3.137906762334534),
+                                     -4.243721963296701),
+                                    ("minuteday", -3.1451096746285914),
                                     ("two time tokens separated by `di`<day-of-month> <named-month>",
-                                     -4.641984159110808),
-                                    ("il <time>at <time-of-day>", -5.3351313396707525),
-                                    ("Sabatoat <time-of-day>", -5.3351313396707525),
+                                     -4.6491870714048655),
+                                    ("il <time>at <time-of-day>", -5.342334251964811),
+                                    ("Sabatoat <time-of-day>", -5.342334251964811),
                                     ("intersect by \"di\", \"della\", \"del\"Settembre",
-                                     -4.641984159110808),
-                                    ("Domenica<day-of-month> <named-month>", -5.3351313396707525),
+                                     -4.6491870714048655),
+                                    ("Domenica<day-of-month> <named-month>", -5.342334251964811),
                                     ("last <day-of-week> of <time>year (1000-2100 not latent)",
-                                     -5.3351313396707525),
-                                    ("immacolata concezioneat <time-of-day>", -5.3351313396707525),
+                                     -5.342334251964811),
+                                    ("immacolata concezioneat <time-of-day>", -5.342334251964811),
                                     ("at <time-of-day><named-day> <day-of-month>",
-                                     -5.3351313396707525),
-                                    ("day of month (1st)Martedi", -4.418840607796598),
-                                    ("at <time-of-day>Venerdi", -5.3351313396707525),
-                                    ("weekyear", -4.929666231562589),
-                                    ("Giovedi<time> timezone", -4.929666231562589),
+                                     -5.342334251964811),
+                                    ("day of month (1st)Martedi", -4.426043520090656),
+                                    ("at <time-of-day>Venerdi", -5.342334251964811),
+                                    ("weekyear", -4.936869143856646),
+                                    ("Giovedi<time> timezone", -4.936869143856646),
                                     ("Gioveditra il <datetime> e il <datetime> (interval)",
-                                     -4.929666231562589),
-                                    ("two time tokens in a rowSettembre", -4.929666231562589),
-                                    ("tomorrowat <time-of-day>", -5.3351313396707525),
+                                     -4.6491870714048655),
+                                    ("two time tokens in a rowSettembre", -4.936869143856646),
+                                    ("tomorrowat <time-of-day>", -5.342334251964811),
                                     ("two time tokens in a row<day-of-month> <named-month>",
-                                     -4.929666231562589),
-                                    ("Giovedientro le <time-of-day>", -5.3351313396707525),
+                                     -4.936869143856646),
+                                    ("Giovedientro le <time-of-day>", -5.342334251964811),
                                     ("two time tokens in a rowin <named-month>",
-                                     -4.641984159110808),
-                                    ("Dicembreyear (1000-2100 not latent)", -4.641984159110808),
-                                    ("Marzoyear (1000-2100 not latent)", -5.3351313396707525),
-                                    ("Martediin <named-month>", -4.641984159110808),
+                                     -4.6491870714048655),
+                                    ("Dicembreyear (1000-2100 not latent)", -4.6491870714048655),
+                                    ("Marzoyear (1000-2100 not latent)", -5.342334251964811),
+                                    ("Martediin <named-month>", -4.6491870714048655),
                                     ("the day after tomorrowentro le <time-of-day>",
-                                     -5.3351313396707525),
+                                     -5.342334251964811),
                                     ("<day-of-month> <named-month>year (1000-2100 not latent)",
-                                     -4.929666231562589),
+                                     -4.936869143856646),
                                     ("commemorazione dei defuntiat <time-of-day>",
-                                     -5.3351313396707525),
-                                    ("il <day-of-month>Marzo", -5.3351313396707525),
-                                    ("hh(:|h)mm (time-of-day)Venerdi", -5.3351313396707525)],
-                               n = 155},
+                                     -5.342334251964811),
+                                    ("il <day-of-month>Marzo", -5.342334251964811),
+                                    ("hh(:|h)mm (time-of-day)Venerdi", -5.342334251964811)],
+                               n = 158},
                    koData =
-                     ClassData{prior = -1.230188646456829, unseen = -5.455321115357702,
+                     ClassData{prior = -1.3023599096347402,
+                               unseen = -5.3981627015177525,
                                likelihoods =
                                  HashMap.fromList
                                    [("at <time-of-day>prossimi <unit-of-duration>",
-                                     -4.352426164897591),
+                                     -4.295015257684252),
                                     ("intersect by \"di\", \"della\", \"del\"year (1000-2100 not latent)",
-                                     -4.06474409244581),
-                                    ("dayhour", -2.1929419155442185),
-                                    ("Settembreat <time-of-day>", -3.8416005411316),
-                                    ("daymonth", -4.757891273005756),
-                                    ("monthday", -4.352426164897591),
-                                    ("monthyear", -4.757891273005756),
-                                    ("Luglio<day-of-month> <named-month>", -4.757891273005756),
+                                     -4.007333185232471),
+                                    ("dayhour", -2.1355310083308794),
+                                    ("Settembreat <time-of-day>", -3.784189633918261),
+                                    ("daymonth", -4.700480365792417),
+                                    ("monthyear", -4.700480365792417),
                                     ("<named-day> <day-of-month>two time tokens in a row",
-                                     -4.06474409244581),
-                                    ("Giovedidalle <time-of-day> alle <time-of-day> (interval)",
-                                     -4.757891273005756),
-                                    ("monthhour", -3.6592789843376456),
-                                    ("hourmonth", -4.352426164897591),
-                                    ("dayday", -4.757891273005756),
-                                    ("Febbraiothis <part-of-day>", -4.352426164897591),
-                                    ("Giovediat <time-of-day>", -3.8416005411316),
+                                     -4.007333185232471),
+                                    ("monthhour", -3.6018680771243066),
+                                    ("hourmonth", -4.295015257684252),
+                                    ("dayday", -4.700480365792417),
+                                    ("Febbraiothis <part-of-day>", -4.295015257684252),
+                                    ("Giovediat <time-of-day>", -3.784189633918261),
                                     ("tra il <datetime> e il <datetime> (interval)Luglio",
-                                     -4.352426164897591),
-                                    ("dayyear", -3.253813876229481),
-                                    ("tomorrowdalle <time-of-day> alle <time-of-day> (interval)",
-                                     -4.757891273005756),
+                                     -4.295015257684252),
+                                    ("dayyear", -3.196402969016142),
                                     ("<hour-of-day> and <relative minutes>Luglio",
-                                     -4.757891273005756),
-                                    ("tomorrowstanotte", -4.757891273005756),
-                                    ("dd[/-]mmat <time-of-day>", -4.757891273005756),
-                                    ("il <day-of-month>Luglio", -4.757891273005756),
-                                    ("tomorrowdopo le <time-of-day>", -4.352426164897591),
-                                    ("monthminute", -4.757891273005756),
-                                    ("minutemonth", -4.757891273005756),
+                                     -4.700480365792417),
+                                    ("tomorrowstanotte", -4.700480365792417),
+                                    ("dd[/-]mmat <time-of-day>", -4.700480365792417),
+                                    ("il <day-of-month>Luglio", -4.700480365792417),
+                                    ("tomorrowdopo le <time-of-day>", -4.295015257684252),
+                                    ("monthminute", -4.700480365792417),
+                                    ("minutemonth", -4.700480365792417),
                                     ("il <day-of-month> <named-month>at <time-of-day>",
-                                     -4.757891273005756),
-                                    ("dopo <time>at <time-of-day>", -4.757891273005756),
+                                     -4.700480365792417),
+                                    ("dopo <time>at <time-of-day>", -4.700480365792417),
                                     ("<day-of-month> <named-month>at <time-of-day>",
-                                     -3.8416005411316),
-                                    ("weekmonth", -4.352426164897591),
+                                     -3.784189633918261),
+                                    ("weekmonth", -4.295015257684252),
                                     ("two time tokens separated by `di`year (1000-2100 not latent)",
-                                     -4.06474409244581),
-                                    ("hourweek", -4.352426164897591),
-                                    ("the day after tomorrowat <time-of-day>", -4.757891273005756),
+                                     -4.007333185232471),
+                                    ("hourweek", -4.295015257684252),
+                                    ("the day after tomorrowat <time-of-day>", -4.700480365792417),
                                     ("il <day-of-month>two time tokens in a row",
-                                     -4.757891273005756),
-                                    ("Agosto<day-of-month> <named-month>", -4.757891273005756),
-                                    ("dayminute", -2.886089096104164),
-                                    ("Venerditwo time tokens in a row", -4.06474409244581),
+                                     -4.700480365792417),
+                                    ("dayminute", -3.0910424533583156),
+                                    ("Venerditwo time tokens in a row", -4.007333185232471),
                                     ("two time tokens in a rowat <time-of-day>",
-                                     -3.371596911885865),
-                                    ("minuteday", -4.757891273005756),
-                                    ("il <time>at <time-of-day>", -4.757891273005756),
-                                    ("Giovedidopo le <time-of-day>", -4.06474409244581),
-                                    ("the <cycle> of <time>Ottobre", -4.352426164897591),
-                                    ("Gioveditra il <datetime> e il <datetime> (interval)",
-                                     -4.757891273005756),
-                                    ("tomorrowat <time-of-day>", -4.757891273005756),
-                                    ("Martedidopo <time>", -4.757891273005756),
-                                    ("dopo <time>year (1000-2100 not latent)", -4.352426164897591),
-                                    ("hh(:|h)mm (time-of-day)Giovedi", -4.757891273005756),
-                                    ("Marzoyear (1000-2100 not latent)", -4.757891273005756)],
-                               n = 64}}),
+                                     -3.3141860046725258),
+                                    ("minuteday", -4.700480365792417),
+                                    ("il <time>at <time-of-day>", -4.700480365792417),
+                                    ("Giovedidopo le <time-of-day>", -4.007333185232471),
+                                    ("the <cycle> of <time>Ottobre", -4.295015257684252),
+                                    ("tomorrowat <time-of-day>", -4.700480365792417),
+                                    ("Martedidopo <time>", -4.700480365792417),
+                                    ("dopo <time>year (1000-2100 not latent)", -4.295015257684252),
+                                    ("hh(:|h)mm (time-of-day)Giovedi", -4.700480365792417),
+                                    ("Marzoyear (1000-2100 not latent)", -4.700480365792417)],
+                               n = 59}}),
        ("heure (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.0910424533583156,
@@ -1660,6 +1704,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Giornata della lingua araba",
+        Classifier{okData =
+                     ClassData{prior = 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.9459101490553135,
@@ -1669,8 +1720,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("jour (grain)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                     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}}),
@@ -2186,6 +2237,13 @@
                                n = 1},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Giornata dell'Africa",
+        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}}),
        ("dd-dd <month> (interval)",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/KM_XX.hs b/Duckling/Ranking/Classifiers/KM_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/KM_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.KM_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/KN_XX.hs b/Duckling/Ranking/Classifiers/KN_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/KN_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.KN_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_XX.hs b/Duckling/Ranking/Classifiers/KO_XX.hs
--- a/Duckling/Ranking/Classifiers/KO_XX.hs
+++ b/Duckling/Ranking/Classifiers/KO_XX.hs
@@ -33,13 +33,21 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.4372138064227446, unseen = -4.836281906951478,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 124},
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -4.867534450455582,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 128},
                    koData =
-                     ClassData{prior = -1.0379876668516748, unseen = -4.248495242049359,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 68}}),
+                     ClassData{prior = -1.0986122886681098, unseen = -4.189654742026425,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 64}}),
        ("lunch",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -70,7 +78,6 @@
                                likelihoods =
                                  HashMap.fromList
                                    [("dayhour", -1.1826954058786512),
-                                    ("day-of-weekmorning", -3.4339872044851463),
                                     ("yesterdayevening|night", -3.4339872044851463),
                                     ("mm/ddafternoon", -3.4339872044851463),
                                     ("todayafternoon", -3.4339872044851463),
@@ -81,6 +88,7 @@
                                     ("next <cycle>evening|night", -3.028522096376982),
                                     ("tomorrowlunch", -3.4339872044851463),
                                     ("intersectmorning", -3.4339872044851463),
+                                    ("Mondaymorning", -3.4339872044851463),
                                     ("the day before yesterday - \50634\44536\51228morning",
                                      -3.4339872044851463),
                                     ("tomorrowevening|night", -3.028522096376982),
@@ -94,12 +102,12 @@
                                     ("dayhour", -1.8191584434161694),
                                     ("yearhour", -1.906169820405799),
                                     ("time-of-day (latent)evening|night", -3.6109179126442243),
+                                    ("Fridayafternoon", -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),
@@ -107,22 +115,26 @@
                                n = 24}}),
        ("<time> nth <time> - 3\50900 \52395\51704 \54868\50836\51068",
         Classifier{okData =
-                     ClassData{prior = -0.6190392084062235, unseen = -2.890371757896165,
+                     ClassData{prior = -0.6190392084062235, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("monthday", -0.7537718023763802),
-                                    ("intersectordinals (\52395\48264\51704)day-of-week",
-                                     -0.8873031950009028),
-                                    ("monthordinals (\52395\48264\51704)day-of-week",
-                                     -2.1400661634962708)],
+                                   [("monthday", -0.8649974374866046),
+                                    ("intersectordinals (\52395\48264\51704)Tuesday",
+                                     -1.845826690498331),
+                                    ("monthordinals (\52395\48264\51704)Tuesday",
+                                     -2.2512917986064953),
+                                    ("intersectordinals (\52395\48264\51704)Wednesday",
+                                     -1.3350010667323402)],
                                n = 7},
                    koData =
-                     ClassData{prior = -0.7731898882334817, unseen = -2.772588722239781,
+                     ClassData{prior = -0.7731898882334817, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
-                                   [("monthday", -0.7621400520468967),
-                                    ("monthordinals (\52395\48264\51704)day-of-week",
-                                     -0.7621400520468967)],
+                                   [("monthday", -0.8873031950009028),
+                                    ("monthordinals (\52395\48264\51704)Wednesday",
+                                     -1.2237754316221157),
+                                    ("monthordinals (\52395\48264\51704)Tuesday",
+                                     -1.7346010553881064)],
                                n = 6}}),
        ("the day before yesterday - \50634\44536\51228",
         Classifier{okData =
@@ -161,15 +173,16 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time> \47560\51648\47561 <day-of-week>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("intersectday-of-week", -1.5040773967762742),
-                                    ("monthday", -0.8109302162163288),
-                                    ("monthday-of-week", -1.0986122886681098)],
+                                   [("monthSunday", -1.6094379124341003),
+                                    ("monthday", -0.916290731874155),
+                                    ("monthMonday", -1.6094379124341003),
+                                    ("intersectSunday", -1.6094379124341003)],
                                n = 3},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer - TYPE 1",
         Classifier{okData =
@@ -178,6 +191,13 @@
                    koData =
                      ClassData{prior = -0.1694181519580468, unseen = -4.882801922586371,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 130}}),
+       ("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}}),
        ("hour (grain)",
         Classifier{okData =
                      ClassData{prior = -1.241713132308783, unseen = -2.70805020110221,
@@ -188,143 +208,141 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 32}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.45041649597043076,
-                               unseen = -5.963579343618447,
+                     ClassData{prior = -0.4279379639602229, unseen = -5.991464547107982,
                                likelihoods =
                                  HashMap.fromList
                                    [("intersect<hour-of-day> <integer> (as relative minutes)",
-                                     -5.267858159063328),
-                                    ("intersectday-of-week", -4.169245870395218),
-                                    ("year<time> \47560\51648\47561 <cycle>", -4.862393050955164),
-                                    ("next <cycle>day-of-week", -4.351567427189173),
-                                    ("dayhour", -2.0291797068989474),
-                                    ("monthday", -2.434644815007112),
-                                    ("yearhour", -3.563110066824903),
-                                    ("<time> <part-of-day>time-of-day", -4.351567427189173),
-                                    ("intersectam|pm <time-of-day>", -3.0706335817271087),
-                                    ("next <cycle><time-of-day> am|pm", -5.267858159063328),
-                                    ("next <cycle>am|pm <time-of-day>", -4.862393050955164),
-                                    ("yearintersect", -2.9652730660692823),
-                                    ("day-of-week<datetime> - <datetime> (interval)",
-                                     -4.351567427189173),
-                                    ("day-of-week<time-of-day> - <time-of-day> (interval)",
-                                     -4.351567427189173),
+                                     -5.295814236329918),
+                                    ("intersectFriday", -4.602667055769973),
+                                    ("year<time> \47560\51648\47561 <cycle>", -4.890349128221754),
+                                    ("next <cycle>Friday", -5.295814236329918),
+                                    ("dayhour", -2.0571357841655376),
+                                    ("last <cycle>Sunday", -4.890349128221754),
+                                    ("monthday", -2.462600892273702),
+                                    ("yearhour", -3.591066144091493),
+                                    ("<time> <part-of-day>time-of-day", -4.379523504455763),
+                                    ("this <cycle>Tuesday", -5.295814236329918),
+                                    ("dayTuesday", -5.295814236329918),
+                                    ("intersectam|pm <time-of-day>", -3.0985896589936988),
+                                    ("next <cycle><time-of-day> am|pm", -5.295814236329918),
+                                    ("next <cycle>am|pm <time-of-day>", -4.890349128221754),
+                                    ("yearintersect", -2.9932291433358724),
                                     ("monthday with korean number - \51068\51068..\44396\51068",
-                                     -5.267858159063328),
-                                    ("dayday-of-week", -4.351567427189173),
-                                    ("this <cycle>day-of-week", -4.862393050955164),
-                                    ("day-of-week<time> timezone", -4.862393050955164),
-                                    ("monthhour", -3.563110066824903),
-                                    ("mm/ddam|pm <time-of-day>", -4.574710978503383),
-                                    ("todayam|pm <time-of-day>", -4.574710978503383),
+                                     -5.295814236329918),
+                                    ("Saturdaytime-of-day", -5.295814236329918),
+                                    ("intersectMonday", -4.890349128221754),
+                                    ("monthhour", -3.591066144091493),
+                                    ("Thursday<time> timezone", -4.890349128221754),
+                                    ("mm/ddam|pm <time-of-day>", -4.602667055769973),
+                                    ("todayam|pm <time-of-day>", -4.602667055769973),
                                     ("the day before yesterday - \50634\44536\51228am|pm <time-of-day>",
-                                     -4.351567427189173),
-                                    ("dayday", -3.6584202466292277),
-                                    ("hourhour", -3.763780762287054),
-                                    ("year<time> <ordinal> <cycle>", -5.267858159063328),
-                                    ("month<datetime> - <datetime> (interval)", -4.862393050955164),
-                                    ("dayam|pm <time-of-day>", -5.267858159063328),
-                                    ("day-of-weekam|pm <time-of-day>", -4.574710978503383),
-                                    ("time-of-dayafter <time-of-day>", -5.267858159063328),
-                                    ("monthminute", -4.862393050955164),
-                                    ("hourminute", -4.574710978503383),
-                                    ("intersectday", -4.169245870395218),
-                                    ("am|pm <time-of-day>after <time-of-day>", -5.267858159063328),
-                                    ("last <cycle>day-of-week", -4.574710978503383),
-                                    ("month<time> <part-of-day>", -4.862393050955164),
-                                    ("yearmonth", -3.1277919955670574),
-                                    ("dayminute", -3.563110066824903),
-                                    ("today<date>\50640", -5.267858159063328),
-                                    ("mm/dd<date>\50640", -5.267858159063328),
+                                     -4.379523504455763),
+                                    ("dayday", -3.686376323895818),
+                                    ("hourhour", -3.791736839553644),
+                                    ("year<time> <ordinal> <cycle>", -5.295814236329918),
+                                    ("month<datetime> - <datetime> (interval)", -4.890349128221754),
+                                    ("dayam|pm <time-of-day>", -5.295814236329918),
+                                    ("last <cycle>Tuesday", -5.295814236329918),
+                                    ("time-of-dayafter <time-of-day>", -5.295814236329918),
+                                    ("monthminute", -4.890349128221754),
+                                    ("hourminute", -4.602667055769973),
+                                    ("this <cycle>Wednesday", -5.295814236329918),
+                                    ("Thursdayhh:mm", -4.890349128221754),
+                                    ("intersectday", -4.197201947661808),
+                                    ("am|pm <time-of-day>after <time-of-day>", -5.295814236329918),
+                                    ("dayMonday", -4.890349128221754),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -4.379523504455763),
+                                    ("next <cycle>Wednesday", -5.295814236329918),
+                                    ("month<time> <part-of-day>", -4.890349128221754),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.04305126783455),
+                                    ("yearmonth", -3.1557480728336476),
+                                    ("dayminute", -3.424012059428327),
+                                    ("today<date>\50640", -5.295814236329918),
+                                    ("mm/dd<date>\50640", -5.295814236329918),
                                     ("<hour-of-day> <integer> (as relative minutes)seconds",
-                                     -5.267858159063328),
-                                    ("<time> <part-of-day><date>\50640", -4.862393050955164),
-                                    ("monthintersect", -3.6584202466292277),
+                                     -5.295814236329918),
+                                    ("<time> <part-of-day><date>\50640", -4.890349128221754),
+                                    ("dayFriday", -5.295814236329918),
+                                    ("monthintersect", -3.686376323895818),
                                     ("year<time> \47560\51648\47561 <day-of-week>",
-                                     -5.267858159063328),
-                                    ("intersectintersect", -3.4760986898352733),
-                                    ("weekday", -3.6584202466292277),
+                                     -5.295814236329918),
+                                    ("intersectintersect", -3.5040547671018634),
+                                    ("weekday", -3.686376323895818),
                                     ("intersectday with korean number - \51068\51068..\44396\51068",
-                                     -4.862393050955164),
-                                    ("yearday", -3.4760986898352733),
-                                    ("day-of-weekhh:mm", -4.862393050955164),
-                                    ("yearweek", -4.862393050955164),
-                                    ("minutesecond", -5.267858159063328),
+                                     -4.890349128221754),
+                                    ("yearday", -3.5040547671018634),
+                                    ("Thursdayam|pm <time-of-day>", -5.295814236329918),
+                                    ("yearweek", -4.890349128221754),
+                                    ("minutesecond", -5.295814236329918),
                                     ("<time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
-                                     -4.862393050955164),
-                                    ("tomorrow<time-of-day> am|pm", -5.267858159063328),
-                                    ("tomorrowam|pm <time-of-day>", -4.862393050955164),
-                                    ("dayintersect", -4.862393050955164),
-                                    ("day-of-weektime-of-day", -5.267858159063328)],
-                               n = 174},
+                                     -4.890349128221754),
+                                    ("Fridayam|pm <time-of-day>", -4.890349128221754),
+                                    ("next <cycle>Tuesday", -4.890349128221754),
+                                    ("tomorrow<time-of-day> am|pm", -5.295814236329918),
+                                    ("tomorrowam|pm <time-of-day>", -4.890349128221754),
+                                    ("dayintersect", -4.890349128221754)],
+                               n = 176},
                    koData =
-                     ClassData{prior = -1.0143519450503697, unseen = -5.602118820879701,
+                     ClassData{prior = -1.0551271767283708, unseen = -5.594711379601839,
                                likelihoods =
                                  HashMap.fromList
-                                   [("year<time> \47560\51648\47561 <cycle>", -4.90527477843843),
-                                    ("day-of-weekintersect", -4.90527477843843),
-                                    ("dayhour", -2.2662174488231708),
-                                    ("daymonth", -4.499809670330265),
-                                    ("monthday", -3.1135153092103742),
-                                    ("yearhour", -3.200526686200004),
-                                    ("<time> <part-of-day>time-of-day", -3.8066624897703196),
-                                    ("houryear", -4.212127597878484),
-                                    ("day-of-weekafter <time-of-day>", -4.90527477843843),
+                                   [("year<time> \47560\51648\47561 <cycle>", -4.897839799950911),
+                                    ("dayhour", -2.2587824703356527),
+                                    ("monthday", -3.1930917077124863),
+                                    ("yearhour", -3.1930917077124863),
+                                    ("<time> <part-of-day>time-of-day", -3.7992275112828016),
+                                    ("houryear", -4.204692619390966),
                                     ("after <time-of-day>by <time> - \44620\51648",
-                                     -4.90527477843843),
-                                    ("intersectam|pm <time-of-day>", -4.499809670330265),
-                                    ("intersect<time> <part-of-day>", -3.9889840465642745),
-                                    ("yearintersect", -3.033472601536838),
-                                    ("day-of-week<time-of-day> - <time-of-day> (interval)",
-                                     -3.9889840465642745),
-                                    ("intersectmonth", -4.90527477843843),
-                                    ("time-of-day<duration> ago", -4.90527477843843),
-                                    ("this <cycle>day-of-week", -4.499809670330265),
-                                    ("intersecttime-of-day", -4.499809670330265),
-                                    ("monthhour", -3.033472601536838),
-                                    ("intersectlast <time>", -4.90527477843843),
-                                    ("dayday", -3.9889840465642745),
-                                    ("hourhour", -2.959364629383116),
+                                     -4.897839799950911),
+                                    ("intersectam|pm <time-of-day>", -4.492374691842747),
+                                    ("hournograin", -4.897839799950911),
+                                    ("intersect<time> <part-of-day>", -3.9815490680767565),
+                                    ("yearintersect", -3.02603762304932),
+                                    ("time-of-day<duration> ago", -4.897839799950911),
+                                    ("intersecttime-of-day", -4.492374691842747),
+                                    ("monthhour", -3.02603762304932),
+                                    ("intersectlast <time>", -4.897839799950911),
+                                    ("dayday", -3.9815490680767565),
+                                    ("hourhour", -2.951929650895598),
                                     ("month<datetime> - <datetime> (interval)",
-                                     -3.9889840465642745),
-                                    ("dayam|pm <time-of-day>", -4.499809670330265),
-                                    ("day-of-weekam|pm <time-of-day>", -4.90527477843843),
-                                    ("hourminute", -4.212127597878484),
+                                     -3.9815490680767565),
+                                    ("dayam|pm <time-of-day>", -4.492374691842747),
+                                    ("hourminute", -4.204692619390966),
+                                    ("Thursdayhh:mm", -4.492374691842747),
                                     ("<time-of-day> - <time-of-day> (interval)last <time>",
-                                     -3.9889840465642745),
-                                    ("intersectday", -4.499809670330265),
-                                    ("<datetime> - <datetime> (interval)day", -3.9889840465642745),
-                                    ("month<time> <part-of-day>", -4.499809670330265),
-                                    ("yearmonth", -4.499809670330265),
-                                    ("dayminute", -3.9889840465642745),
-                                    ("<time> <part-of-day><date>\50640", -4.90527477843843),
-                                    ("last <time>time-of-day", -4.90527477843843),
-                                    ("monthintersect", -3.295836866004329),
-                                    ("hoursecond", -4.90527477843843),
-                                    ("year<time> <part-of-day>", -4.499809670330265),
-                                    ("intersectintersect", -3.6525118099430616),
-                                    ("weekday", -4.499809670330265),
+                                     -3.9815490680767565),
+                                    ("intersectday", -4.492374691842747),
+                                    ("Thursdayintersect", -4.897839799950911),
+                                    ("this <cycle>Monday", -4.492374691842747),
+                                    ("<datetime> - <datetime> (interval)day", -3.9815490680767565),
+                                    ("month<time> <part-of-day>", -4.492374691842747),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.492374691842747),
+                                    ("yearmonth", -4.492374691842747),
+                                    ("Fridayafter <time-of-day>", -4.897839799950911),
+                                    ("dayminute", -4.492374691842747),
+                                    ("<time> <part-of-day><date>\50640", -4.897839799950911),
+                                    ("last <time>time-of-day", -4.897839799950911),
+                                    ("monthintersect", -3.3937624031746374),
+                                    ("year<time> <part-of-day>", -4.492374691842747),
+                                    ("intersectintersect", -3.6450768314555435),
+                                    ("weekday", -4.492374691842747),
                                     ("intersectday with korean number - \51068\51068..\44396\51068",
-                                     -4.499809670330265),
-                                    ("day<time> <part-of-day>", -4.90527477843843),
-                                    ("yearday", -3.8066624897703196),
-                                    ("day-of-weekhh:mm", -4.499809670330265),
+                                     -4.492374691842747),
+                                    ("day<time> <part-of-day>", -4.897839799950911),
+                                    ("yearday", -3.7992275112828016),
+                                    ("Thursdayam|pm <time-of-day>", -4.897839799950911),
                                     ("<time-of-day> - <time-of-day> (interval)time-of-day",
-                                     -4.499809670330265),
-                                    ("intersectafter <time-of-day>", -3.4011973816621555),
+                                     -4.492374691842747),
+                                    ("intersectafter <time-of-day>", -3.3937624031746374),
                                     ("<time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
-                                     -4.499809670330265),
-                                    ("dayintersect", -4.90527477843843),
-                                    ("mm/ddafter <time-of-day>", -4.90527477843843),
-                                    ("todayafter <time-of-day>", -4.90527477843843)],
-                               n = 99}}),
-       ("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}}),
+                                     -4.492374691842747),
+                                    ("dayintersect", -4.897839799950911),
+                                    ("mm/ddafter <time-of-day>", -4.897839799950911),
+                                    ("todayafter <time-of-day>", -4.897839799950911)],
+                               n = 94}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = -1.0608719606852628,
@@ -334,6 +352,13 @@
                      ClassData{prior = -0.42488319396526597,
                                unseen = -2.9444389791664407,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
+       ("Saturday",
+        Classifier{okData =
+                     ClassData{prior = 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 <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.12516314295400605,
@@ -360,14 +385,15 @@
                                n = 2}}),
        ("this <day-of-week>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("day-of-week", -0.6931471805599453)],
+                                   [("Wednesday", -1.791759469228055),
+                                    ("Monday", -1.3862943611198906), ("day", -0.8754687373538999),
+                                    ("Tuesday", -1.791759469228055)],
                                n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("yyyy-mm-dd",
         Classifier{okData =
@@ -412,6 +438,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Monday",
+        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,
@@ -454,26 +487,26 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (21..99) - TYPE 2",
         Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.3978952727983707,
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
                                    [("integer (20..90) - TYPE 2 and ordinalsinteger (1..4) - for ordinals",
-                                     -1.6094379124341003),
+                                     -1.5040773967762742),
                                     ("integer - TYPE 1: powers of teninteger - TYPE 1",
-                                     -1.2039728043259361),
+                                     -1.0986122886681098),
                                     ("compose by multiplicationinteger - TYPE 1",
-                                     -1.2039728043259361)],
+                                     -1.0986122886681098)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.8109302162163288,
-                               unseen = -2.3025850929940455,
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.0794415416798357,
                                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}}),
+                                   [("integer - TYPE 1: powers of teninteger - TYPE 1",
+                                     -0.8472978603872037),
+                                    ("integer (numeric)integer - TYPE 1", -1.252762968495368)],
+                               n = 3}}),
        ("Independence Movement Day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -509,7 +542,7 @@
                      ClassData{prior = -0.40546510810816444,
                                unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("christmas eve",
+       ("Christmas Eve",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1},
@@ -531,6 +564,13 @@
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
                                n = 7}}),
+       ("Friday",
+        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|during the <part-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -602,6 +642,13 @@
                    koData =
                      ClassData{prior = 0.0, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("afternoon",
         Classifier{okData =
                      ClassData{prior = -0.2876820724517809,
@@ -676,24 +723,26 @@
                                n = 2}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -1.289667525430819, unseen = -3.258096538021482,
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.4011973816621555,
                                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},
+                                   [("integer (numeric)", -0.4769240720903093),
+                                    ("integer - TYPE 1", -2.6741486494265287),
+                                    ("integer (1..4) - for ordinals", -1.7578579175523736),
+                                    ("integer (1..10) - TYPE 2", -2.6741486494265287)],
+                               n = 23},
                    koData =
-                     ClassData{prior = -0.32208349916911333, unseen = -4.04305126783455,
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.970291913552122,
                                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}}),
+                                   [("integer (numeric)", -1.0608719606852628),
+                                    ("integer - TYPE 1", -0.8157495026522777),
+                                    ("integer (20..90) - TYPE 2 and ordinals", -3.258096538021482),
+                                    ("integer (21..99) - TYPE 2", -3.258096538021482),
+                                    ("integer (1..4) - for ordinals", -2.159484249353372)],
+                               n = 46}}),
        ("year",
         Classifier{okData =
                      ClassData{prior = -0.9873866535578852, unseen = -3.258096538021482,
@@ -910,9 +959,8 @@
                      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)],
+                                   [("day", -2.03688192726104), ("Sunday", -2.03688192726104),
+                                    ("hour", -2.03688192726104), ("week-end", -2.03688192726104)],
                                n = 4},
                    koData =
                      ClassData{prior = -6.0624621816434854e-2,
@@ -985,6 +1033,15 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
        ("<integer> and an half hours",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.9459101490553135,
@@ -1039,7 +1096,7 @@
                                likelihoods =
                                  HashMap.fromList
                                    [("day", -1.3862943611198906), ("month", -1.3862943611198906),
-                                    ("day-of-week", -1.3862943611198906)],
+                                    ("Tuesday", -1.3862943611198906)],
                                n = 2},
                    koData =
                      ClassData{prior = -1.0986122886681098,
@@ -1070,15 +1127,6 @@
                                     ("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,
@@ -1209,6 +1257,13 @@
                                     ("<hour-of-day> <integer> (as relative minutes)",
                                      -1.6094379124341003)],
                                n = 2}}),
+       ("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}}),
        ("New Year's Day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -1238,31 +1293,42 @@
                    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}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.9444616088408514, unseen = -3.258096538021482,
+                     ClassData{prior = -0.49247648509779407,
+                               unseen = -3.5263605246161616,
                                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},
+                                   [("hh:mmtime-of-day (latent)", -1.8870696490323797),
+                                    ("minuteminute", -1.7047480922384253),
+                                    ("hh:mmhh:mm", -1.7047480922384253),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("minutehour", -1.8870696490323797),
+                                    ("am|pm <time-of-day>am|pm <time-of-day>",
+                                     -2.3978952727983707)],
+                               n = 11},
                    koData =
-                     ClassData{prior = -0.49247648509779407,
-                               unseen = -3.5263605246161616,
+                     ClassData{prior = -0.9444616088408514, unseen = -3.258096538021482,
                                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),
+                                   [("time-of-dayam|pm <time-of-day>", -2.120263536200091),
+                                    ("time-of-daytime-of-day (latent)", -2.5257286443082556),
+                                    ("hh:mmtime-of-day (latent)", -2.5257286443082556),
+                                    ("am|pm <time-of-day>time-of-day (latent)",
+                                     -2.5257286443082556),
                                     ("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}}),
+                                     -2.5257286443082556),
+                                    ("hourhour", -1.2729656758128873),
+                                    ("time-of-day<time-of-day>\51060\51204", -2.5257286443082556),
+                                    ("minutehour", -2.5257286443082556)],
+                               n = 7}}),
        ("last n <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.713572066704308,
@@ -1354,6 +1420,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("compose by multiplication",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
@@ -1409,22 +1482,17 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("season", -1.466337068793427), ("day", -1.466337068793427),
-                                    ("hour", -1.466337068793427), ("morning", -1.8718021769015913),
-                                    ("week-end", -1.8718021769015913)],
+                                   [("day", -1.540445040947149), ("hour", -1.540445040947149),
+                                    ("Winter", -1.9459101490553135),
+                                    ("morning", -1.9459101490553135),
+                                    ("week-end", -1.9459101490553135),
+                                    ("Summer", -1.9459101490553135)],
                                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.7376696182833684,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 40},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("within <duration>",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/LO_XX.hs b/Duckling/Ranking/Classifiers/LO_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/LO_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.LO_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/ML_XX.hs b/Duckling/Ranking/Classifiers/ML_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ML_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.ML_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/MN_XX.hs b/Duckling/Ranking/Classifiers/MN_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/MN_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.MN_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_XX.hs b/Duckling/Ranking/Classifiers/NB_XX.hs
--- a/Duckling/Ranking/Classifiers/NB_XX.hs
+++ b/Duckling/Ranking/Classifiers/NB_XX.hs
@@ -23,32 +23,31 @@
   = HashMap.fromList
       [("L\248rdag",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                     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 = -3.4657359027997265,
+                     ClassData{prior = 0.0, unseen = -3.7376696182833684,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.488077055429833),
-                                    ("<time-of-day> o'clock", -2.740840023925201),
-                                    ("hh:mm", -1.488077055429833), ("hour", -2.0476928433652555),
-                                    ("minute", -1.0360919316867756)],
-                               n = 13},
+                                   [("at <time-of-day>", -1.410986973710262),
+                                    ("<time-of-day> o'clock", -3.0204248861443626),
+                                    ("hh:mm", -1.5163474893680884), ("hour", -2.1041341542702074),
+                                    ("minute", -1.0055218656020977)],
+                               n = 18},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.7754834672205811, unseen = -4.912654885736052,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 134},
+                     ClassData{prior = -0.8446970786871463, unseen = -5.117993812416755,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 165},
                    koData =
-                     ClassData{prior = -0.6170774618231845,
-                               unseen = -5.0689042022202315,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 157}}),
+                     ClassData{prior = -0.561570822771226, unseen = -5.3981627015177525,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 219}}),
        ("the day before yesterday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -65,8 +64,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("lunch",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -79,62 +78,60 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.0910424533583156,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -1.0986122886681098),
-                                    ("tomorrowevening", -2.0149030205422647),
-                                    ("tomorrowlunch", -2.0149030205422647),
-                                    ("yesterdayevening", -2.0149030205422647),
-                                    ("Mandagmorning", -2.0149030205422647)],
-                               n = 4},
+                                   [("dayhour", -0.9650808960435872),
+                                    ("tomorrowevening", -1.9459101490553135),
+                                    ("tomorrowlunch", -1.9459101490553135),
+                                    ("yesterdayevening", -2.3513752571634776),
+                                    ("Mandagmorning", -1.9459101490553135)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
+                     ClassData{prior = -1.0116009116784799, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
-                                   [("yearhour", -1.1786549963416462),
+                                   [("yearhour", -1.0986122886681098),
                                     ("year (latent)in|during the <part-of-day>",
-                                     -1.1786549963416462)],
-                               n = 3}}),
+                                     -1.0986122886681098)],
+                               n = 4}}),
        ("dd/mm",
         Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                     ClassData{prior = -0.5108256237659907, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
                    koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
        ("today",
         Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
                    koData =
-                     ClassData{prior = -1.3862943611198906,
+                     ClassData{prior = -1.6094379124341003,
                                unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("at <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.2776317365982795, unseen = -4.68213122712422,
+                     ClassData{prior = -0.2488960474166244,
+                               unseen = -5.2574953720277815,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<time> timezone", -3.0633909220278057),
-                                    ("time-of-day (latent)", -1.3055330044754323),
+                                   [("<time> timezone", -3.3063632789913164),
+                                    ("time-of-day (latent)", -1.244940242814159),
                                     ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5742165457937967),
-                                    ("hh:mm", -1.9647786333596962),
-                                    ("<time-of-day> sharp", -3.5742165457937967),
-                                    ("hour", -1.23884162997676), ("minute", -1.6283063967384832)],
-                               n = 50},
+                                     -3.865979066926739),
+                                    ("hh:mm", -2.074219597698684),
+                                    ("<time-of-day> sharp", -3.3063632789913164),
+                                    ("hour", -1.1413995638733185), ("minute", -1.7557658665801497)],
+                               n = 92},
                    koData =
-                     ClassData{prior = -1.4170660197866443,
-                               unseen = -3.6888794541139363,
+                     ClassData{prior = -1.5125880864441827, unseen = -4.0943445622221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("time-of-day (latent)", -0.8303483020734304),
-                                    ("hour", -0.8303483020734304)],
-                               n = 16}}),
+                                   [("time-of-day (latent)", -0.7817005779013904),
+                                    ("hour", -0.7817005779013904)],
+                               n = 26}}),
        ("absorption of , after named day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.1354942159291497,
@@ -165,27 +162,28 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("on <date>",
         Classifier{okData =
-                     ClassData{prior = -0.3313571359544425, unseen = -4.219507705176107,
+                     ClassData{prior = -0.3272129112084162, unseen = -4.330733340286331,
                                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},
+                                   [("L\248rdag", -3.2188758248682006),
+                                    ("on <date>", -3.624340932976365),
+                                    ("Mandag", -3.624340932976365),
+                                    ("Torsdag", -2.2380465718564744),
+                                    ("the <day-of-month> (non ordinal)", -3.2188758248682006),
+                                    ("<day-of-month>(ordinal) <named-month>", -2.2380465718564744),
+                                    ("day", -0.8517522107365838),
+                                    ("the <day-of-month> (ordinal)", -3.624340932976365),
+                                    ("<day-of-month> (ordinal)", -1.91959284073794)],
+                               n = 31},
                    koData =
-                     ClassData{prior = -1.2656663733312759,
-                               unseen = -3.5263605246161616,
+                     ClassData{prior = -1.276293465905562, unseen = -3.6375861597263857,
                                likelihoods =
                                  HashMap.fromList
-                                   [("on <date>", -2.3978952727983707),
-                                    ("time-of-day (latent)", -1.1939224684724346),
-                                    ("hour", -1.0116009116784799)],
-                               n = 11}}),
+                                   [("on <date>", -2.512305623976115),
+                                    ("year (latent)", -2.917770732084279),
+                                    ("time-of-day (latent)", -1.3083328196501787),
+                                    ("year", -2.917770732084279), ("hour", -1.126011262856224)],
+                               n = 12}}),
        ("integer (0..19)",
         Classifier{okData =
                      ClassData{prior = -0.13005312824819779,
@@ -197,39 +195,43 @@
                                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,
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -0.9808292530117262),
-                                    ("hh:mmhh:mm", -0.9808292530117262)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.2039728043259361),
+                                    ("hh:mmhh:mm", -1.2039728043259361),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.9459101490553135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 2}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 1}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.7047480922384253),
+                                    ("minuteminute", -1.2992829841302609),
+                                    ("hh:mmhh:mm", -1.2992829841302609),
+                                    ("minutehour", -1.7047480922384253)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
-                                    ("minuteminute", -1.7047480922384253),
-                                    ("minutehour", -1.2992829841302609),
-                                    ("hh:mmintersect", -1.7047480922384253)],
-                               n = 3}}),
+                                   [("hh:mmtime-of-day (latent)", -1.5040773967762742),
+                                    ("minuteminute", -1.5040773967762742),
+                                    ("minutehour", -1.5040773967762742),
+                                    ("hh:mmintersect", -1.5040773967762742)],
+                               n = 2}}),
        ("month (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -267,6 +269,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("November",
+        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 (grain)",
         Classifier{okData =
                      ClassData{prior = -0.10536051565782628,
@@ -276,6 +285,13 @@
                      ClassData{prior = -2.3025850929940455,
                                unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("dd/m",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("<ordinal> quarter",
         Classifier{okData =
                      ClassData{prior = -0.6931471805599453,
@@ -304,145 +320,135 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.42187813774949445,
-                               unseen = -5.905361848054571,
+                     ClassData{prior = -0.3305637999350466, unseen = -6.156978985585555,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Onsdagthis <cycle>", -5.209486152841421),
-                                    ("Torsdag<time> timezone", -3.956723184346053),
+                                   [("Onsdagthis <cycle>", -5.461710913456472),
+                                    ("Torsdag<time> timezone", -3.9576335166801986),
                                     ("<datetime> - <datetime> (interval)on <date>",
-                                     -4.110873864173311),
+                                     -4.363098624788362),
                                     ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.110873864173311),
-                                    ("hourday", -5.209486152841421),
-                                    ("dayhour", -2.9581943542349256),
-                                    ("daymonth", -2.9581943542349256),
-                                    ("monthyear", -3.130044611161585),
+                                     -4.363098624788362),
+                                    ("hourday", -5.056245805348308),
+                                    ("dayhour", -2.2836570831085266),
+                                    ("daymonth", -3.1103356562929947),
+                                    ("monthyear", -3.3822693717766366),
                                     ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.209486152841421),
-                                    ("Mandagon <date>", -4.804021044733257),
-                                    ("intersecthh:mm", -5.209486152841421),
+                                     -5.056245805348308),
+                                    ("Mandagon <date>", -5.056245805348308),
+                                    ("intersecthh:mm", -5.461710913456472),
                                     ("Torsdagbetween <datetime> and <datetime> (interval)",
-                                     -5.209486152841421),
-                                    ("Torsdagat <time-of-day>", -4.293195420967266),
-                                    ("on <date>Februar", -4.804021044733257),
-                                    ("Marsyear", -4.804021044733257),
+                                     -5.056245805348308),
+                                    ("Torsdagat <time-of-day>", -4.208947944961104),
+                                    ("on <date>Februar", -5.056245805348308),
+                                    ("Marsyear", -5.056245805348308),
                                     ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -4.804021044733257),
-                                    ("Oktoberyear", -3.6000482404073204),
+                                     -5.056245805348308),
+                                    ("Oktoberyear", -3.8522730010223722),
+                                    ("on <date>November", -5.461710913456472),
                                     ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.804021044733257),
+                                     -4.768563732896527),
                                     ("Torsdagfrom <datetime> - <datetime> (interval)",
-                                     -4.804021044733257),
-                                    ("Mandagintersect", -4.804021044733257),
-                                    ("last <day-of-week> of <time>year", -4.804021044733257),
-                                    ("intersectFebruar", -4.804021044733257),
-                                    ("todayat <time-of-day>", -4.804021044733257),
-                                    ("dayday", -3.06941998934515),
-                                    ("dd/mmat <time-of-day>", -4.293195420967266),
-                                    ("intersect by \",\"hh:mm", -4.293195420967266),
-                                    ("dayyear", -3.3376839759398296),
-                                    ("tomorrow<time-of-day> sharp", -4.804021044733257),
+                                     -4.768563732896527),
+                                    ("Mandagintersect", -5.056245805348308),
+                                    ("dd/mat <time-of-day>", -4.545420181582317),
+                                    ("last <day-of-week> of <time>year", -5.056245805348308),
+                                    ("intersectFebruar", -5.056245805348308),
+                                    ("todayat <time-of-day>", -4.768563732896527),
+                                    ("dayday", -3.3216447499602015),
+                                    ("dd/mmat <time-of-day>", -4.208947944961104),
+                                    ("intersect by \",\"hh:mm", -4.545420181582317),
+                                    ("dayyear", -3.7569628212180475),
+                                    ("tomorrow<time-of-day> sharp", -4.208947944961104),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.804021044733257),
+                                     -5.056245805348308),
+                                    ("the <day-of-month> (ordinal)November", -5.461710913456472),
                                     ("Onsdag<named-month> <day-of-month> (non ordinal)",
-                                     -5.209486152841421),
-                                    ("Onsdagthis <time>", -4.516338972281476),
+                                     -5.461710913456472),
+                                    ("Onsdagthis <time>", -4.768563732896527),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.110873864173311),
-                                    ("tomorrowuntil <time-of-day>", -4.804021044733257),
+                                     -4.363098624788362),
+                                    ("tomorrowuntil <time-of-day>", -4.208947944961104),
                                     ("S\248ndag<day-of-month> (non ordinal) <named-month>",
-                                     -5.209486152841421),
+                                     -5.461710913456472),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.516338972281476),
-                                    ("the <day-of-month> (ordinal)Februar", -4.804021044733257),
-                                    ("after <time-of-day>at <time-of-day>", -4.804021044733257),
-                                    ("the <day-of-month> (ordinal)Mars", -4.293195420967266),
+                                     -4.768563732896527),
+                                    ("the <day-of-month> (ordinal)Februar", -5.056245805348308),
+                                    ("after <time-of-day>at <time-of-day>", -4.208947944961104),
+                                    ("the <day-of-month> (ordinal)Mars", -4.545420181582317),
                                     ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -4.804021044733257),
-                                    ("Mandagthe <day-of-month> (ordinal)", -5.209486152841421),
-                                    ("Mandagthis <cycle>", -5.209486152841421),
-                                    ("Tirsdagthis <time>", -4.804021044733257),
-                                    ("tomorrowafter <time-of-day>", -4.804021044733257),
-                                    ("Tirsdagthis <cycle>", -5.209486152841421),
+                                     -5.056245805348308),
+                                    ("Mandagthe <day-of-month> (ordinal)", -5.461710913456472),
+                                    ("Mandagthis <cycle>", -5.461710913456472),
+                                    ("Tirsdagthis <time>", -5.056245805348308),
+                                    ("tomorrowafter <time-of-day>", -4.208947944961104),
+                                    ("Tirsdagthis <cycle>", -5.461710913456472),
                                     ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.293195420967266),
-                                    ("dayminute", -2.644536795379884),
+                                     -4.545420181582317),
+                                    ("dayminute", -2.4659786399024815),
                                     ("from <datetime> - <datetime> (interval)on <date>",
-                                     -4.516338972281476),
-                                    ("on <date>Mars", -4.293195420967266),
-                                    ("<ordinal> <cycle> of <time>year", -4.804021044733257),
-                                    ("minuteday", -2.606796467397037),
+                                     -4.768563732896527),
+                                    ("on <date>Mars", -4.545420181582317),
+                                    ("<ordinal> <cycle> of <time>year", -5.056245805348308),
+                                    ("minuteday", -2.571339155560308),
                                     ("absorption of , after named dayintersect",
-                                     -5.209486152841421),
-                                    ("yearhh:mm", -5.209486152841421),
-                                    ("Onsdagnext <cycle>", -5.209486152841421),
+                                     -5.461710913456472),
+                                    ("yearhh:mm", -5.461710913456472),
+                                    ("Onsdagnext <cycle>", -5.461710913456472),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -4.804021044733257),
-                                    ("dd/mmyear", -4.804021044733257),
-                                    ("Septemberyear", -4.293195420967266),
-                                    ("at <time-of-day>on <date>", -5.209486152841421),
+                                     -5.056245805348308),
+                                    ("Septemberyear", -4.545420181582317),
+                                    ("at <time-of-day>on <date>", -5.056245805348308),
                                     ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -5.209486152841421),
+                                     -5.461710913456472),
                                     ("between <datetime> and <datetime> (interval)on <date>",
-                                     -5.209486152841421),
-                                    ("dayweek", -4.110873864173311),
-                                    ("weekyear", -4.293195420967266),
-                                    ("hh:mmtomorrow", -4.516338972281476),
-                                    ("tomorrowat <time-of-day>", -3.956723184346053),
-                                    ("at <time-of-day>tomorrow", -4.804021044733257),
-                                    ("last <cycle> of <time>year", -4.293195420967266),
+                                     -5.461710913456472),
+                                    ("dayweek", -4.363098624788362),
+                                    ("weekyear", -4.545420181582317),
+                                    ("hh:mmtomorrow", -3.9576335166801986),
+                                    ("tomorrowat <time-of-day>", -3.2104191148499774),
+                                    ("at <time-of-day>tomorrow", -4.208947944961104),
+                                    ("last <cycle> of <time>year", -4.545420181582317),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.804021044733257),
-                                    ("yearminute", -5.209486152841421)],
-                               n = 141},
+                                     -5.056245805348308),
+                                    ("yearminute", -5.461710913456472)],
+                               n = 194},
                    koData =
-                     ClassData{prior = -1.066572934923493, unseen = -5.4510384535657,
+                     ClassData{prior = -1.2676886187120435,
+                               unseen = -5.4638318050256105,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -3.0488420988679397),
-                                    ("daymonth", -2.1509005056619808),
-                                    ("monthday", -3.8372994592322094),
-                                    ("monthyear", -3.8372994592322094),
-                                    ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.7535901911063645),
-                                    ("Mandagon <date>", -4.7535901911063645),
-                                    ("Torsdagbetween <datetime> and <datetime> (interval)",
-                                     -4.7535901911063645),
-                                    ("Torsdagat <time-of-day>", -3.2495127943300903),
-                                    ("absorption of , after named dayFebruar", -4.060443010546419),
-                                    ("Marsyear", -4.060443010546419),
+                                   [("dayhour", -2.463853240590168),
+                                    ("daymonth", -2.3240912982150093),
+                                    ("monthyear", -3.8501476017100584),
+                                    ("Mandagon <date>", -4.7664383335842135),
+                                    ("Torsdagat <time-of-day>", -2.894636156682622),
+                                    ("absorption of , after named dayFebruar", -4.073291153024268),
+                                    ("Marsyear", -4.073291153024268),
                                     ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -3.5008272226109964),
-                                    ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.7535901911063645),
-                                    ("Torsdagfrom <datetime> - <datetime> (interval)",
-                                     -4.7535901911063645),
-                                    ("OnsdagFebruar", -4.7535901911063645),
-                                    ("absorption of , after named dayJuli", -4.3481250829982),
-                                    ("dd/mmat <time-of-day>", -3.8372994592322094),
-                                    ("hourhour", -3.5008272226109964),
-                                    ("dayyear", -3.5008272226109964),
-                                    ("Onsdagthis <time>", -3.5008272226109964),
+                                     -3.5136753650888455),
+                                    ("OnsdagFebruar", -4.7664383335842135),
+                                    ("dd/mat <time-of-day>", -3.8501476017100584),
+                                    ("absorption of , after named dayJuli", -4.360973225476049),
+                                    ("dd/mmat <time-of-day>", -3.5136753650888455),
+                                    ("hourhour", -3.1570004211501135),
+                                    ("dayyear", -3.5136753650888455),
+                                    ("Onsdagthis <time>", -3.5136753650888455),
                                     ("in|during the <part-of-day>until <time-of-day>",
-                                     -4.3481250829982),
-                                    ("Aprilyear", -4.7535901911063645),
-                                    ("Tirsdagthis <time>", -3.8372994592322094),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.8372994592322094),
-                                    ("until <time-of-day>on <date>", -4.7535901911063645),
-                                    ("August<day-of-month> (non ordinal) <named-month>",
-                                     -3.8372994592322094),
-                                    ("Torsdaghh:mm", -4.3481250829982),
-                                    ("dayminute", -3.0488420988679397),
-                                    ("minuteday", -3.2495127943300903),
-                                    ("hh:mmon <date>", -3.367295829986474),
-                                    ("this <part-of-day>until <time-of-day>", -4.3481250829982),
-                                    ("S\248ndagthis <time>", -3.8372994592322094),
-                                    ("tomorrownoon", -4.7535901911063645),
-                                    ("this <time>until <time-of-day>", -4.3481250829982),
-                                    ("Mandagthis <time>", -4.3481250829982)],
-                               n = 74}}),
+                                     -4.073291153024268),
+                                    ("Aprilyear", -4.7664383335842135),
+                                    ("Tirsdagthis <time>", -3.8501476017100584),
+                                    ("until <time-of-day>on <date>", -4.7664383335842135),
+                                    ("Torsdaghh:mm", -4.360973225476049),
+                                    ("dayminute", -3.2623609368079394),
+                                    ("minuteday", -3.2623609368079394),
+                                    ("hh:mmon <date>", -3.380143972464323),
+                                    ("this <part-of-day>until <time-of-day>", -4.073291153024268),
+                                    ("S\248ndagthis <time>", -3.8501476017100584),
+                                    ("tomorrownoon", -4.360973225476049),
+                                    ("this <time>until <time-of-day>", -4.073291153024268),
+                                    ("Mandagthis <time>", -4.360973225476049)],
+                               n = 76}}),
        ("<ordinal> <cycle> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.890371757896165,
@@ -476,25 +482,26 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.8754687373538999, unseen = -2.890371757896165,
+                     ClassData{prior = -0.6931471805599453, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.2237754316221157),
+                                   [("hh:mmtime-of-day (latent)", -2.2512917986064953),
+                                    ("minuteminute", -1.3350010667323402),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1400661634962708),
-                                    ("hh:mmhh:mm", -1.2237754316221157),
-                                    ("hourhour", -2.1400661634962708)],
-                               n = 5},
+                                     -2.2512917986064953),
+                                    ("hh:mmhh:mm", -1.3350010667323402),
+                                    ("hourhour", -2.2512917986064953),
+                                    ("minutehour", -2.2512917986064953)],
+                               n = 6},
                    koData =
-                     ClassData{prior = -0.5389965007326869,
-                               unseen = -3.0910424533583156,
+                     ClassData{prior = -0.6931471805599453, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.4350845252893227),
-                                    ("minuteminute", -1.6582280766035324),
-                                    ("minutehour", -1.4350845252893227),
-                                    ("hh:mmintersect", -1.6582280766035324)],
-                               n = 7}}),
+                                   [("hh:mmtime-of-day (latent)", -1.55814461804655),
+                                    ("minuteminute", -1.55814461804655),
+                                    ("minutehour", -1.55814461804655),
+                                    ("hh:mmintersect", -1.55814461804655)],
+                               n = 6}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.044522437723423,
@@ -520,27 +527,29 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6061358035703156,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
+                                   [("hh:mmtime-of-day (latent)", -2.3025850929940455),
+                                    ("minuteminute", -1.2039728043259361),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.2039728043259361),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -2.3025850929940455)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                     ClassData{prior = -1.0116009116784799, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0296194171811581),
+                                    ("minutehour", -1.0296194171811581)],
+                               n = 4}}),
        ("yyyy-mm-dd",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                     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}}),
@@ -549,20 +558,20 @@
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3}}),
+                               n = 5}}),
        ("Mandag",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                     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 = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                     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}}),
@@ -602,8 +611,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Torsdag",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                     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}}),
@@ -698,21 +707,19 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
        ("this <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.0794415416798357,
+                     ClassData{prior = -1.845826690498331, unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hour", -0.8472978603872037), ("evening", -1.252762968495368),
-                                    ("morning", -1.252762968495368)],
-                               n = 2},
+                                   [("hour", -0.8109302162163288), ("evening", -1.5040773967762742),
+                                    ("morning", -1.0986122886681098)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.332204510175204,
+                     ClassData{prior = -0.17185025692665928, unseen = -3.58351893845611,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hour", -0.7308875085427924),
-                                    ("morning", -0.7308875085427924)],
-                               n = 12}}),
+                                   [("hour", -0.7221347174331976),
+                                    ("morning", -0.7221347174331976)],
+                               n = 16}}),
        ("christmas eve",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -722,34 +729,35 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month>(ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.258096538021482,
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.4339872044851463,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)Mars", -1.8325814637483102),
-                                    ("month", -0.8209805520698302),
-                                    ("ordinal (digits)Mars", -1.6094379124341003),
-                                    ("ordinal (digits)Februar", -1.8325814637483102)],
-                               n = 10},
+                                   [("ordinal (digits)November", -2.3025850929940455),
+                                    ("ordinals (first..31st)Mars", -2.0149030205422647),
+                                    ("month", -0.8362480242006186),
+                                    ("ordinal (digits)Mars", -1.791759469228055),
+                                    ("ordinal (digits)Februar", -2.0149030205422647)],
+                               n = 12},
                    koData =
-                     ClassData{prior = -2.3978952727983707,
-                               unseen = -2.0794415416798357,
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)April", -1.252762968495368),
-                                    ("month", -1.252762968495368)],
+                                   [("ordinals (first..31st)April", -1.3862943611198906),
+                                    ("month", -1.3862943611198906)],
                                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,
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 23}}),
+                               n = 28}}),
        ("in|during the <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
+                     ClassData{prior = -2.1972245773362196,
                                unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
@@ -758,13 +766,12 @@
                                     ("evening", -1.3862943611198906)],
                                n = 2},
                    koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.367295829986474,
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.6109179126442243,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hour", -0.7672551527136672),
-                                    ("morning", -0.7672551527136672)],
-                               n = 12}}),
+                                   [("hour", -0.750305594399894), ("morning", -0.750305594399894)],
+                               n = 16}}),
        ("new year's eve",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -774,8 +781,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("tomorrow",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -819,12 +826,12 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("the <day-of-month> (ordinal)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)", -1.0116009116784799),
-                                    ("ordinal (digits)", -0.45198512374305727)],
-                               n = 9},
+                                   [("ordinals (first..31st)", -1.0986122886681098),
+                                    ("ordinal (digits)", -0.40546510810816444)],
+                               n = 10},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -833,8 +840,8 @@
                      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}}),
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
        ("afternoon",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -886,15 +893,15 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("about <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3978952727983707,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 3},
+                                   [("time-of-day (latent)", -0.8754687373538999),
+                                    ("hour", -0.8754687373538999)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -0.5596157879354228,
+                     ClassData{prior = -0.6931471805599453,
                                unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
@@ -913,26 +920,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.9267620317414506, unseen = -3.713572066704308,
+                     ClassData{prior = -0.6562426236244944, unseen = -4.276666119016055,
                                likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -2.5317807984289897e-2)],
-                               n = 38},
+                                 HashMap.fromList [("integer (numeric)", -1.4184634991956413e-2)],
+                               n = 69},
                    koData =
-                     ClassData{prior = -0.503905180921417, unseen = -4.110873864173311,
+                     ClassData{prior = -0.731466044862082, unseen = -4.204692619390966,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.2657031657330056),
-                                    ("integer (0..19)", -1.455287232606842)],
-                               n = 58}}),
+                                   [("integer (numeric)", -0.23841102344499823),
+                                    ("integer (0..19)", -1.550597412411167)],
+                               n = 64}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
+                     ClassData{prior = -0.43286408229627876,
+                               unseen = -3.258096538021482,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 26},
+                               n = 24},
                    koData =
-                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
+                     ClassData{prior = -1.0459685551826876, unseen = -2.70805020110221,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
+                               n = 13}}),
        ("last <day-of-week> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.833213344056216,
@@ -1011,12 +1019,12 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("relative minutes after|past <integer> (hour-of-day)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
                                    [("hour", -0.6931471805599453),
                                     ("integer (numeric)time-of-day (latent)", -0.6931471805599453)],
-                               n = 2},
+                               n = 3},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1102,12 +1110,12 @@
                                n = 5}}),
        ("hh:mm",
         Classifier{okData =
-                     ClassData{prior = -2.0619287202735703e-2,
-                               unseen = -3.912023005428146,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 48},
+                     ClassData{prior = -3.390155167568134e-2, unseen = -4.0943445622221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
                    koData =
-                     ClassData{prior = -3.891820298110627, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -3.4011973816621555,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("quarter after|past <integer> (hour-of-day)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.9459101490553135,
@@ -1128,13 +1136,13 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> sharp",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.2992829841302609),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
+                                   [("at <time-of-day>", -1.349926716949016),
+                                    ("time-of-day (latent)", -1.349926716949016),
+                                    ("hour", -0.7308875085427924)],
+                               n = 12},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1215,19 +1223,19 @@
                                n = 26}}),
        ("<day-of-month> (ordinal)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..31st)", -1.0116009116784799),
-                                    ("ordinal (digits)", -0.45198512374305727)],
-                               n = 9},
+                                   [("ordinals (first..31st)", -1.0986122886681098),
+                                    ("ordinal (digits)", -0.40546510810816444)],
+                               n = 10},
                    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},
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1236,18 +1244,19 @@
                      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}}),
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("until <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.890371757896165,
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.4011973816621555,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -0.8873031950009028),
-                                    ("hour", -0.8873031950009028)],
-                               n = 6},
+                                   [("at <time-of-day>", -0.8023464725249373),
+                                    ("hour", -0.8023464725249373)],
+                               n = 12},
                    koData =
-                     ClassData{prior = -1.3862943611198906,
+                     ClassData{prior = -1.9459101490553135,
                                unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
@@ -1279,8 +1288,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("evening",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                     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}}),
@@ -1407,49 +1416,59 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.6109179126442243,
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.6375861597263857,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.3862943611198906),
-                                    ("hh:mmhh:mm", -1.3862943611198906),
-                                    ("dayday", -1.791759469228055),
+                                   [("minuteminute", -1.413693335308005),
+                                    ("hh:mmhh:mm", -1.413693335308005),
+                                    ("dayday", -1.8191584434161694),
                                     ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
-                                     -1.791759469228055)],
+                                     -1.8191584434161694)],
                                n = 13},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.6109179126442243,
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.6888794541139363,
                                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),
+                                     -2.9704144655697013),
+                                    ("d/mmyear", -2.9704144655697013),
+                                    ("monthday", -1.8718021769015913),
+                                    ("minuteminute", -1.717651497074333),
+                                    ("hh:mmhh:mm", -2.9704144655697013),
+                                    ("dayyear", -2.277267285009756),
+                                    ("hh:mmintersect", -1.8718021769015913),
                                     ("August<day-of-month> (non ordinal) <named-month>",
-                                     -1.9740810260220096),
-                                    ("dd/mmyear", -2.4849066497880004)],
-                               n = 13}}),
+                                     -2.0541237336955462),
+                                    ("dd/mmyear", -2.5649493574615367)],
+                               n = 14}}),
+       ("d/mm",
+        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}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
+                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -0.7985076962177716),
-                                    ("hh:mmhh:mm", -0.7985076962177716)],
-                               n = 8},
+                                   [("hh:mmtime-of-day (latent)", -2.0794415416798357),
+                                    ("minuteminute", -0.9808292530117262),
+                                    ("hh:mmhh:mm", -0.9808292530117262),
+                                    ("minutehour", -2.0794415416798357)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
+                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.8754687373538999),
-                                    ("minuteminute", -2.4849066497880004),
-                                    ("hh:mmhh:mm", -2.4849066497880004),
-                                    ("minutehour", -0.8754687373538999)],
-                               n = 10}}),
+                                   [("hh:mmtime-of-day (latent)", -0.916290731874155),
+                                    ("minuteminute", -2.3025850929940455),
+                                    ("hh:mmhh:mm", -2.3025850929940455),
+                                    ("minutehour", -0.916290731874155)],
+                               n = 8}}),
        ("last n <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -4.04305126783455,
@@ -1479,23 +1498,24 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month> (non ordinal)",
         Classifier{okData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.1780538303479458,
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.258096538021482,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Februarinteger (numeric)", -1.3437347467010947),
-                                    ("Aprilinteger (numeric)", -2.4423470353692043),
-                                    ("month", -0.832909122935104),
-                                    ("Juliinteger (numeric)", -1.749199854809259)],
-                               n = 9},
+                                   [("Februarinteger (numeric)", -1.4271163556401458),
+                                    ("Aprilinteger (numeric)", -2.5257286443082556),
+                                    ("month", -0.8209805520698302),
+                                    ("Juliinteger (numeric)", -1.8325814637483102),
+                                    ("Novemberinteger (numeric)", -2.5257286443082556)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -1.0296194171811581, unseen = -2.772588722239781,
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.0794415416798357,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Augustinteger (numeric)", -1.0986122886681098),
-                                    ("Aprilinteger (numeric)", -2.0149030205422647),
-                                    ("month", -0.916290731874155)],
-                               n = 5}}),
+                                   [("Aprilinteger (numeric)", -1.252762968495368),
+                                    ("month", -1.252762968495368)],
+                               n = 1}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
                      ClassData{prior = -0.15415067982725836,
@@ -1549,13 +1569,11 @@
                                n = 7}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                     ClassData{prior = -0.7308875085427924, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
                    koData =
-                     ClassData{prior = -2.4849066497880004,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -0.6567795363890705, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
        ("quarter (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -1600,13 +1618,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                     ClassData{prior = -1.6094379124341003, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
                    koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+                     ClassData{prior = -0.2231435513142097, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16}}),
        ("week-end",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -1616,26 +1632,26 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("after <time-of-day>",
         Classifier{okData =
-                     ClassData{prior = -0.7537718023763802, unseen = -3.332204510175204,
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>", -1.6863989535702288),
-                                    ("intersect", -2.1972245773362196),
-                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
-                                    ("hour", -1.349926716949016)],
-                               n = 8},
+                                   [("at <time-of-day>", -1.667706820558076),
+                                    ("intersect", -2.0243817644968085),
+                                    ("tomorrow", -2.0243817644968085), ("day", -2.0243817644968085),
+                                    ("hour", -1.1977031913123406)],
+                               n = 21},
                    koData =
-                     ClassData{prior = -0.6359887667199967,
-                               unseen = -3.4011973816621555,
+                     ClassData{prior = -1.0116009116784799, unseen = -3.58351893845611,
                                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}}),
+                                   [("this <part-of-day>", -2.169053700369523),
+                                    ("christmas eve", -2.456735772821304),
+                                    ("in|during the <part-of-day>", -2.169053700369523),
+                                    ("day", -2.456735772821304), ("hh:mm", -2.8622008809294686),
+                                    ("hour", -1.252762968495368), ("minute", -2.8622008809294686),
+                                    ("this <time>", -2.169053700369523)],
+                               n = 12}}),
        ("day (grain)",
         Classifier{okData =
                      ClassData{prior = -4.8790164169432056e-2,
@@ -1644,6 +1660,15 @@
                    koData =
                      ClassData{prior = -3.044522437723423, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("dd.mm",
+        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}}),
        ("<month> dd-dd (interval)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -1667,31 +1692,33 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2443240998495033, unseen = -3.891820298110627,
+                     ClassData{prior = -1.2685113254635072,
+                               unseen = -3.9318256327243257,
                                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},
+                                   [("week", -3.2188758248682006),
+                                    ("intersect", -2.8134107167600364),
+                                    ("season", -2.3025850929940455),
+                                    ("next <cycle>", -3.2188758248682006),
+                                    ("day", -1.9661128563728327),
+                                    ("christmas days", -2.8134107167600364),
+                                    ("Oktober", -2.8134107167600364), ("hour", -1.8325814637483102),
+                                    ("evening", -3.2188758248682006),
+                                    ("month", -2.3025850929940455),
+                                    ("morning", -2.8134107167600364),
+                                    ("week-end", -2.3025850929940455)],
+                               n = 18},
                    koData =
-                     ClassData{prior = -0.3398678256223512, unseen = -4.59511985013459,
+                     ClassData{prior = -0.33024168687057687,
+                               unseen = -4.672828834461907,
                                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}}),
+                                   [("September", -3.054001181677967),
+                                    ("intersect", -2.0984897366505306),
+                                    ("Oktober", -2.2655438213136967), ("Mars", -3.054001181677967),
+                                    ("hour", -1.8302257500558512), ("month", -1.2294518896269209),
+                                    ("morning", -1.8302257500558512)],
+                               n = 46}}),
        ("within <duration>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
diff --git a/Duckling/Ranking/Classifiers/NL_BE.hs b/Duckling/Ranking/Classifiers/NL_BE.hs
--- a/Duckling/Ranking/Classifiers/NL_BE.hs
+++ b/Duckling/Ranking/Classifiers/NL_BE.hs
@@ -42,11 +42,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.7090205297162354, unseen = -4.844187086458591,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 125},
+                     ClassData{prior = -0.6300464741920015, unseen = -4.948759890378168,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 139},
                    koData =
-                     ClassData{prior = -0.6775218626568645, unseen = -4.875197323201151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 129}}),
+                     ClassData{prior = -0.7604993625894368, unseen = -4.820281565605037,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 122}}),
        ("exactly <time-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -139,12 +139,11 @@
                                n = 10}}),
        ("dd/mm",
         Classifier{okData =
-                     ClassData{prior = -0.4307829160924542, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                     ClassData{prior = -0.5108256237659907, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
                    koData =
-                     ClassData{prior = -1.0498221244986778,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
        ("today",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -196,34 +195,34 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("on <date>",
         Classifier{okData =
-                     ClassData{prior = -0.19845093872383832,
-                               unseen = -4.574710978503383,
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -4.672828834461907,
                                likelihoods =
                                  HashMap.fromList
-                                   [("thursday", -3.1780538303479458),
-                                    ("<time> <part-of-day>", -2.9549102790337356),
-                                    ("dd/mm", -2.9549102790337356),
-                                    ("saturday", -3.871201010907891),
-                                    ("intersect", -1.4733057381095205),
-                                    ("<day-of-month>(ordinal) <named-month>", -3.871201010907891),
-                                    ("friday", -3.871201010907891), ("day", -1.7311348474116202),
-                                    ("hh:mm", -3.871201010907891),
-                                    ("<day-of-month> (ordinal)", -3.1780538303479458),
-                                    ("hour", -1.7311348474116202),
-                                    ("<datetime> - <datetime> (interval)", -3.871201010907891),
+                                   [("thursday", -3.2771447329921766),
+                                    ("<time> <part-of-day>", -3.054001181677967),
+                                    ("dd/mm", -3.054001181677967), ("saturday", -3.970291913552122),
+                                    ("intersect", -1.367602228107738),
+                                    ("<day-of-month>(ordinal) <named-month>", -3.970291913552122),
+                                    ("friday", -3.970291913552122), ("day", -1.8302257500558512),
+                                    ("hh:mm", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)", -3.2771447329921766),
+                                    ("hour", -1.8302257500558512),
+                                    ("<datetime> - <datetime> (interval)", -3.970291913552122),
                                     ("<day-of-month> (non ordinal) <named-month>",
-                                     -3.871201010907891),
-                                    ("minute", -2.2617630984737906)],
-                               n = 41},
+                                     -3.970291913552122),
+                                    ("minute", -1.955388893009857)],
+                               n = 46},
                    koData =
-                     ClassData{prior = -1.7147984280919266,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("intersect", -1.2685113254635072), ("day", -2.772588722239781),
-                                    ("<day-of-month> (ordinal)", -2.772588722239781),
-                                    ("hour", -2.367123614131617), ("minute", -1.5198257537444133)],
-                               n = 9}}),
+                                   [("intersect", -1.7047480922384253),
+                                    ("day", -2.3978952727983707),
+                                    ("<day-of-month> (ordinal)", -2.3978952727983707),
+                                    ("hour", -1.9924301646902063), ("minute", -2.3978952727983707)],
+                               n = 4}}),
        ("integer (0..19)",
         Classifier{okData =
                      ClassData{prior = -5.5569851154810765e-2,
@@ -234,21 +233,17 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("between <time-of-day> and <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Halloween",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -258,21 +253,17 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("October",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -389,258 +380,222 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.29944691403136736,
-                               unseen = -6.180016653652572,
+                     ClassData{prior = -0.17538912001830978,
+                               unseen = -6.263398262591624,
                                likelihoods =
                                  HashMap.fromList
-                                   [("last <cycle>sunday", -5.484796933490655),
-                                    ("Koningsdagyear", -5.484796933490655),
-                                    ("hourday", -4.386184644822546),
+                                   [("last <cycle>sunday", -5.568344503761097),
+                                    ("Koningsdagyear", -4.064267106984823),
+                                    ("hourday", -4.4697322150929875),
                                     ("on a named-day<day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month><time-of-day>  o'clock",
-                                     -5.484796933490655),
-                                    ("dayhour", -2.3493027175615055),
-                                    ("daymonth", -4.5685062016165),
-                                    ("next <cycle>friday", -5.484796933490655),
-                                    ("monthyear", -3.8753590210565547),
+                                     -5.568344503761097),
+                                    ("dayhour", -2.4328502878319473),
+                                    ("daymonth", -4.6520537718869415),
+                                    ("next <cycle>friday", -5.568344503761097),
+                                    ("monthyear", -3.9589065913269965),
                                     ("friday<day-of-month> (non ordinal) <named-month>",
-                                     -5.079331825382491),
-                                    ("yearhour", -5.484796933490655),
-                                    ("intersect<time-of-day>  o'clock", -4.791649752930709),
-                                    ("tuesdaythis <cycle>", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("yearhour", -5.568344503761097),
+                                    ("intersect<time-of-day>  o'clock", -4.875197323201151),
+                                    ("tuesdaythis <cycle>", -5.568344503761097),
                                     ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.079331825382491),
-                                    ("saturday<time-of-day>  o'clock", -5.484796933490655),
+                                     -4.6520537718869415),
+                                    ("saturday<time-of-day>  o'clock", -5.568344503761097),
                                     ("absorption of , after named daydd/mm/yyyy",
-                                     -5.079331825382491),
-                                    ("<time-of-day> am|pmintersect", -5.484796933490655),
-                                    ("intersect<time> <part-of-day>", -4.791649752930709),
-                                    ("Marchyear", -5.484796933490655),
-                                    ("saturdayat <time-of-day>", -5.079331825382491),
-                                    ("saturday<time> <part-of-day>", -5.079331825382491),
-                                    ("dd/mm<time-of-day>  o'clock", -5.484796933490655),
-                                    ("on a named-dayat <time-of-day>", -4.791649752930709),
-                                    ("today<time-of-day>  o'clock", -5.484796933490655),
-                                    ("at <time-of-day>on a named-day", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("<time-of-day> am|pmintersect", -5.568344503761097),
+                                    ("intersect<time> <part-of-day>", -4.875197323201151),
+                                    ("Marchyear", -5.568344503761097),
+                                    ("saturdayat <time-of-day>", -5.162879395652933),
+                                    ("saturday<time> <part-of-day>", -5.162879395652933),
+                                    ("dd/mm<time-of-day>  o'clock", -5.568344503761097),
+                                    ("on a named-dayat <time-of-day>", -4.875197323201151),
+                                    ("today<time-of-day>  o'clock", -5.568344503761097),
+                                    ("at <time-of-day>on a named-day", -5.568344503761097),
                                     ("on a named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("intersect by ','year", -5.484796933490655),
-                                    ("on <date><time-of-day>  o'clock", -4.791649752930709),
-                                    ("next <cycle>monday", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("intersect by ','year", -5.568344503761097),
+                                    ("on <date><time-of-day>  o'clock", -4.875197323201151),
+                                    ("next <cycle>monday", -5.568344503761097),
                                     ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.484796933490655),
-                                    ("exactly <time-of-day>tomorrow", -5.484796933490655),
-                                    ("on a named-day<time> <part-of-day>", -5.079331825382491),
-                                    ("monthhour", -4.5685062016165),
+                                     -5.162879395652933),
+                                    ("exactly <time-of-day>tomorrow", -5.568344503761097),
+                                    ("on a named-day<time> <part-of-day>", -5.162879395652933),
+                                    ("monthhour", -4.6520537718869415),
                                     ("on <date>between <datetime> and <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("last <day-of-week> of <time>year", -5.484796933490655),
-                                    ("on a named-day<time-of-day>  o'clock", -5.484796933490655),
-                                    ("next <cycle>March", -5.484796933490655),
-                                    ("todayat <time-of-day>", -4.791649752930709),
+                                     -5.162879395652933),
+                                    ("last <day-of-week> of <time>year", -5.568344503761097),
+                                    ("on a named-day<time-of-day>  o'clock", -5.568344503761097),
+                                    ("next <cycle>March", -5.568344503761097),
+                                    ("todayat <time-of-day>", -4.875197323201151),
                                     ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -5.484796933490655),
-                                    ("on <date>at <time-of-day>", -4.791649752930709),
-                                    ("thursday<time> timezone", -5.079331825382491),
-                                    ("on <date>about <time-of-day>", -4.791649752930709),
-                                    ("dayday", -3.1822118404966093),
-                                    ("on <date><time> <part-of-day>", -4.5685062016165),
-                                    ("dd/mmabout <time-of-day>", -5.079331825382491),
-                                    ("<day-of-month> (ordinal)intersect", -5.484796933490655),
-                                    ("hourhour", -4.386184644822546),
+                                     -5.162879395652933),
+                                    ("on <date>at <time-of-day>", -4.875197323201151),
+                                    ("thursday<time> timezone", -5.162879395652933),
+                                    ("on <date>about <time-of-day>", -4.875197323201151),
+                                    ("dayday", -3.265759410767051),
+                                    ("on <date><time> <part-of-day>", -4.6520537718869415),
+                                    ("dd/mmabout <time-of-day>", -5.162879395652933),
+                                    ("<day-of-month> (ordinal)intersect", -5.568344503761097),
+                                    ("hourhour", -4.4697322150929875),
                                     ("saturday<day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
-                                    ("thursdayat <time-of-day>", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("thursdayat <time-of-day>", -5.568344503761097),
                                     ("today/tomorrow/yesterday afternoon<hour-of-day> <integer> (as relative minutes)",
-                                     -5.079331825382491),
+                                     -5.162879395652933),
                                     ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -4.386184644822546),
-                                    ("dayyear", -3.405355391810819),
-                                    ("tuesdayafter <duration>", -5.484796933490655),
-                                    ("tomorrow<time-of-day>  o'clock", -5.484796933490655),
-                                    ("<time-of-day>  o'clocktomorrow", -4.791649752930709),
+                                     -4.4697322150929875),
+                                    ("dayyear", -3.1704492309627264),
+                                    ("tuesdayafter <duration>", -5.568344503761097),
+                                    ("tomorrow<time-of-day>  o'clock", -5.568344503761097),
+                                    ("<time-of-day>  o'clocktomorrow", -4.875197323201151),
                                     ("<day-of-month> (non ordinal) <named-month>intersect",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.484796933490655),
-                                    ("<day-of-month> (ordinal)tuesday", -5.484796933490655),
-                                    ("hourminute", -4.791649752930709),
-                                    ("thursdayhh:mm", -5.484796933490655),
-                                    ("this <cycle>wednesday", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("<day-of-month> (ordinal)tuesday", -5.568344503761097),
+                                    ("hourminute", -4.875197323201151),
+                                    ("thursdayhh:mm", -5.568344503761097),
+                                    ("this <cycle>wednesday", -5.568344503761097),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month><time> <part-of-day>",
-                                     -5.079331825382491),
+                                     -5.162879395652933),
                                     ("on <date><day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
-                                    ("Aprilabout <time-of-day>", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("Aprilabout <time-of-day>", -5.568344503761097),
                                     ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("<day-of-month> (ordinal)February", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("<day-of-month> (ordinal)February", -5.568344503761097),
                                     ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.791649752930709),
+                                     -4.3155815352657285),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.5685062016165),
+                                     -4.6520537718869415),
                                     ("today/tomorrow/yesterday evening<time-of-day>  o'clock",
-                                     -5.484796933490655),
-                                    ("fridayintersect", -4.791649752930709),
+                                     -5.568344503761097),
+                                    ("fridayintersect", -4.875197323201151),
                                     ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("on <date><datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("this <cycle>monday", -5.484796933490655),
-                                    ("April<time-of-day>  o'clock", -5.484796933490655),
-                                    ("next <cycle>wednesday", -5.484796933490655),
-                                    ("hh:mmintersect", -5.079331825382491),
+                                     -5.568344503761097),
+                                    ("this <cycle>monday", -5.568344503761097),
+                                    ("April<time-of-day>  o'clock", -5.568344503761097),
+                                    ("next <cycle>wednesday", -5.568344503761097),
+                                    ("hh:mmintersect", -5.162879395652933),
                                     ("thursday<datetime> - <datetime> (interval)",
-                                     -5.079331825382491),
-                                    ("<day-of-month> (ordinal)July", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("<day-of-month> (ordinal)July", -5.568344503761097),
                                     ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.079331825382491),
-                                    ("yearmonth", -5.484796933490655),
-                                    ("at <time-of-day>intersect", -5.079331825382491),
+                                     -4.6520537718869415),
+                                    ("yearmonth", -5.568344503761097),
+                                    ("at <time-of-day>intersect", -5.162879395652933),
                                     ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.079331825382491),
+                                     -4.6520537718869415),
                                     ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.484796933490655),
-                                    ("dayminute", -2.7767467323884447),
+                                     -5.568344503761097),
+                                    ("dayminute", -2.3902906734131513),
                                     ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("intersectyear", -4.791649752930709),
-                                    ("<time-of-day> am|pmsaturday", -5.484796933490655),
-                                    ("<ordinal> <cycle> of <time>year", -5.484796933490655),
-                                    ("minuteday", -3.2875723561544357),
+                                     -5.568344503761097),
+                                    ("intersectyear", -4.875197323201151),
+                                    ("<time-of-day> am|pmsaturday", -5.568344503761097),
+                                    ("<ordinal> <cycle> of <time>year", -5.568344503761097),
+                                    ("minuteday", -3.3711199264248775),
                                     ("absorption of , after named dayintersect",
-                                     -5.484796933490655),
-                                    ("Julyyear", -5.484796933490655),
-                                    ("year<time-of-day>  o'clock", -5.484796933490655),
-                                    ("Octoberyear", -4.386184644822546),
-                                    ("hh:mmon <date>", -5.079331825382491),
+                                     -5.568344503761097),
+                                    ("Julyyear", -5.568344503761097),
+                                    ("year<time-of-day>  o'clock", -5.568344503761097),
+                                    ("Octoberyear", -4.4697322150929875),
+                                    ("hh:mmon <date>", -5.162879395652933),
                                     ("today/tomorrow/yesterday afternoonat <time-of-day>",
-                                     -5.484796933490655),
-                                    ("dd/mmyear", -5.484796933490655),
-                                    ("tuesdayin <duration>", -5.484796933490655),
-                                    ("Septemberyear", -5.079331825382491),
-                                    ("at <time-of-day>on <date>", -5.079331825382491),
-                                    ("absorption of , after named daydd/mm", -5.079331825382491),
-                                    ("intersectintersect", -5.484796933490655),
-                                    ("hh:mmon a named-day", -5.484796933490655),
-                                    ("weekday", -4.098502572370764),
-                                    ("dayweek", -4.791649752930709),
-                                    ("weekyear", -5.079331825382491),
-                                    ("on <date>February", -5.484796933490655),
-                                    ("Kerstmisyear", -5.484796933490655),
-                                    ("<month> dd-dd (interval)year", -5.484796933490655),
-                                    ("tomorrowat <time-of-day>", -5.079331825382491),
-                                    ("next <cycle>tuesday", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("tuesdayin <duration>", -5.568344503761097),
+                                    ("Septemberyear", -5.162879395652933),
+                                    ("at <time-of-day>on <date>", -5.162879395652933),
+                                    ("absorption of , after named daydd/mm", -5.162879395652933),
+                                    ("intersectintersect", -5.568344503761097),
+                                    ("hh:mmon a named-day", -5.568344503761097),
+                                    ("weekday", -4.182050142641207),
+                                    ("dayweek", -4.875197323201151),
+                                    ("weekyear", -5.162879395652933),
+                                    ("on <date>February", -5.568344503761097),
+                                    ("Kerstmisyear", -5.568344503761097),
+                                    ("<month> dd-dd (interval)year", -5.568344503761097),
+                                    ("tomorrowat <time-of-day>", -5.162879395652933),
+                                    ("next <cycle>tuesday", -5.568344503761097),
                                     ("monday<day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
-                                    ("at <time-of-day>tomorrow", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("at <time-of-day>tomorrow", -5.568344503761097),
                                     ("monday<named-month> <day-of-month> (non ordinal)",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("on a named-day<time-of-day> - <time-of-day> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("today/tomorrow/yesterday eveningat <time-of-day>",
-                                     -5.079331825382491),
-                                    ("last <cycle> of <time>year", -5.079331825382491),
+                                     -5.162879395652933),
+                                    ("last <cycle> of <time>year", -5.162879395652933),
                                     ("on a named-day<datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.5685062016165),
-                                    ("April<time> <part-of-day>", -5.079331825382491)],
-                               n = 169},
+                                     -4.6520537718869415),
+                                    ("April<time> <part-of-day>", -5.162879395652933)],
+                               n = 193},
                    koData =
-                     ClassData{prior = -1.3518081850487211, unseen = -5.572154032177765,
+                     ClassData{prior = -1.827161396278971, unseen = -5.3612921657094255,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -4.875197323201151),
-                                    ("dayhour", -3.488902962081261),
-                                    ("on a named-dayafter <time-of-day>", -4.875197323201151),
-                                    ("July<day-of-month> (non ordinal) <named-month>",
-                                     -4.875197323201151),
-                                    ("daymonth", -3.9589065913269965),
-                                    ("monthday", -4.4697322150929875),
-                                    ("monthyear", -3.776585034533042),
-                                    ("yearhour", -4.875197323201151),
-                                    ("intersect<time-of-day>  o'clock", -4.875197323201151),
-                                    ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.4697322150929875),
-                                    ("<day-of-month> (ordinal)wednesday", -4.4697322150929875),
-                                    ("Julyintersect", -4.875197323201151),
-                                    ("thursdayafter <time-of-day>", -4.875197323201151),
-                                    ("intersect<time> <part-of-day>", -4.875197323201151),
-                                    ("Marchyear", -4.875197323201151),
-                                    ("<day-of-month> (ordinal)year", -4.875197323201151),
-                                    ("on a named-dayat <time-of-day>", -4.875197323201151),
-                                    ("on a named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("tuesdayafter <time-of-day>", -4.875197323201151),
-                                    ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("monthhour", -3.9589065913269965),
-                                    ("on <date>between <datetime> and <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("todayat <time-of-day>", -4.875197323201151),
-                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("on <date>at <time-of-day>", -4.875197323201151),
-                                    ("on <date>about <time-of-day>", -4.875197323201151),
-                                    ("dayday", -3.776585034533042),
-                                    ("hourhour", -4.182050142641207),
-                                    ("thursdayat <time-of-day>", -4.875197323201151),
-                                    ("dayyear", -4.182050142641207),
-                                    ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("<day-of-month> (ordinal)tuesday", -4.4697322150929875),
-                                    ("thursdayhh:mm", -4.4697322150929875),
-                                    ("Aprilabout <time-of-day>", -4.875197323201151),
-                                    ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("Aprilyear", -4.875197323201151),
-                                    ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.182050142641207),
-                                    ("mondayFebruary", -4.875197323201151),
-                                    ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("yearuntil <time-of-day>", -4.4697322150929875),
-                                    ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.4697322150929875),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -4.875197323201151),
-                                    ("August<day-of-month> (non ordinal) <named-month>",
-                                     -4.875197323201151),
-                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -4.4697322150929875),
-                                    ("dayminute", -2.3902906734131513),
-                                    ("thursday<part-of-day> of <time>", -4.875197323201151),
-                                    ("Julyyear", -4.4697322150929875),
-                                    ("Octoberyear", -4.875197323201151),
+                                   [("dayhour", -3.2771447329921766),
+                                    ("on a named-dayafter <time-of-day>", -4.663439094112067),
+                                    ("daymonth", -4.257973986003902),
+                                    ("monthyear", -3.5648268054439574),
+                                    ("yearhour", -4.663439094112067),
+                                    ("intersect<time-of-day>  o'clock", -4.663439094112067),
+                                    ("<day-of-month> (ordinal)wednesday", -4.257973986003902),
+                                    ("Julyintersect", -4.663439094112067),
+                                    ("thursdayafter <time-of-day>", -4.663439094112067),
+                                    ("intersect<time> <part-of-day>", -4.663439094112067),
+                                    ("Marchyear", -4.663439094112067),
+                                    ("<day-of-month> (ordinal)year", -4.663439094112067),
+                                    ("on a named-dayat <time-of-day>", -4.663439094112067),
+                                    ("tuesdayafter <time-of-day>", -4.663439094112067),
+                                    ("monthhour", -3.747148362237912),
+                                    ("todayat <time-of-day>", -4.663439094112067),
+                                    ("on <date>at <time-of-day>", -4.663439094112067),
+                                    ("on <date>about <time-of-day>", -4.663439094112067),
+                                    ("dayday", -3.5648268054439574),
+                                    ("hourhour", -3.970291913552122),
+                                    ("thursdayat <time-of-day>", -4.663439094112067),
+                                    ("dayyear", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)tuesday", -4.257973986003902),
+                                    ("thursdayhh:mm", -4.257973986003902),
+                                    ("Aprilabout <time-of-day>", -4.663439094112067),
+                                    ("Aprilyear", -4.663439094112067),
+                                    ("mondayFebruary", -4.663439094112067),
+                                    ("yearuntil <time-of-day>", -4.257973986003902),
+                                    ("dayminute", -3.5648268054439574),
+                                    ("thursday<part-of-day> of <time>", -4.663439094112067),
+                                    ("Julyyear", -4.257973986003902),
+                                    ("Octoberyear", -4.663439094112067),
                                     ("today/tomorrow/yesterday afternoonat <time-of-day>",
-                                     -4.4697322150929875),
-                                    ("year<time> <part-of-day>", -4.875197323201151),
+                                     -4.257973986003902),
+                                    ("year<time> <part-of-day>", -4.663439094112067),
                                     ("today/tomorrow/yesterday afternoon<time-of-day>  o'clock",
-                                     -4.875197323201151),
-                                    ("yearday", -4.4697322150929875),
-                                    ("absorption of , after named dayFebruary", -4.875197323201151),
+                                     -4.663439094112067),
+                                    ("yearday", -4.257973986003902),
+                                    ("absorption of , after named dayFebruary", -4.663439094112067),
                                     ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
-                                     -4.875197323201151),
-                                    ("after <time-of-day>year", -4.875197323201151),
-                                    ("on a named-day<time-of-day> - <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("on <date>after <time-of-day>", -4.875197323201151),
+                                     -4.663439094112067),
+                                    ("after <time-of-day>year", -4.663439094112067),
+                                    ("on <date>after <time-of-day>", -4.663439094112067),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.875197323201151)],
-                               n = 59}}),
+                                     -4.663439094112067)],
+                               n = 37}}),
        ("<ordinal> <cycle> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -667,28 +622,28 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.995732273553991,
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.0910424533583156,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dd/mm/yyyydd/mm", -2.2512917986064953),
-                                    ("minuteminute", -2.2512917986064953),
+                                   [("dd/mm/yyyydd/mm", -2.3513752571634776),
+                                    ("hh:mmtime-of-day (latent)", -2.3513752571634776),
+                                    ("minuteminute", -2.3513752571634776),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.2512917986064953),
-                                    ("hh:mmhh:mm", -2.2512917986064953),
-                                    ("dayday", -1.845826690498331),
-                                    ("dd/mm/yyyydd/mm/yyyy", -2.2512917986064953),
-                                    ("hourhour", -2.2512917986064953)],
-                               n = 4},
+                                     -2.3513752571634776),
+                                    ("hh:mmhh:mm", -2.3513752571634776),
+                                    ("dayday", -1.9459101490553135),
+                                    ("dd/mm/yyyydd/mm/yyyy", -2.3513752571634776),
+                                    ("hourhour", -2.3513752571634776),
+                                    ("minutehour", -2.3513752571634776)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.772588722239781,
+                     ClassData{prior = -1.791759469228055, unseen = -2.639057329615259,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -2.0149030205422647),
-                                    ("hh:mmtime-of-day (latent)", -2.0149030205422647),
-                                    ("minutehour", -2.0149030205422647),
-                                    ("dd/mm/yyyytime-of-day (latent)", -2.0149030205422647)],
-                               n = 2}}),
+                                   [("dayhour", -1.8718021769015913),
+                                    ("dd/mm/yyyytime-of-day (latent)", -1.8718021769015913)],
+                               n = 1}}),
        ("after tomorrow",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -714,23 +669,20 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.252762968495368),
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.6094379124341003),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -1.9459101490553135),
-                                    ("hh:mmhh:mm", -1.252762968495368),
-                                    ("hourhour", -1.9459101490553135)],
-                               n = 4},
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 3}}),
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("yyyy-mm-dd",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
@@ -1048,30 +1000,30 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.3925617032722565, unseen = -4.02535169073515,
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.1588830833596715,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.24613306953890846),
-                                    ("integer (0..19)", -1.6094379124341003)],
-                               n = 52},
+                                   [("integer (numeric)", -0.2113090936672069),
+                                    ("integer (0..19)", -1.7452394535931621)],
+                               n = 60},
                    koData =
-                     ClassData{prior = -1.1249295969854831, unseen = -3.367295829986474,
+                     ClassData{prior = -1.5105920777974677, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.2411620568168881),
-                                    ("integer (0..19)", -1.9459101490553135),
-                                    ("couple", -2.639057329615259)],
-                               n = 25}}),
+                                   [("integer (numeric)", -0.35667494393873245),
+                                    ("integer (0..19)", -1.6094379124341003),
+                                    ("couple", -2.3025850929940455)],
+                               n = 17}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -0.19105523676270922,
-                               unseen = -3.044522437723423,
+                     ClassData{prior = -0.1823215567939546, unseen = -3.295836866004329,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 19},
+                               n = 25},
                    koData =
-                     ClassData{prior = -1.749199854809259, unseen = -1.791759469228055,
+                     ClassData{prior = -1.791759469228055, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
+                               n = 5}}),
        ("last <day-of-week> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -1444,25 +1396,11 @@
                                n = 1}}),
        ("Koningsdag",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                     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}}),
-       ("by the end of <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half to|till|before <integer> (hour-of-day)",
-                                     -1.7346010553881064),
-                                    ("time-of-day (latent)", -1.4469189829363254),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.4469189829363254),
-                                    ("minute", -1.4469189829363254)],
-                               n = 6}}),
        ("in <duration>",
         Classifier{okData =
                      ClassData{prior = -4.652001563489282e-2,
@@ -1538,24 +1476,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -0.3746934494414107, unseen = -3.367295829986474,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>hh:mm", -2.1972245773362196),
-                                    ("minuteminute", -0.9444616088408514),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 6},
+                                   [("hh:mmtime-of-day (latent)", -1.7227665977411035),
+                                    ("at <time-of-day>hh:mm", -2.639057329615259),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.540445040947149),
+                                    ("minutehour", -1.540445040947149),
+                                    ("at <time-of-day>time-of-day (latent)", -2.639057329615259)],
+                               n = 11},
                    koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.295836866004329,
+                     ClassData{prior = -1.1631508098056809, unseen = -2.833213344056216,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.1786549963416462),
-                                    ("minuteminute", -2.159484249353372),
-                                    ("hh:mmhh:mm", -2.159484249353372),
-                                    ("minutehour", -1.0608719606852628),
-                                    ("at <time-of-day>time-of-day (latent)", -2.5649493574615367)],
-                               n = 10}}),
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 5}}),
        ("winter",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -1618,7 +1557,7 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -0.3448404862917295,
+                     ClassData{prior = -0.2578291093020998,
                                unseen = -3.7612001156935624,
                                likelihoods =
                                  HashMap.fromList
@@ -1631,15 +1570,14 @@
                                     ("integer (numeric)March", -2.3513752571634776)],
                                n = 17},
                    koData =
-                     ClassData{prior = -1.2321436812926323,
-                               unseen = -3.1354942159291497,
+                     ClassData{prior = -1.4816045409242156,
+                               unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)August", -2.3978952727983707),
-                                    ("month", -1.0116009116784799),
-                                    ("integer (numeric)October", -2.3978952727983707),
-                                    ("integer (numeric)July", -1.2992829841302609)],
-                               n = 7}}),
+                                   [("month", -1.0986122886681098),
+                                    ("integer (numeric)October", -2.1972245773362196),
+                                    ("integer (numeric)July", -1.2809338454620642)],
+                               n = 5}}),
        ("this|next <day-of-week>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.639057329615259,
@@ -1767,6 +1705,18 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("composite <duration>",
+        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)hour (grain)<integer> + '\"",
+                                     -0.6931471805599453),
+                                    ("hourminute", -0.6931471805599453)],
+                               n = 2}}),
        ("summer",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
diff --git a/Duckling/Ranking/Classifiers/NL_NL.hs b/Duckling/Ranking/Classifiers/NL_NL.hs
--- a/Duckling/Ranking/Classifiers/NL_NL.hs
+++ b/Duckling/Ranking/Classifiers/NL_NL.hs
@@ -19,4 +19,1759 @@
 import Duckling.Ranking.Types
 
 classifiers :: Classifiers
-classifiers = HashMap.fromList []
+classifiers
+  = HashMap.fromList
+      [("Kerstmis",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.6094379124341003),
+                                    ("hh:mm", -1.2039728043259361), ("hour", -1.6094379124341003),
+                                    ("minute", -1.2039728043259361)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6300464741920015, unseen = -4.948759890378168,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 139},
+                   koData =
+                     ClassData{prior = -0.7604993625894368, unseen = -4.820281565605037,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 122}}),
+       ("exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.252762968495368),
+                                    ("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.55814461804655), ("day", -1.845826690498331),
+                                    ("year", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
+                                    ("month", -2.2512917986064953)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("thursday",
+        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 (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.15415067982725836,
+                               unseen = -5.030437921392435,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clockmorning", -3.077970371790963),
+                                    ("until <time-of-day>afternoon", -4.330733340286331),
+                                    ("dayhour", -2.9444389791664407),
+                                    ("todayevening", -4.330733340286331),
+                                    ("on <date>evening", -3.925268232178167),
+                                    ("thursdaymorning", -4.330733340286331),
+                                    ("intersectevening", -2.384823191231018),
+                                    ("tomorrowafternoon", -3.925268232178167),
+                                    ("half to|till|before <integer> (hour-of-day)afternoon",
+                                     -4.330733340286331),
+                                    ("hourhour", -1.1737329191362178),
+                                    ("<day-of-month> (non ordinal) <named-month>morning",
+                                     -3.925268232178167),
+                                    ("at <time-of-day>afternoon", -4.330733340286331),
+                                    ("todayafternoon", -4.330733340286331),
+                                    ("<time-of-day>  o'clockafternoon", -3.2321210516182215),
+                                    ("<time-of-day>  o'clocknight", -4.330733340286331),
+                                    ("until <time-of-day>morning", -3.925268232178167),
+                                    ("minutehour", -2.9444389791664407),
+                                    ("<time-of-day> am|pmmorning", -3.925268232178167),
+                                    ("hh:mmmorning", -3.925268232178167),
+                                    ("about <time-of-day>evening", -4.330733340286331),
+                                    ("<time-of-day>  o'clockevening", -3.6375861597263857),
+                                    ("<hour-of-day> <integer> (as relative minutes)afternoon",
+                                     -3.925268232178167),
+                                    ("intersectmorning", -3.077970371790963),
+                                    ("about <time-of-day>afternoon", -4.330733340286331),
+                                    ("hh:mmafternoon", -4.330733340286331),
+                                    ("on <date>morning", -3.925268232178167),
+                                    ("at <time-of-day>morning", -4.330733340286331)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clockmorning", -3.258096538021482),
+                                    ("yearhour", -3.258096538021482),
+                                    ("intersectevening", -2.5649493574615367),
+                                    ("monthhour", -2.8526314299133175),
+                                    ("hourhour", -1.8718021769015913),
+                                    ("year (latent)afternoon", -3.258096538021482),
+                                    ("Februarymorning", -2.8526314299133175),
+                                    ("<time-of-day>  o'clockevening", -3.258096538021482),
+                                    ("time-of-day (latent)afternoon", -2.8526314299133175)],
+                               n = 10}}),
+       ("dd/mm",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.19237189264745613, unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.739115735742633),
+                                    ("half to|till|before <integer> (hour-of-day)",
+                                     -3.6109179126442243),
+                                    ("about <time-of-day>", -2.6946271807700692),
+                                    ("time-of-day (latent)", -1.906169820405799),
+                                    ("hh:mm", -2.512305623976115), ("hour", -1.0082282271998406),
+                                    ("minute", -2.2246235515243336),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.6109179126442243)],
+                               n = 33},
+                   koData =
+                     ClassData{prior = -1.742969305058623, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -2.3978952727983707),
+                                    ("time-of-day (latent)", -1.1451323043030026),
+                                    ("hour", -1.0116009116784799)],
+                               n = 7}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("wednesday", -2.2512917986064953),
+                                    ("monday", -1.845826690498331), ("friday", -1.55814461804655),
+                                    ("day", -0.8649974374866046), ("sunday", -2.2512917986064953)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -4.672828834461907,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("thursday", -3.2771447329921766),
+                                    ("<time> <part-of-day>", -3.054001181677967),
+                                    ("dd/mm", -3.054001181677967), ("saturday", -3.970291913552122),
+                                    ("intersect", -1.367602228107738),
+                                    ("<day-of-month>(ordinal) <named-month>", -3.970291913552122),
+                                    ("friday", -3.970291913552122), ("day", -1.8302257500558512),
+                                    ("hh:mm", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)", -3.2771447329921766),
+                                    ("hour", -1.8302257500558512),
+                                    ("<datetime> - <datetime> (interval)", -3.970291913552122),
+                                    ("<day-of-month> (non ordinal) <named-month>",
+                                     -3.970291913552122),
+                                    ("minute", -1.955388893009857)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7047480922384253),
+                                    ("day", -2.3978952727983707),
+                                    ("<day-of-month> (ordinal)", -2.3978952727983707),
+                                    ("hour", -1.9924301646902063), ("minute", -2.3978952727983707)],
+                               n = 4}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -5.5569851154810765e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 35},
+                   koData =
+                     ClassData{prior = -2.917770732084279, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("October",
+        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}}),
+       ("month (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}}),
+       ("on a named-day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("thursday", -1.252762968495368),
+                                    ("saturday", -1.9459101490553135),
+                                    ("friday", -1.9459101490553135), ("day", -0.8472978603872037)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yesterday/tomorrow 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}}),
+       ("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}}),
+       ("<time-of-day>  o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.14107859825990549,
+                               unseen = -4.955827057601261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("exactly <time-of-day>", -4.255612709818223),
+                                    ("at <time-of-day>", -2.3838105329166317),
+                                    ("about <time-of-day>", -2.8693183486983322),
+                                    ("time-of-day (latent)", -1.259880436264232),
+                                    ("quarter after|past <integer> (hour-of-day)",
+                                     -4.255612709818223),
+                                    ("until <time-of-day>", -3.339321977944068),
+                                    ("hour", -0.7591051483517427), ("minute", -4.255612709818223),
+                                    ("after <time-of-day>", -3.8501476017100584)],
+                               n = 66},
+                   koData =
+                     ClassData{prior = -2.0281482472922856,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.6741486494265287),
+                                    ("time-of-day (latent)", -1.0647107369924282),
+                                    ("hour", -0.9694005571881036)],
+                               n = 10}}),
+       ("<integer> + '\"",
+        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)", -0.40546510810816444),
+                                    ("integer (0..19)", -1.0986122886681098)],
+                               n = 4}}),
+       ("July",
+        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 = -1.9661128563728327,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.15082288973458366,
+                               unseen = -3.8066624897703196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 43}}),
+       ("<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}}),
+       ("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}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.17538912001830978,
+                               unseen = -6.263398262591624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("last <cycle>sunday", -5.568344503761097),
+                                    ("Koningsdagyear", -4.064267106984823),
+                                    ("hourday", -4.4697322150929875),
+                                    ("on a named-day<day-of-month> (non ordinal) <named-month>",
+                                     -5.568344503761097),
+                                    ("<day-of-month> (non ordinal) <named-month><time-of-day>  o'clock",
+                                     -5.568344503761097),
+                                    ("dayhour", -2.4328502878319473),
+                                    ("daymonth", -4.6520537718869415),
+                                    ("next <cycle>friday", -5.568344503761097),
+                                    ("monthyear", -3.9589065913269965),
+                                    ("friday<day-of-month> (non ordinal) <named-month>",
+                                     -5.162879395652933),
+                                    ("yearhour", -5.568344503761097),
+                                    ("intersect<time-of-day>  o'clock", -4.875197323201151),
+                                    ("tuesdaythis <cycle>", -5.568344503761097),
+                                    ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.6520537718869415),
+                                    ("saturday<time-of-day>  o'clock", -5.568344503761097),
+                                    ("absorption of , after named daydd/mm/yyyy",
+                                     -5.162879395652933),
+                                    ("<time-of-day> am|pmintersect", -5.568344503761097),
+                                    ("intersect<time> <part-of-day>", -4.875197323201151),
+                                    ("Marchyear", -5.568344503761097),
+                                    ("saturdayat <time-of-day>", -5.162879395652933),
+                                    ("saturday<time> <part-of-day>", -5.162879395652933),
+                                    ("dd/mm<time-of-day>  o'clock", -5.568344503761097),
+                                    ("on a named-dayat <time-of-day>", -4.875197323201151),
+                                    ("today<time-of-day>  o'clock", -5.568344503761097),
+                                    ("at <time-of-day>on a named-day", -5.568344503761097),
+                                    ("on a named-daybetween <datetime> and <datetime> (interval)",
+                                     -5.162879395652933),
+                                    ("intersect by ','year", -5.568344503761097),
+                                    ("on <date><time-of-day>  o'clock", -4.875197323201151),
+                                    ("next <cycle>monday", -5.568344503761097),
+                                    ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
+                                     -5.162879395652933),
+                                    ("exactly <time-of-day>tomorrow", -5.568344503761097),
+                                    ("on a named-day<time> <part-of-day>", -5.162879395652933),
+                                    ("monthhour", -4.6520537718869415),
+                                    ("on <date>between <datetime> and <datetime> (interval)",
+                                     -5.162879395652933),
+                                    ("last <day-of-week> of <time>year", -5.568344503761097),
+                                    ("on a named-day<time-of-day>  o'clock", -5.568344503761097),
+                                    ("next <cycle>March", -5.568344503761097),
+                                    ("todayat <time-of-day>", -4.875197323201151),
+                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
+                                     -5.162879395652933),
+                                    ("on <date>at <time-of-day>", -4.875197323201151),
+                                    ("thursday<time> timezone", -5.162879395652933),
+                                    ("on <date>about <time-of-day>", -4.875197323201151),
+                                    ("dayday", -3.265759410767051),
+                                    ("on <date><time> <part-of-day>", -4.6520537718869415),
+                                    ("dd/mmabout <time-of-day>", -5.162879395652933),
+                                    ("<day-of-month> (ordinal)intersect", -5.568344503761097),
+                                    ("hourhour", -4.4697322150929875),
+                                    ("saturday<day-of-month> (non ordinal) <named-month>",
+                                     -5.568344503761097),
+                                    ("thursdayat <time-of-day>", -5.568344503761097),
+                                    ("today/tomorrow/yesterday afternoon<hour-of-day> <integer> (as relative minutes)",
+                                     -5.162879395652933),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -4.4697322150929875),
+                                    ("dayyear", -3.1704492309627264),
+                                    ("tuesdayafter <duration>", -5.568344503761097),
+                                    ("tomorrow<time-of-day>  o'clock", -5.568344503761097),
+                                    ("<time-of-day>  o'clocktomorrow", -4.875197323201151),
+                                    ("<day-of-month> (non ordinal) <named-month>intersect",
+                                     -5.568344503761097),
+                                    ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
+                                     -5.162879395652933),
+                                    ("thursdaybetween <datetime> and <datetime> (interval)",
+                                     -5.162879395652933),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -5.568344503761097),
+                                    ("<day-of-month> (ordinal)tuesday", -5.568344503761097),
+                                    ("hourminute", -4.875197323201151),
+                                    ("thursdayhh:mm", -5.568344503761097),
+                                    ("this <cycle>wednesday", -5.568344503761097),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -5.568344503761097),
+                                    ("<day-of-month> (non ordinal) <named-month><time> <part-of-day>",
+                                     -5.162879395652933),
+                                    ("on <date><day-of-month> (non ordinal) <named-month>",
+                                     -5.568344503761097),
+                                    ("Aprilabout <time-of-day>", -5.568344503761097),
+                                    ("thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.162879395652933),
+                                    ("<day-of-month> (ordinal)February", -5.568344503761097),
+                                    ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.3155815352657285),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -4.6520537718869415),
+                                    ("today/tomorrow/yesterday evening<time-of-day>  o'clock",
+                                     -5.568344503761097),
+                                    ("fridayintersect", -4.875197323201151),
+                                    ("on <date><time-of-day> - <time-of-day> (interval)",
+                                     -5.162879395652933),
+                                    ("on <date><datetime> - <datetime> (interval)",
+                                     -5.568344503761097),
+                                    ("this <cycle>monday", -5.568344503761097),
+                                    ("April<time-of-day>  o'clock", -5.568344503761097),
+                                    ("next <cycle>wednesday", -5.568344503761097),
+                                    ("hh:mmintersect", -5.162879395652933),
+                                    ("thursday<datetime> - <datetime> (interval)",
+                                     -5.162879395652933),
+                                    ("<day-of-month> (ordinal)July", -5.568344503761097),
+                                    ("thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.6520537718869415),
+                                    ("yearmonth", -5.568344503761097),
+                                    ("at <time-of-day>intersect", -5.162879395652933),
+                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
+                                     -4.6520537718869415),
+                                    ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
+                                     -5.568344503761097),
+                                    ("dayminute", -2.3902906734131513),
+                                    ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
+                                     -5.568344503761097),
+                                    ("intersectyear", -4.875197323201151),
+                                    ("<time-of-day> am|pmsaturday", -5.568344503761097),
+                                    ("<ordinal> <cycle> of <time>year", -5.568344503761097),
+                                    ("minuteday", -3.3711199264248775),
+                                    ("absorption of , after named dayintersect",
+                                     -5.568344503761097),
+                                    ("Julyyear", -5.568344503761097),
+                                    ("year<time-of-day>  o'clock", -5.568344503761097),
+                                    ("Octoberyear", -4.4697322150929875),
+                                    ("hh:mmon <date>", -5.162879395652933),
+                                    ("today/tomorrow/yesterday afternoonat <time-of-day>",
+                                     -5.568344503761097),
+                                    ("tuesdayin <duration>", -5.568344503761097),
+                                    ("Septemberyear", -5.162879395652933),
+                                    ("at <time-of-day>on <date>", -5.162879395652933),
+                                    ("absorption of , after named daydd/mm", -5.162879395652933),
+                                    ("intersectintersect", -5.568344503761097),
+                                    ("hh:mmon a named-day", -5.568344503761097),
+                                    ("weekday", -4.182050142641207),
+                                    ("dayweek", -4.875197323201151),
+                                    ("weekyear", -5.162879395652933),
+                                    ("on <date>February", -5.568344503761097),
+                                    ("Kerstmisyear", -5.568344503761097),
+                                    ("<month> dd-dd (interval)year", -5.568344503761097),
+                                    ("tomorrowat <time-of-day>", -5.162879395652933),
+                                    ("next <cycle>tuesday", -5.568344503761097),
+                                    ("monday<day-of-month> (non ordinal) <named-month>",
+                                     -5.568344503761097),
+                                    ("at <time-of-day>tomorrow", -5.568344503761097),
+                                    ("monday<named-month> <day-of-month> (non ordinal)",
+                                     -5.568344503761097),
+                                    ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
+                                     -5.568344503761097),
+                                    ("on a named-day<time-of-day> - <time-of-day> (interval)",
+                                     -5.162879395652933),
+                                    ("today/tomorrow/yesterday eveningat <time-of-day>",
+                                     -5.162879395652933),
+                                    ("last <cycle> of <time>year", -5.162879395652933),
+                                    ("on a named-day<datetime> - <datetime> (interval)",
+                                     -5.568344503761097),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -4.6520537718869415),
+                                    ("April<time> <part-of-day>", -5.162879395652933)],
+                               n = 193},
+                   koData =
+                     ClassData{prior = -1.827161396278971, unseen = -5.3612921657094255,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.2771447329921766),
+                                    ("on a named-dayafter <time-of-day>", -4.663439094112067),
+                                    ("daymonth", -4.257973986003902),
+                                    ("monthyear", -3.5648268054439574),
+                                    ("yearhour", -4.663439094112067),
+                                    ("intersect<time-of-day>  o'clock", -4.663439094112067),
+                                    ("<day-of-month> (ordinal)wednesday", -4.257973986003902),
+                                    ("Julyintersect", -4.663439094112067),
+                                    ("thursdayafter <time-of-day>", -4.663439094112067),
+                                    ("intersect<time> <part-of-day>", -4.663439094112067),
+                                    ("Marchyear", -4.663439094112067),
+                                    ("<day-of-month> (ordinal)year", -4.663439094112067),
+                                    ("on a named-dayat <time-of-day>", -4.663439094112067),
+                                    ("tuesdayafter <time-of-day>", -4.663439094112067),
+                                    ("monthhour", -3.747148362237912),
+                                    ("todayat <time-of-day>", -4.663439094112067),
+                                    ("on <date>at <time-of-day>", -4.663439094112067),
+                                    ("on <date>about <time-of-day>", -4.663439094112067),
+                                    ("dayday", -3.5648268054439574),
+                                    ("hourhour", -3.970291913552122),
+                                    ("thursdayat <time-of-day>", -4.663439094112067),
+                                    ("dayyear", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)tuesday", -4.257973986003902),
+                                    ("thursdayhh:mm", -4.257973986003902),
+                                    ("Aprilabout <time-of-day>", -4.663439094112067),
+                                    ("Aprilyear", -4.663439094112067),
+                                    ("mondayFebruary", -4.663439094112067),
+                                    ("yearuntil <time-of-day>", -4.257973986003902),
+                                    ("dayminute", -3.5648268054439574),
+                                    ("thursday<part-of-day> of <time>", -4.663439094112067),
+                                    ("Julyyear", -4.257973986003902),
+                                    ("Octoberyear", -4.663439094112067),
+                                    ("today/tomorrow/yesterday afternoonat <time-of-day>",
+                                     -4.257973986003902),
+                                    ("year<time> <part-of-day>", -4.663439094112067),
+                                    ("today/tomorrow/yesterday afternoon<time-of-day>  o'clock",
+                                     -4.663439094112067),
+                                    ("yearday", -4.257973986003902),
+                                    ("absorption of , after named dayFebruary", -4.663439094112067),
+                                    ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
+                                     -4.663439094112067),
+                                    ("after <time-of-day>year", -4.663439094112067),
+                                    ("on <date>after <time-of-day>", -4.663439094112067),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -4.663439094112067)],
+                               n = 37}}),
+       ("<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}}),
+       ("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 = -0.1823215567939546,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dd/mm/yyyydd/mm", -2.3513752571634776),
+                                    ("hh:mmtime-of-day (latent)", -2.3513752571634776),
+                                    ("minuteminute", -2.3513752571634776),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.3513752571634776),
+                                    ("hh:mmhh:mm", -2.3513752571634776),
+                                    ("dayday", -1.9459101490553135),
+                                    ("dd/mm/yyyydd/mm/yyyy", -2.3513752571634776),
+                                    ("hourhour", -2.3513752571634776),
+                                    ("minutehour", -2.3513752571634776)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.8718021769015913),
+                                    ("dd/mm/yyyytime-of-day (latent)", -1.8718021769015913)],
+                               n = 1}}),
+       ("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.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.466337068793427),
+                                    ("month (grain)", -2.5649493574615367),
+                                    ("year (grain)", -2.159484249353372),
+                                    ("week (grain)", -1.466337068793427),
+                                    ("quarter", -2.5649493574615367), ("year", -2.159484249353372),
+                                    ("month", -2.5649493574615367),
+                                    ("quarter (grain)", -2.5649493574615367)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.6094379124341003),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        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}}),
+       ("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}}),
+       ("couple",
+        Classifier{okData =
+                     ClassData{prior = 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.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("<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}}),
+       ("today/tomorrow/yesterday 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}}),
+       ("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}}),
+       ("monday",
+        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}}),
+       ("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)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}}),
+       ("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}}),
+       ("today/tomorrow/yesterday evening",
+        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}}),
+       ("week (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}}),
+       ("<part-of-day> of <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
+                                   [("hourhour", -0.6931471805599453),
+                                    ("morningtime-of-day (latent)", -0.6931471805599453)],
+                               n = 1}}),
+       ("Vaderdag",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("number,number uur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -1.252762968495368),
+                                    ("hour", -0.8472978603872037), ("evening", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -1.252762968495368),
+                                    ("ordinal (digits)February", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               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 = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.53101798043249e-2),
+                                    ("fractional number", -2.3978952727983707)],
+                               n = 20}}),
+       ("Nieuwjaarsdag",
+        Classifier{okData =
+                     ClassData{prior = 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.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}}),
+       ("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}}),
+       ("half to|till|before <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        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}}),
+       ("fractional number",
+        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}}),
+       ("afternoon",
+        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}}),
+       ("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.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4816045409242156),
+                                    ("year (grain)", -2.3978952727983707),
+                                    ("week (grain)", -1.4816045409242156),
+                                    ("day", -2.3978952727983707), ("quarter", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("quarter (grain)", -2.3978952727983707),
+                                    ("day (grain)", -2.3978952727983707)],
+                               n = 7},
+                   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}}),
+       ("night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("sunday",
+        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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.4759065198095778),
+                                    ("time-of-day (latent)", -1.4759065198095778),
+                                    ("quarter after|past <integer> (hour-of-day)",
+                                     -2.8622008809294686),
+                                    ("hour", -0.8472978603872037), ("minute", -2.8622008809294686)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.1588830833596715,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2113090936672069),
+                                    ("integer (0..19)", -1.7452394535931621)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.5105920777974677, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.35667494393873245),
+                                    ("integer (0..19)", -1.6094379124341003),
+                                    ("couple", -2.3025850929940455)],
+                               n = 17}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 5}}),
+       ("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 = -1.207415148516909, unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.315007612992603),
+                                    ("integer (0..19)year (grain)", -3.295836866004329),
+                                    ("integer (numeric)day (grain)", -2.7850112422383386),
+                                    ("couplehour (grain)", -3.7013019741124937),
+                                    ("integer (0..19)second (grain) ", -3.7013019741124937),
+                                    ("integer (0..19)hour (grain)", -3.0081547935525483),
+                                    ("second", -3.7013019741124937),
+                                    ("integer (numeric)year (grain)", -3.7013019741124937),
+                                    ("day", -2.7850112422383386), ("year", -3.0081547935525483),
+                                    ("integer (numeric)week (grain)", -3.295836866004329),
+                                    ("integer (0..19)month (grain)", -3.7013019741124937),
+                                    ("hour", -2.6026896854443837), ("month", -3.7013019741124937),
+                                    ("integer (numeric)minute (grain)", -2.4485390056171257),
+                                    ("integer (0..19)minute (grain)", -3.295836866004329),
+                                    ("minute", -2.1972245773362196),
+                                    ("integer (numeric)hour (grain)", -3.7013019741124937),
+                                    ("integer (0..19)week (grain)", -2.6026896854443837)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -0.3552032733272762, unseen = -5.075173815233827,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.6826098411003407),
+                                    ("integer (0..19)year (grain)", -3.970291913552122),
+                                    ("integer (numeric)day (grain)", -3.6826098411003407),
+                                    ("integer (0..19)second (grain) ", -4.375757021660286),
+                                    ("integer (0..19)hour (grain)", -2.871679624884012),
+                                    ("second", -3.6826098411003407),
+                                    ("integer (numeric)second (grain) ", -3.970291913552122),
+                                    ("integer (numeric)year (grain)", -3.970291913552122),
+                                    ("day", -3.2771447329921766), ("year", -3.459466289786131),
+                                    ("integer (numeric)week (grain)", -3.970291913552122),
+                                    ("integer (0..19)month (grain)", -3.970291913552122),
+                                    ("hour", -1.2402628057311365), ("month", -3.459466289786131),
+                                    ("integer (numeric)minute (grain)", -3.970291913552122),
+                                    ("integer (0..19)minute (grain)", -3.970291913552122),
+                                    ("integer (numeric)month (grain)", -3.970291913552122),
+                                    ("minute", -3.459466289786131),
+                                    ("coupleday (grain)", -4.375757021660286),
+                                    ("integer (numeric)hour (grain)", -1.4313180424938456),
+                                    ("integer (0..19)day (grain)", -4.375757021660286),
+                                    ("integer (0..19)week (grain)", -4.375757021660286)],
+                               n = 68}}),
+       ("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 = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253),
+                                    ("until <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}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearday", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>Kerstmis", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("today/tomorrow/yesterday 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}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 38},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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 = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>half to|till|before <integer> (hour-of-day)",
+                                     -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        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}}),
+       ("intersect by ','",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("wednesday<day-of-month> (non ordinal) <named-month>",
+                                     -2.833213344056216),
+                                    ("friday<day-of-month> (non ordinal) <named-month>",
+                                     -2.833213344056216),
+                                    ("dayday", -1.128465251817791), ("dayyear", -2.833213344056216),
+                                    ("fridaydd/mm", -2.4277482359480516),
+                                    ("fridaydd/mm/yyyy", -2.4277482359480516),
+                                    ("fridayintersect", -2.833213344056216),
+                                    ("sunday<named-month> <day-of-month> (non ordinal)",
+                                     -2.833213344056216),
+                                    ("monday<day-of-month> (non ordinal) <named-month>",
+                                     -2.4277482359480516),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -2.833213344056216)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.9459101490553135),
+                                    ("sundayFebruary", -1.9459101490553135)],
+                               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}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.8109302162163288), ("sunday", -1.5040773967762742),
+                                    ("tuesday", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("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}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -1.2809338454620642,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)", -0.8472978603872037),
+                                    ("ordinal (digits)", -0.5596157879354228)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.325422400434628, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)", -0.6286086594223742),
+                                    ("ordinal (digits)", -0.7621400520468967)],
+                               n = 13}}),
+       ("Valentijnsdag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.327277705584417),
+                                    ("<time-of-day>  o'clock", -2.1041341542702074),
+                                    ("time-of-day (latent)", -1.9218125974762528),
+                                    ("<time-of-day> am|pm", -3.0204248861443626),
+                                    ("EOM|End of month", -3.0204248861443626),
+                                    ("hour", -1.074514737089049), ("month", -3.0204248861443626)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dd/mm", -2.6026896854443837),
+                                    ("dd/mm/yyyy", -2.6026896854443837),
+                                    ("half to|till|before <integer> (hour-of-day)",
+                                     -2.1972245773362196),
+                                    ("day", -2.1972245773362196), ("hh:mm", -1.9095425048844386),
+                                    ("minute", -1.5040773967762742)],
+                               n = 7}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.120263536200091), ("second", -2.5257286443082556),
+                                    ("day", -2.5257286443082556),
+                                    ("<integer> <unit-of-duration>", -1.0216512475319814),
+                                    ("hour", -1.8325814637483102), ("minute", -2.120263536200091),
+                                    ("<integer> kwartier", -2.5257286443082556)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.5040773967762742),
+                                    ("hour", -1.5040773967762742)],
+                               n = 1}}),
+       ("evening",
+        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}}),
+       ("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}}),
+       ("<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.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("wednesday", -1.8718021769015913),
+                                    ("monday", -1.466337068793427), ("day", -1.1786549963416462),
+                                    ("hour", -1.8718021769015913),
+                                    ("week-end", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <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}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.1135153092103742),
+                                    ("integer (0..19)year (grain)", -3.1135153092103742),
+                                    ("integer (numeric)day (grain)", -3.1135153092103742),
+                                    ("integer (0..19)second (grain) ", -3.1135153092103742),
+                                    ("second", -3.1135153092103742),
+                                    ("integer (numeric)year (grain)", -3.1135153092103742),
+                                    ("day", -2.4203681286504293), ("year", -2.70805020110221),
+                                    ("integer (numeric)week (grain)", -3.1135153092103742),
+                                    ("integer (0..19)month (grain)", -3.1135153092103742),
+                                    ("hour", -2.70805020110221), ("month", -2.70805020110221),
+                                    ("integer (numeric)minute (grain)", -3.1135153092103742),
+                                    ("integer (0..19)minute (grain)", -3.1135153092103742),
+                                    ("integer (numeric)month (grain)", -3.1135153092103742),
+                                    ("minute", -2.70805020110221),
+                                    ("coupleday (grain)", -3.1135153092103742),
+                                    ("integer (numeric)hour (grain)", -2.70805020110221),
+                                    ("integer (0..19)day (grain)", -3.1135153092103742)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("Koningsdag",
+        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 = -4.652001563489282e-2,
+                               unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5649493574615367), ("second", -3.258096538021482),
+                                    ("number,number uur", -3.258096538021482),
+                                    ("day", -2.8526314299133175), ("year", -3.258096538021482),
+                                    ("<integer> <unit-of-duration>", -1.006804739414987),
+                                    ("hour", -2.159484249353372),
+                                    ("<integer> and an half hour", -3.258096538021482),
+                                    ("minute", -1.6486586255873816),
+                                    ("<integer> kwartier", -3.258096538021482)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -3.0910424533583156,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.791759469228055),
+                                    ("hour", -1.791759469228055)],
+                               n = 1}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.2076393647782445,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -2.001480000210124),
+                                    ("on <date>hh:mm", -2.917770732084279),
+                                    ("at <time-of-day>hh:mm", -2.917770732084279),
+                                    ("minuteminute", -1.213022639845854),
+                                    ("hh:mmhh:mm", -2.001480000210124),
+                                    ("dayday", -2.2246235515243336),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.512305623976115),
+                                    ("dd/mmdd/mm", -2.917770732084279)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -1.6739764335716716, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.1400661634962708),
+                                    ("daymonth", -1.7346010553881064),
+                                    ("minuteminute", -2.1400661634962708),
+                                    ("hh:mmhh:mm", -2.1400661634962708),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.1400661634962708)],
+                               n = 3}}),
+       ("<integer> and an half hour",
+        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}}),
+       ("relative minutes to|till|before|after <integer> (time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.2992829841302609),
+                                    ("integer (numeric)half to|till|before <integer> (hour-of-day)",
+                                     -1.7047480922384253),
+                                    ("integer (numeric)time-of-day (latent)", -1.7047480922384253),
+                                    ("integer (20..90)time-of-day (latent)", -1.7047480922384253),
+                                    ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3746934494414107, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.7227665977411035),
+                                    ("at <time-of-day>hh:mm", -2.639057329615259),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.540445040947149),
+                                    ("minutehour", -1.540445040947149),
+                                    ("at <time-of-day>time-of-day (latent)", -2.639057329615259)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.1631508098056809, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 5}}),
+       ("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.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5902671654458267),
+                                    ("integer (0..19)year (grain)", -2.995732273553991),
+                                    ("integer (numeric)day (grain)", -2.5902671654458267),
+                                    ("second", -2.5902671654458267),
+                                    ("integer (numeric)second (grain) ", -2.5902671654458267),
+                                    ("integer (numeric)year (grain)", -2.995732273553991),
+                                    ("day", -2.5902671654458267), ("year", -2.5902671654458267),
+                                    ("integer (numeric)week (grain)", -2.995732273553991),
+                                    ("integer (0..19)month (grain)", -2.995732273553991),
+                                    ("month", -2.5902671654458267),
+                                    ("integer (numeric)minute (grain)", -2.995732273553991),
+                                    ("integer (0..19)minute (grain)", -2.995732273553991),
+                                    ("integer (numeric)month (grain)", -2.995732273553991),
+                                    ("minute", -2.5902671654458267),
+                                    ("integer (0..19)week (grain)", -2.995732273553991)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               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
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..19th)tuesdayKerstmis", -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -1.749199854809259),
+                                    ("Aprilinteger (numeric)", -2.4423470353692043),
+                                    ("month", -0.832909122935104),
+                                    ("Februaryinteger (numeric)", -1.749199854809259),
+                                    ("Julyinteger (numeric)", -2.03688192726104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2578291093020998,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)September", -2.639057329615259),
+                                    ("integer (numeric)April", -2.639057329615259),
+                                    ("integer (numeric)August", -3.044522437723423),
+                                    ("integer (numeric)February", -1.6582280766035324),
+                                    ("month", -0.8472978603872037),
+                                    ("integer (numeric)July", -2.639057329615259),
+                                    ("integer (numeric)March", -2.3513752571634776)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -1.4816045409242156,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -1.0986122886681098),
+                                    ("integer (numeric)October", -2.1972245773362196),
+                                    ("integer (numeric)July", -1.2809338454620642)],
+                               n = 5}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("wednesday", -1.8718021769015913),
+                                    ("monday", -0.9555114450274363), ("day", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               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.8109302162163288, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.587786664902119, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("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
+                                   [("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 = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("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}}),
+       ("Oudjaar",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.587786664902119, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.845826690498331),
+                                    ("<time-of-day>  o'clock", -1.845826690498331),
+                                    ("time-of-day (latent)", -2.2512917986064953),
+                                    ("hour", -1.1526795099383855)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Kerstmis", -1.7346010553881064),
+                                    ("intersect", -2.1400661634962708),
+                                    ("day", -1.4469189829363254), ("hh:mm", -2.1400661634962708),
+                                    ("minute", -2.1400661634962708)],
+                               n = 4}}),
+       ("day (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}}),
+       ("Moederdag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.8718021769015913), ("July", -0.9555114450274363),
+                                    ("month", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("composite <duration>",
+        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)hour (grain)<integer> + '\"",
+                                     -0.6931471805599453),
+                                    ("hourminute", -0.6931471805599453)],
+                               n = 2}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 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> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7537718023763802),
+                                    ("at <time-of-day>integer (numeric)", -2.1400661634962708),
+                                    ("<time-of-day>  o'clockinteger (numeric)",
+                                     -0.8873031950009028)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> kwartier",
+        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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.2992829841302609), ("hour", -1.7047480922384253),
+                                    ("winter", -1.7047480922384253),
+                                    ("week-end", -1.7047480922384253),
+                                    ("summer", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               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}}),
+       ("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.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/NL_XX.hs b/Duckling/Ranking/Classifiers/NL_XX.hs
--- a/Duckling/Ranking/Classifiers/NL_XX.hs
+++ b/Duckling/Ranking/Classifiers/NL_XX.hs
@@ -42,11 +42,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.7090205297162354, unseen = -4.844187086458591,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 125},
+                     ClassData{prior = -0.6300464741920015, unseen = -4.948759890378168,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 139},
                    koData =
-                     ClassData{prior = -0.6775218626568645, unseen = -4.875197323201151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 129}}),
+                     ClassData{prior = -0.7604993625894368, unseen = -4.820281565605037,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 122}}),
        ("exactly <time-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -139,12 +139,11 @@
                                n = 10}}),
        ("dd/mm",
         Classifier{okData =
-                     ClassData{prior = -0.4307829160924542, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                     ClassData{prior = -0.5108256237659907, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
                    koData =
-                     ClassData{prior = -1.0498221244986778,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
        ("today",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -196,34 +195,34 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("on <date>",
         Classifier{okData =
-                     ClassData{prior = -0.19845093872383832,
-                               unseen = -4.574710978503383,
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -4.672828834461907,
                                likelihoods =
                                  HashMap.fromList
-                                   [("thursday", -3.1780538303479458),
-                                    ("<time> <part-of-day>", -2.9549102790337356),
-                                    ("dd/mm", -2.9549102790337356),
-                                    ("saturday", -3.871201010907891),
-                                    ("intersect", -1.4733057381095205),
-                                    ("<day-of-month>(ordinal) <named-month>", -3.871201010907891),
-                                    ("friday", -3.871201010907891), ("day", -1.7311348474116202),
-                                    ("hh:mm", -3.871201010907891),
-                                    ("<day-of-month> (ordinal)", -3.1780538303479458),
-                                    ("hour", -1.7311348474116202),
-                                    ("<datetime> - <datetime> (interval)", -3.871201010907891),
+                                   [("thursday", -3.2771447329921766),
+                                    ("<time> <part-of-day>", -3.054001181677967),
+                                    ("dd/mm", -3.054001181677967), ("saturday", -3.970291913552122),
+                                    ("intersect", -1.367602228107738),
+                                    ("<day-of-month>(ordinal) <named-month>", -3.970291913552122),
+                                    ("friday", -3.970291913552122), ("day", -1.8302257500558512),
+                                    ("hh:mm", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)", -3.2771447329921766),
+                                    ("hour", -1.8302257500558512),
+                                    ("<datetime> - <datetime> (interval)", -3.970291913552122),
                                     ("<day-of-month> (non ordinal) <named-month>",
-                                     -3.871201010907891),
-                                    ("minute", -2.2617630984737906)],
-                               n = 41},
+                                     -3.970291913552122),
+                                    ("minute", -1.955388893009857)],
+                               n = 46},
                    koData =
-                     ClassData{prior = -1.7147984280919266,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("intersect", -1.2685113254635072), ("day", -2.772588722239781),
-                                    ("<day-of-month> (ordinal)", -2.772588722239781),
-                                    ("hour", -2.367123614131617), ("minute", -1.5198257537444133)],
-                               n = 9}}),
+                                   [("intersect", -1.7047480922384253),
+                                    ("day", -2.3978952727983707),
+                                    ("<day-of-month> (ordinal)", -2.3978952727983707),
+                                    ("hour", -1.9924301646902063), ("minute", -2.3978952727983707)],
+                               n = 4}}),
        ("integer (0..19)",
         Classifier{okData =
                      ClassData{prior = -5.5569851154810765e-2,
@@ -234,21 +233,17 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("between <time-of-day> and <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Halloween",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -258,21 +253,17 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 2},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("October",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -389,258 +380,222 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.29944691403136736,
-                               unseen = -6.180016653652572,
+                     ClassData{prior = -0.17538912001830978,
+                               unseen = -6.263398262591624,
                                likelihoods =
                                  HashMap.fromList
-                                   [("last <cycle>sunday", -5.484796933490655),
-                                    ("Koningsdagyear", -5.484796933490655),
-                                    ("hourday", -4.386184644822546),
+                                   [("last <cycle>sunday", -5.568344503761097),
+                                    ("Koningsdagyear", -4.064267106984823),
+                                    ("hourday", -4.4697322150929875),
                                     ("on a named-day<day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month><time-of-day>  o'clock",
-                                     -5.484796933490655),
-                                    ("dayhour", -2.3493027175615055),
-                                    ("daymonth", -4.5685062016165),
-                                    ("next <cycle>friday", -5.484796933490655),
-                                    ("monthyear", -3.8753590210565547),
+                                     -5.568344503761097),
+                                    ("dayhour", -2.4328502878319473),
+                                    ("daymonth", -4.6520537718869415),
+                                    ("next <cycle>friday", -5.568344503761097),
+                                    ("monthyear", -3.9589065913269965),
                                     ("friday<day-of-month> (non ordinal) <named-month>",
-                                     -5.079331825382491),
-                                    ("yearhour", -5.484796933490655),
-                                    ("intersect<time-of-day>  o'clock", -4.791649752930709),
-                                    ("tuesdaythis <cycle>", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("yearhour", -5.568344503761097),
+                                    ("intersect<time-of-day>  o'clock", -4.875197323201151),
+                                    ("tuesdaythis <cycle>", -5.568344503761097),
                                     ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.079331825382491),
-                                    ("saturday<time-of-day>  o'clock", -5.484796933490655),
+                                     -4.6520537718869415),
+                                    ("saturday<time-of-day>  o'clock", -5.568344503761097),
                                     ("absorption of , after named daydd/mm/yyyy",
-                                     -5.079331825382491),
-                                    ("<time-of-day> am|pmintersect", -5.484796933490655),
-                                    ("intersect<time> <part-of-day>", -4.791649752930709),
-                                    ("Marchyear", -5.484796933490655),
-                                    ("saturdayat <time-of-day>", -5.079331825382491),
-                                    ("saturday<time> <part-of-day>", -5.079331825382491),
-                                    ("dd/mm<time-of-day>  o'clock", -5.484796933490655),
-                                    ("on a named-dayat <time-of-day>", -4.791649752930709),
-                                    ("today<time-of-day>  o'clock", -5.484796933490655),
-                                    ("at <time-of-day>on a named-day", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("<time-of-day> am|pmintersect", -5.568344503761097),
+                                    ("intersect<time> <part-of-day>", -4.875197323201151),
+                                    ("Marchyear", -5.568344503761097),
+                                    ("saturdayat <time-of-day>", -5.162879395652933),
+                                    ("saturday<time> <part-of-day>", -5.162879395652933),
+                                    ("dd/mm<time-of-day>  o'clock", -5.568344503761097),
+                                    ("on a named-dayat <time-of-day>", -4.875197323201151),
+                                    ("today<time-of-day>  o'clock", -5.568344503761097),
+                                    ("at <time-of-day>on a named-day", -5.568344503761097),
                                     ("on a named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("intersect by ','year", -5.484796933490655),
-                                    ("on <date><time-of-day>  o'clock", -4.791649752930709),
-                                    ("next <cycle>monday", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("intersect by ','year", -5.568344503761097),
+                                    ("on <date><time-of-day>  o'clock", -4.875197323201151),
+                                    ("next <cycle>monday", -5.568344503761097),
                                     ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.484796933490655),
-                                    ("exactly <time-of-day>tomorrow", -5.484796933490655),
-                                    ("on a named-day<time> <part-of-day>", -5.079331825382491),
-                                    ("monthhour", -4.5685062016165),
+                                     -5.162879395652933),
+                                    ("exactly <time-of-day>tomorrow", -5.568344503761097),
+                                    ("on a named-day<time> <part-of-day>", -5.162879395652933),
+                                    ("monthhour", -4.6520537718869415),
                                     ("on <date>between <datetime> and <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("last <day-of-week> of <time>year", -5.484796933490655),
-                                    ("on a named-day<time-of-day>  o'clock", -5.484796933490655),
-                                    ("next <cycle>March", -5.484796933490655),
-                                    ("todayat <time-of-day>", -4.791649752930709),
+                                     -5.162879395652933),
+                                    ("last <day-of-week> of <time>year", -5.568344503761097),
+                                    ("on a named-day<time-of-day>  o'clock", -5.568344503761097),
+                                    ("next <cycle>March", -5.568344503761097),
+                                    ("todayat <time-of-day>", -4.875197323201151),
                                     ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -5.484796933490655),
-                                    ("on <date>at <time-of-day>", -4.791649752930709),
-                                    ("thursday<time> timezone", -5.079331825382491),
-                                    ("on <date>about <time-of-day>", -4.791649752930709),
-                                    ("dayday", -3.1822118404966093),
-                                    ("on <date><time> <part-of-day>", -4.5685062016165),
-                                    ("dd/mmabout <time-of-day>", -5.079331825382491),
-                                    ("<day-of-month> (ordinal)intersect", -5.484796933490655),
-                                    ("hourhour", -4.386184644822546),
+                                     -5.162879395652933),
+                                    ("on <date>at <time-of-day>", -4.875197323201151),
+                                    ("thursday<time> timezone", -5.162879395652933),
+                                    ("on <date>about <time-of-day>", -4.875197323201151),
+                                    ("dayday", -3.265759410767051),
+                                    ("on <date><time> <part-of-day>", -4.6520537718869415),
+                                    ("dd/mmabout <time-of-day>", -5.162879395652933),
+                                    ("<day-of-month> (ordinal)intersect", -5.568344503761097),
+                                    ("hourhour", -4.4697322150929875),
                                     ("saturday<day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
-                                    ("thursdayat <time-of-day>", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("thursdayat <time-of-day>", -5.568344503761097),
                                     ("today/tomorrow/yesterday afternoon<hour-of-day> <integer> (as relative minutes)",
-                                     -5.079331825382491),
+                                     -5.162879395652933),
                                     ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -4.386184644822546),
-                                    ("dayyear", -3.405355391810819),
-                                    ("tuesdayafter <duration>", -5.484796933490655),
-                                    ("tomorrow<time-of-day>  o'clock", -5.484796933490655),
-                                    ("<time-of-day>  o'clocktomorrow", -4.791649752930709),
+                                     -4.4697322150929875),
+                                    ("dayyear", -3.1704492309627264),
+                                    ("tuesdayafter <duration>", -5.568344503761097),
+                                    ("tomorrow<time-of-day>  o'clock", -5.568344503761097),
+                                    ("<time-of-day>  o'clocktomorrow", -4.875197323201151),
                                     ("<day-of-month> (non ordinal) <named-month>intersect",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.484796933490655),
-                                    ("<day-of-month> (ordinal)tuesday", -5.484796933490655),
-                                    ("hourminute", -4.791649752930709),
-                                    ("thursdayhh:mm", -5.484796933490655),
-                                    ("this <cycle>wednesday", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("<day-of-month> (ordinal)tuesday", -5.568344503761097),
+                                    ("hourminute", -4.875197323201151),
+                                    ("thursdayhh:mm", -5.568344503761097),
+                                    ("this <cycle>wednesday", -5.568344503761097),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month><time> <part-of-day>",
-                                     -5.079331825382491),
+                                     -5.162879395652933),
                                     ("on <date><day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
-                                    ("Aprilabout <time-of-day>", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("Aprilabout <time-of-day>", -5.568344503761097),
                                     ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("<day-of-month> (ordinal)February", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("<day-of-month> (ordinal)February", -5.568344503761097),
                                     ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.791649752930709),
+                                     -4.3155815352657285),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.5685062016165),
+                                     -4.6520537718869415),
                                     ("today/tomorrow/yesterday evening<time-of-day>  o'clock",
-                                     -5.484796933490655),
-                                    ("fridayintersect", -4.791649752930709),
+                                     -5.568344503761097),
+                                    ("fridayintersect", -4.875197323201151),
                                     ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("on <date><datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("this <cycle>monday", -5.484796933490655),
-                                    ("April<time-of-day>  o'clock", -5.484796933490655),
-                                    ("next <cycle>wednesday", -5.484796933490655),
-                                    ("hh:mmintersect", -5.079331825382491),
+                                     -5.568344503761097),
+                                    ("this <cycle>monday", -5.568344503761097),
+                                    ("April<time-of-day>  o'clock", -5.568344503761097),
+                                    ("next <cycle>wednesday", -5.568344503761097),
+                                    ("hh:mmintersect", -5.162879395652933),
                                     ("thursday<datetime> - <datetime> (interval)",
-                                     -5.079331825382491),
-                                    ("<day-of-month> (ordinal)July", -5.484796933490655),
+                                     -5.162879395652933),
+                                    ("<day-of-month> (ordinal)July", -5.568344503761097),
                                     ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.079331825382491),
-                                    ("yearmonth", -5.484796933490655),
-                                    ("at <time-of-day>intersect", -5.079331825382491),
+                                     -4.6520537718869415),
+                                    ("yearmonth", -5.568344503761097),
+                                    ("at <time-of-day>intersect", -5.162879395652933),
                                     ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.079331825382491),
+                                     -4.6520537718869415),
                                     ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.484796933490655),
-                                    ("dayminute", -2.7767467323884447),
+                                     -5.568344503761097),
+                                    ("dayminute", -2.3902906734131513),
                                     ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
-                                    ("intersectyear", -4.791649752930709),
-                                    ("<time-of-day> am|pmsaturday", -5.484796933490655),
-                                    ("<ordinal> <cycle> of <time>year", -5.484796933490655),
-                                    ("minuteday", -3.2875723561544357),
+                                     -5.568344503761097),
+                                    ("intersectyear", -4.875197323201151),
+                                    ("<time-of-day> am|pmsaturday", -5.568344503761097),
+                                    ("<ordinal> <cycle> of <time>year", -5.568344503761097),
+                                    ("minuteday", -3.3711199264248775),
                                     ("absorption of , after named dayintersect",
-                                     -5.484796933490655),
-                                    ("Julyyear", -5.484796933490655),
-                                    ("year<time-of-day>  o'clock", -5.484796933490655),
-                                    ("Octoberyear", -4.386184644822546),
-                                    ("hh:mmon <date>", -5.079331825382491),
+                                     -5.568344503761097),
+                                    ("Julyyear", -5.568344503761097),
+                                    ("year<time-of-day>  o'clock", -5.568344503761097),
+                                    ("Octoberyear", -4.4697322150929875),
+                                    ("hh:mmon <date>", -5.162879395652933),
                                     ("today/tomorrow/yesterday afternoonat <time-of-day>",
-                                     -5.484796933490655),
-                                    ("dd/mmyear", -5.484796933490655),
-                                    ("tuesdayin <duration>", -5.484796933490655),
-                                    ("Septemberyear", -5.079331825382491),
-                                    ("at <time-of-day>on <date>", -5.079331825382491),
-                                    ("absorption of , after named daydd/mm", -5.079331825382491),
-                                    ("intersectintersect", -5.484796933490655),
-                                    ("hh:mmon a named-day", -5.484796933490655),
-                                    ("weekday", -4.098502572370764),
-                                    ("dayweek", -4.791649752930709),
-                                    ("weekyear", -5.079331825382491),
-                                    ("on <date>February", -5.484796933490655),
-                                    ("Kerstmisyear", -5.484796933490655),
-                                    ("<month> dd-dd (interval)year", -5.484796933490655),
-                                    ("tomorrowat <time-of-day>", -5.079331825382491),
-                                    ("next <cycle>tuesday", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("tuesdayin <duration>", -5.568344503761097),
+                                    ("Septemberyear", -5.162879395652933),
+                                    ("at <time-of-day>on <date>", -5.162879395652933),
+                                    ("absorption of , after named daydd/mm", -5.162879395652933),
+                                    ("intersectintersect", -5.568344503761097),
+                                    ("hh:mmon a named-day", -5.568344503761097),
+                                    ("weekday", -4.182050142641207),
+                                    ("dayweek", -4.875197323201151),
+                                    ("weekyear", -5.162879395652933),
+                                    ("on <date>February", -5.568344503761097),
+                                    ("Kerstmisyear", -5.568344503761097),
+                                    ("<month> dd-dd (interval)year", -5.568344503761097),
+                                    ("tomorrowat <time-of-day>", -5.162879395652933),
+                                    ("next <cycle>tuesday", -5.568344503761097),
                                     ("monday<day-of-month> (non ordinal) <named-month>",
-                                     -5.484796933490655),
-                                    ("at <time-of-day>tomorrow", -5.484796933490655),
+                                     -5.568344503761097),
+                                    ("at <time-of-day>tomorrow", -5.568344503761097),
                                     ("monday<named-month> <day-of-month> (non ordinal)",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("on a named-day<time-of-day> - <time-of-day> (interval)",
-                                     -5.484796933490655),
+                                     -5.162879395652933),
                                     ("today/tomorrow/yesterday eveningat <time-of-day>",
-                                     -5.079331825382491),
-                                    ("last <cycle> of <time>year", -5.079331825382491),
+                                     -5.162879395652933),
+                                    ("last <cycle> of <time>year", -5.162879395652933),
                                     ("on a named-day<datetime> - <datetime> (interval)",
-                                     -5.484796933490655),
+                                     -5.568344503761097),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.5685062016165),
-                                    ("April<time> <part-of-day>", -5.079331825382491)],
-                               n = 169},
+                                     -4.6520537718869415),
+                                    ("April<time> <part-of-day>", -5.162879395652933)],
+                               n = 193},
                    koData =
-                     ClassData{prior = -1.3518081850487211, unseen = -5.572154032177765,
+                     ClassData{prior = -1.827161396278971, unseen = -5.3612921657094255,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -4.875197323201151),
-                                    ("dayhour", -3.488902962081261),
-                                    ("on a named-dayafter <time-of-day>", -4.875197323201151),
-                                    ("July<day-of-month> (non ordinal) <named-month>",
-                                     -4.875197323201151),
-                                    ("daymonth", -3.9589065913269965),
-                                    ("monthday", -4.4697322150929875),
-                                    ("monthyear", -3.776585034533042),
-                                    ("yearhour", -4.875197323201151),
-                                    ("intersect<time-of-day>  o'clock", -4.875197323201151),
-                                    ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.4697322150929875),
-                                    ("<day-of-month> (ordinal)wednesday", -4.4697322150929875),
-                                    ("Julyintersect", -4.875197323201151),
-                                    ("thursdayafter <time-of-day>", -4.875197323201151),
-                                    ("intersect<time> <part-of-day>", -4.875197323201151),
-                                    ("Marchyear", -4.875197323201151),
-                                    ("<day-of-month> (ordinal)year", -4.875197323201151),
-                                    ("on a named-dayat <time-of-day>", -4.875197323201151),
-                                    ("on a named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("tuesdayafter <time-of-day>", -4.875197323201151),
-                                    ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("monthhour", -3.9589065913269965),
-                                    ("on <date>between <datetime> and <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("todayat <time-of-day>", -4.875197323201151),
-                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("on <date>at <time-of-day>", -4.875197323201151),
-                                    ("on <date>about <time-of-day>", -4.875197323201151),
-                                    ("dayday", -3.776585034533042),
-                                    ("hourhour", -4.182050142641207),
-                                    ("thursdayat <time-of-day>", -4.875197323201151),
-                                    ("dayyear", -4.182050142641207),
-                                    ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("<day-of-month> (ordinal)tuesday", -4.4697322150929875),
-                                    ("thursdayhh:mm", -4.4697322150929875),
-                                    ("Aprilabout <time-of-day>", -4.875197323201151),
-                                    ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.875197323201151),
-                                    ("Aprilyear", -4.875197323201151),
-                                    ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.182050142641207),
-                                    ("mondayFebruary", -4.875197323201151),
-                                    ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("yearuntil <time-of-day>", -4.4697322150929875),
-                                    ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.4697322150929875),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -4.875197323201151),
-                                    ("August<day-of-month> (non ordinal) <named-month>",
-                                     -4.875197323201151),
-                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -4.4697322150929875),
-                                    ("dayminute", -2.3902906734131513),
-                                    ("thursday<part-of-day> of <time>", -4.875197323201151),
-                                    ("Julyyear", -4.4697322150929875),
-                                    ("Octoberyear", -4.875197323201151),
+                                   [("dayhour", -3.2771447329921766),
+                                    ("on a named-dayafter <time-of-day>", -4.663439094112067),
+                                    ("daymonth", -4.257973986003902),
+                                    ("monthyear", -3.5648268054439574),
+                                    ("yearhour", -4.663439094112067),
+                                    ("intersect<time-of-day>  o'clock", -4.663439094112067),
+                                    ("<day-of-month> (ordinal)wednesday", -4.257973986003902),
+                                    ("Julyintersect", -4.663439094112067),
+                                    ("thursdayafter <time-of-day>", -4.663439094112067),
+                                    ("intersect<time> <part-of-day>", -4.663439094112067),
+                                    ("Marchyear", -4.663439094112067),
+                                    ("<day-of-month> (ordinal)year", -4.663439094112067),
+                                    ("on a named-dayat <time-of-day>", -4.663439094112067),
+                                    ("tuesdayafter <time-of-day>", -4.663439094112067),
+                                    ("monthhour", -3.747148362237912),
+                                    ("todayat <time-of-day>", -4.663439094112067),
+                                    ("on <date>at <time-of-day>", -4.663439094112067),
+                                    ("on <date>about <time-of-day>", -4.663439094112067),
+                                    ("dayday", -3.5648268054439574),
+                                    ("hourhour", -3.970291913552122),
+                                    ("thursdayat <time-of-day>", -4.663439094112067),
+                                    ("dayyear", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)tuesday", -4.257973986003902),
+                                    ("thursdayhh:mm", -4.257973986003902),
+                                    ("Aprilabout <time-of-day>", -4.663439094112067),
+                                    ("Aprilyear", -4.663439094112067),
+                                    ("mondayFebruary", -4.663439094112067),
+                                    ("yearuntil <time-of-day>", -4.257973986003902),
+                                    ("dayminute", -3.5648268054439574),
+                                    ("thursday<part-of-day> of <time>", -4.663439094112067),
+                                    ("Julyyear", -4.257973986003902),
+                                    ("Octoberyear", -4.663439094112067),
                                     ("today/tomorrow/yesterday afternoonat <time-of-day>",
-                                     -4.4697322150929875),
-                                    ("year<time> <part-of-day>", -4.875197323201151),
+                                     -4.257973986003902),
+                                    ("year<time> <part-of-day>", -4.663439094112067),
                                     ("today/tomorrow/yesterday afternoon<time-of-day>  o'clock",
-                                     -4.875197323201151),
-                                    ("yearday", -4.4697322150929875),
-                                    ("absorption of , after named dayFebruary", -4.875197323201151),
+                                     -4.663439094112067),
+                                    ("yearday", -4.257973986003902),
+                                    ("absorption of , after named dayFebruary", -4.663439094112067),
                                     ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
-                                     -4.875197323201151),
-                                    ("after <time-of-day>year", -4.875197323201151),
-                                    ("on a named-day<time-of-day> - <time-of-day> (interval)",
-                                     -4.875197323201151),
-                                    ("on <date>after <time-of-day>", -4.875197323201151),
+                                     -4.663439094112067),
+                                    ("after <time-of-day>year", -4.663439094112067),
+                                    ("on <date>after <time-of-day>", -4.663439094112067),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.875197323201151)],
-                               n = 59}}),
+                                     -4.663439094112067)],
+                               n = 37}}),
        ("<ordinal> <cycle> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -667,28 +622,28 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.995732273553991,
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.0910424533583156,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dd/mm/yyyydd/mm", -2.2512917986064953),
-                                    ("minuteminute", -2.2512917986064953),
+                                   [("dd/mm/yyyydd/mm", -2.3513752571634776),
+                                    ("hh:mmtime-of-day (latent)", -2.3513752571634776),
+                                    ("minuteminute", -2.3513752571634776),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.2512917986064953),
-                                    ("hh:mmhh:mm", -2.2512917986064953),
-                                    ("dayday", -1.845826690498331),
-                                    ("dd/mm/yyyydd/mm/yyyy", -2.2512917986064953),
-                                    ("hourhour", -2.2512917986064953)],
-                               n = 4},
+                                     -2.3513752571634776),
+                                    ("hh:mmhh:mm", -2.3513752571634776),
+                                    ("dayday", -1.9459101490553135),
+                                    ("dd/mm/yyyydd/mm/yyyy", -2.3513752571634776),
+                                    ("hourhour", -2.3513752571634776),
+                                    ("minutehour", -2.3513752571634776)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.772588722239781,
+                     ClassData{prior = -1.791759469228055, unseen = -2.639057329615259,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -2.0149030205422647),
-                                    ("hh:mmtime-of-day (latent)", -2.0149030205422647),
-                                    ("minutehour", -2.0149030205422647),
-                                    ("dd/mm/yyyytime-of-day (latent)", -2.0149030205422647)],
-                               n = 2}}),
+                                   [("dayhour", -1.8718021769015913),
+                                    ("dd/mm/yyyytime-of-day (latent)", -1.8718021769015913)],
+                               n = 1}}),
        ("after tomorrow",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -714,23 +669,20 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.252762968495368),
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.6094379124341003),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -1.9459101490553135),
-                                    ("hh:mmhh:mm", -1.252762968495368),
-                                    ("hourhour", -1.9459101490553135)],
-                               n = 4},
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 3}}),
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("yyyy-mm-dd",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
@@ -1048,30 +1000,30 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.3925617032722565, unseen = -4.02535169073515,
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.1588830833596715,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.24613306953890846),
-                                    ("integer (0..19)", -1.6094379124341003)],
-                               n = 52},
+                                   [("integer (numeric)", -0.2113090936672069),
+                                    ("integer (0..19)", -1.7452394535931621)],
+                               n = 60},
                    koData =
-                     ClassData{prior = -1.1249295969854831, unseen = -3.367295829986474,
+                     ClassData{prior = -1.5105920777974677, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.2411620568168881),
-                                    ("integer (0..19)", -1.9459101490553135),
-                                    ("couple", -2.639057329615259)],
-                               n = 25}}),
+                                   [("integer (numeric)", -0.35667494393873245),
+                                    ("integer (0..19)", -1.6094379124341003),
+                                    ("couple", -2.3025850929940455)],
+                               n = 17}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -0.19105523676270922,
-                               unseen = -3.044522437723423,
+                     ClassData{prior = -0.1823215567939546, unseen = -3.295836866004329,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 19},
+                               n = 25},
                    koData =
-                     ClassData{prior = -1.749199854809259, unseen = -1.791759469228055,
+                     ClassData{prior = -1.791759469228055, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
+                               n = 5}}),
        ("last <day-of-week> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -1444,25 +1396,11 @@
                                n = 1}}),
        ("Koningsdag",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                     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}}),
-       ("by the end of <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half to|till|before <integer> (hour-of-day)",
-                                     -1.7346010553881064),
-                                    ("time-of-day (latent)", -1.4469189829363254),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.4469189829363254),
-                                    ("minute", -1.4469189829363254)],
-                               n = 6}}),
        ("in <duration>",
         Classifier{okData =
                      ClassData{prior = -4.652001563489282e-2,
@@ -1538,24 +1476,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -0.3746934494414107, unseen = -3.367295829986474,
                                likelihoods =
                                  HashMap.fromList
-                                   [("at <time-of-day>hh:mm", -2.1972245773362196),
-                                    ("minuteminute", -0.9444616088408514),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 6},
+                                   [("hh:mmtime-of-day (latent)", -1.7227665977411035),
+                                    ("at <time-of-day>hh:mm", -2.639057329615259),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.540445040947149),
+                                    ("minutehour", -1.540445040947149),
+                                    ("at <time-of-day>time-of-day (latent)", -2.639057329615259)],
+                               n = 11},
                    koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.295836866004329,
+                     ClassData{prior = -1.1631508098056809, unseen = -2.833213344056216,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.1786549963416462),
-                                    ("minuteminute", -2.159484249353372),
-                                    ("hh:mmhh:mm", -2.159484249353372),
-                                    ("minutehour", -1.0608719606852628),
-                                    ("at <time-of-day>time-of-day (latent)", -2.5649493574615367)],
-                               n = 10}}),
+                                   [("hh:mmtime-of-day (latent)", -1.3862943611198906),
+                                    ("minuteminute", -1.6739764335716716),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("minutehour", -1.3862943611198906)],
+                               n = 5}}),
        ("winter",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -1618,7 +1557,7 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -0.3448404862917295,
+                     ClassData{prior = -0.2578291093020998,
                                unseen = -3.7612001156935624,
                                likelihoods =
                                  HashMap.fromList
@@ -1631,15 +1570,14 @@
                                     ("integer (numeric)March", -2.3513752571634776)],
                                n = 17},
                    koData =
-                     ClassData{prior = -1.2321436812926323,
-                               unseen = -3.1354942159291497,
+                     ClassData{prior = -1.4816045409242156,
+                               unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)August", -2.3978952727983707),
-                                    ("month", -1.0116009116784799),
-                                    ("integer (numeric)October", -2.3978952727983707),
-                                    ("integer (numeric)July", -1.2992829841302609)],
-                               n = 7}}),
+                                   [("month", -1.0986122886681098),
+                                    ("integer (numeric)October", -2.1972245773362196),
+                                    ("integer (numeric)July", -1.2809338454620642)],
+                               n = 5}}),
        ("this|next <day-of-week>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.639057329615259,
@@ -1767,6 +1705,18 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("composite <duration>",
+        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)hour (grain)<integer> + '\"",
+                                     -0.6931471805599453),
+                                    ("hourminute", -0.6931471805599453)],
+                               n = 2}}),
        ("summer",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
diff --git a/Duckling/Ranking/Classifiers/PL_XX.hs b/Duckling/Ranking/Classifiers/PL_XX.hs
--- a/Duckling/Ranking/Classifiers/PL_XX.hs
+++ b/Duckling/Ranking/Classifiers/PL_XX.hs
@@ -37,11 +37,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.5762828404206344, unseen = -4.927253685157205,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 136},
+                     ClassData{prior = -0.5658077581833438, unseen = -4.941642422609305,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 138},
                    koData =
-                     ClassData{prior = -0.8254986320446193, unseen = -4.68213122712422,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 106}}),
+                     ClassData{prior = -0.8391010931830252, unseen = -4.672828834461907,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 105}}),
        ("exactly <time-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
@@ -92,44 +92,60 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -2.3025850929940455,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("zima",
+        Classifier{okData =
+                     ClassData{prior = 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.8038127484474648, unseen = -4.919980925828125,
+                     ClassData{prior = -0.7922380832041762,
+                               unseen = -4.9344739331306915,
                                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),
+                                   [("<ordinal> (as hour)after <time-of-day>", -3.828641396489095),
+                                    ("dayhour", -2.847812143477369),
+                                    ("Wednesdayevening|night", -4.23410650459726),
+                                    ("<ordinal> (as hour)evening|night", -2.5293584123588344),
+                                    ("<ordinal> (as hour)on <date>", -4.23410650459726),
+                                    ("yesterdayevening|night", -4.23410650459726),
+                                    ("hourhour", -1.213681618452897),
+                                    ("after <time-of-day>after <time-of-day>", -3.828641396489095),
+                                    ("until <time-of-day>morning", -3.828641396489095),
+                                    ("until <time-of-day>after <time-of-day>", -4.23410650459726),
+                                    ("minutehour", -4.23410650459726),
+                                    ("todayevening|night", -3.828641396489095),
+                                    ("at <time-of-day>evening|night", -4.23410650459726),
+                                    ("intersecton <date>", -4.23410650459726),
                                     ("<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),
+                                     -4.23410650459726),
+                                    ("hh:mmon <date>", -4.23410650459726),
+                                    ("<integer> (latent time-of-day)morning", -4.23410650459726),
+                                    ("at <time-of-day>on <date>", -4.23410650459726),
+                                    ("intersectmorning", -2.981343536101891),
                                     ("<integer> (latent time-of-day)evening|night",
-                                     -2.966744736680739),
+                                     -2.981343536101891),
                                     ("from <datetime> - <datetime> (interval)morning",
-                                     -4.219507705176107),
+                                     -4.23410650459726),
                                     ("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},
+                                     -4.23410650459726),
+                                    ("Mondaymorning", -4.23410650459726),
+                                    ("on <date>morning", -4.23410650459726),
+                                    ("at <time-of-day>morning", -3.828641396489095),
+                                    ("tomorrowevening|night", -3.828641396489095)],
+                               n = 48},
                    koData =
-                     ClassData{prior = -0.593517339611104, unseen = -5.0689042022202315,
+                     ClassData{prior = -0.6029960835656478,
+                               unseen = -5.0689042022202315,
                                likelihoods =
                                  HashMap.fromList
                                    [("<ordinal> (as hour)after <time-of-day>", -4.3694478524670215),
@@ -137,6 +153,7 @@
                                     ("yearhour", -2.0668627594729756),
                                     ("year (latent)on <date>", -4.3694478524670215),
                                     ("<day-of-month> (ordinal)on <date>", -4.3694478524670215),
+                                    ("nograinhour", -3.1166848839716534),
                                     ("<time-of-day> - <time-of-day> (interval)morning",
                                      -4.3694478524670215),
                                     ("<day-of-month> (ordinal)evening|night", -2.6646997602285962),
@@ -153,7 +170,6 @@
                                     ("<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),
@@ -161,11 +177,11 @@
                                n = 58}}),
        ("today",
         Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
                    koData =
-                     ClassData{prior = -1.3862943611198906,
+                     ClassData{prior = -1.7047480922384253,
                                unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("mm/dd",
@@ -267,6 +283,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Good Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("October",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.772588722239781,
@@ -436,232 +459,220 @@
                                n = 1}}),
        ("May",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 3},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.3189150921417123, unseen = -6.280395838960195,
+                     ClassData{prior = -0.29394383367575705,
+                               unseen = -6.278521424165844,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Tuesdayon <date>", -4.669083511731744),
-                                    ("Sundaylast <cycle>", -5.179909135497735),
-                                    ("Fridaynext <cycle>", -5.585374243605899),
+                                   [("Tuesdayon <date>", -4.667205576907544),
+                                    ("Sundaylast <cycle>", -5.1780312006735345),
+                                    ("Fridaynext <cycle>", -5.583496308781699),
                                     ("<datetime> - <datetime> (interval)on <date>",
-                                     -5.179909135497735),
+                                     -5.1780312006735345),
                                     ("mm/dd<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("<hour-of-day> - <hour-of-day> (interval)on <date>",
-                                     -5.179909135497735),
+                                     -5.1780312006735345),
                                     ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.179909135497735),
-                                    ("hourday", -3.7936147743778443),
-                                    ("dayhour", -2.7231733626764307),
-                                    ("daymonth", -3.7936147743778443),
+                                     -5.1780312006735345),
+                                    ("hourday", -3.791736839553644),
+                                    ("dayhour", -2.7212954278522306),
+                                    ("daymonth", -3.791736839553644),
                                     ("<time-of-day> popo\322udniu/wieczorem/w nocyabsorption of , after named day",
-                                     -4.669083511731744),
-                                    ("TuesdaySeptember", -5.585374243605899),
-                                    ("monthyear", -3.100467593817899),
-                                    ("Wednesdayintersect", -5.179909135497735),
+                                     -4.667205576907544),
+                                    ("TuesdaySeptember", -5.583496308781699),
+                                    ("monthyear", -3.0985896589936988),
+                                    ("Wednesdayintersect", -5.1780312006735345),
                                     ("from <hour-of-day> - <hour-of-day> (interval)on a named-day",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("from <time-of-day> - <time-of-day> (interval)on a named-day",
-                                     -5.585374243605899),
-                                    ("intersecthh:mm", -5.585374243605899),
+                                     -5.583496308781699),
+                                    ("intersecthh:mm", -5.583496308781699),
                                     ("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),
+                                     -5.583496308781699),
+                                    ("Wednesdaynext <cycle>", -5.1780312006735345),
+                                    ("Tuesdaythis <cycle>", -5.583496308781699),
+                                    ("Saturday<time> <part-of-day>", -5.583496308781699),
+                                    ("Marchyear", -5.1780312006735345),
+                                    ("Saturdayat <time-of-day>", -5.1780312006735345),
+                                    ("on a named-dayat <time-of-day>", -5.1780312006735345),
+                                    ("at <time-of-day>on a named-day", -5.583496308781699),
+                                    ("<time> <part-of-day>on a named-day", -5.1780312006735345),
+                                    ("Wednesdayon <date>", -4.484884020113589),
+                                    ("on a named-day<time> <part-of-day>", -5.583496308781699),
+                                    ("last <day-of-week> of <time>year", -5.583496308781699),
+                                    ("today<time> <part-of-day>", -5.583496308781699),
+                                    ("todayat <time-of-day>", -5.583496308781699),
+                                    ("on <date>at <time-of-day>", -5.1780312006735345),
+                                    ("dayday", -2.9444389791664407),
+                                    ("on <date><time> <part-of-day>", -5.583496308781699),
+                                    ("intersect by \",\"hh:mm", -4.667205576907544),
+                                    ("mm/ddat <time-of-day>", -4.890349128221754),
+                                    ("WednesdayOctober", -5.1780312006735345),
+                                    ("last <cycle> <time>year", -4.667205576907544),
                                     ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.892227063045954),
+                                     -4.890349128221754),
                                     ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -4.892227063045954),
-                                    ("dayyear", -3.5704712230636346),
+                                     -4.890349128221754),
+                                    ("dayyear", -3.5685932882394344),
                                     ("Wednesday<day-of-month>(ordinal) <named-month>",
-                                     -5.585374243605899),
-                                    ("Thursday<time> <part-of-day>", -5.179909135497735),
+                                     -5.583496308781699),
+                                    ("Thursday<time> <part-of-day>", -5.1780312006735345),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.179909135497735),
+                                     -5.1780312006735345),
                                     ("day-after-tomorrow (single-word)at <time-of-day>",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.081296846829625),
-                                    ("Tuesdaynext <cycle>", -5.585374243605899),
+                                     -4.079418912005425),
+                                    ("Tuesdaynext <cycle>", -5.583496308781699),
                                     ("tomorrow<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.199079882486009),
+                                     -4.197201947661808),
                                     ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.892227063045954),
+                                     -4.667205576907544),
                                     ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.892227063045954),
-                                    ("tomorrowuntil <time-of-day>", -5.179909135497735),
+                                     -4.667205576907544),
+                                    ("tomorrowuntil <time-of-day>", -5.1780312006735345),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.081296846829625),
+                                     -4.079418912005425),
                                     ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\"",
-                                     -4.669083511731744),
-                                    ("TuesdayOctober", -5.585374243605899),
-                                    ("last <day-of-week> <time>year", -5.179909135497735),
+                                     -4.667205576907544),
+                                    ("TuesdayOctober", -5.583496308781699),
+                                    ("last <day-of-week> <time>year", -5.1780312006735345),
                                     ("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),
+                                     -5.1780312006735345),
+                                    ("Mondaythis <cycle>", -5.583496308781699),
+                                    ("<time-of-day> ranoon <date>", -5.1780312006735345),
+                                    ("on <date><time-of-day> rano", -5.583496308781699),
                                     ("<time-of-day> popo\322udniu/wieczorem/w nocytomorrow",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("<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),
+                                     -4.667205576907544),
+                                    ("at <time-of-day>intersect", -5.1780312006735345),
+                                    ("dayminute", -3.791736839553644),
+                                    ("<time-of-day> ranoon a named-day", -5.1780312006735345),
                                     ("from <hour-of-day> - <hour-of-day> (interval)on <date>",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("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),
+                                     -5.583496308781699),
+                                    ("intersectyear", -5.1780312006735345),
+                                    ("on a named-day<time-of-day> rano", -5.583496308781699),
+                                    ("<ordinal> <cycle> of <time>year", -5.583496308781699),
+                                    ("minuteday", -2.384823191231018),
                                     ("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),
+                                     -5.583496308781699),
+                                    ("Saturday<time-of-day> rano", -5.583496308781699),
+                                    ("Octoberyear", -3.878748216543274),
+                                    ("yearhh:mm", -5.583496308781699),
+                                    ("at <time-of-day>intersect by \",\"", -5.1780312006735345),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -5.179909135497735),
-                                    ("tomorrowexactly <time-of-day>", -4.892227063045954),
+                                     -5.1780312006735345),
+                                    ("tomorrowexactly <time-of-day>", -4.890349128221754),
                                     ("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),
+                                     -5.1780312006735345),
+                                    ("Septemberyear", -4.667205576907544),
+                                    ("at <time-of-day>on <date>", -5.583496308781699),
+                                    ("on <date>year", -4.197201947661808),
+                                    ("dayweek", -3.6375861597263857),
+                                    ("Tuesdayin <duration>", -5.583496308781699),
+                                    ("<time> <part-of-day>on <date>", -5.1780312006735345),
+                                    ("weekyear", -4.330733340286331),
+                                    ("<ordinal> <cycle> <time>year", -5.1780312006735345),
+                                    ("tomorrowat <time-of-day>", -5.583496308781699),
+                                    ("tomorrow<time> <part-of-day>", -5.583496308781699),
+                                    ("at <time-of-day>Friday", -5.1780312006735345),
                                     ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect",
-                                     -4.669083511731744),
+                                     -4.667205576907544),
                                     ("<named-month> <day-of-month> (ordinal)year",
-                                     -5.585374243605899),
-                                    ("tomorrow<time-of-day> rano", -5.585374243605899),
+                                     -5.583496308781699),
+                                    ("tomorrow<time-of-day> rano", -5.583496308781699),
                                     ("<datetime> - <datetime> (interval)on a named-day",
-                                     -5.179909135497735),
-                                    ("last <cycle> of <time>year", -5.179909135497735),
+                                     -5.1780312006735345),
+                                    ("last <cycle> of <time>year", -5.1780312006735345),
                                     ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.585374243605899),
+                                     -5.583496308781699),
                                     ("<time-of-day> - <time-of-day> (interval)on a named-day",
-                                     -5.179909135497735),
+                                     -5.1780312006735345),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -5.179909135497735),
+                                     -5.1780312006735345),
                                     ("<hour-of-day> - <hour-of-day> (interval)on a named-day",
-                                     -5.179909135497735),
-                                    ("yearminute", -5.585374243605899)],
-                               n = 197},
+                                     -5.1780312006735345),
+                                    ("yearminute", -5.583496308781699)],
+                               n = 199},
                    koData =
-                     ClassData{prior = -1.298053727675531, unseen = -5.662960480135946,
+                     ClassData{prior = -1.3677409532241427, unseen = -5.602118820879701,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Tuesdayon <date>", -4.966335035199676),
-                                    ("<time-of-day> ranoby <time>", -4.560869927091511),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -4.966335035199676),
+                                   [("Tuesdayon <date>", -4.90527477843843),
+                                    ("<time-of-day> ranoby <time>", -4.499809670330265),
                                     ("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),
+                                     -4.90527477843843),
+                                    ("dayhour", -3.8066624897703196),
+                                    ("daymonth", -2.6026896854443837),
+                                    ("monthyear", -3.9889840465642745),
+                                    ("Wednesdayintersect", -4.499809670330265),
+                                    ("<time> <part-of-day>until <time-of-day>", -4.499809670330265),
+                                    ("hournograin", -3.033472601536838),
+                                    ("Marchyear", -4.212127597878484),
+                                    ("Wednesdayon <date>", -4.90527477843843),
+                                    ("absorption of , after named dayJuly", -4.90527477843843),
                                     ("<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),
+                                     -4.212127597878484),
+                                    ("mm/ddat <time-of-day>", -4.90527477843843),
+                                    ("hourhour", -3.9889840465642745),
+                                    ("<time> <part-of-day>by <time>", -4.499809670330265),
+                                    ("dayyear", -3.6525118099430616),
+                                    ("<time-of-day> ranoby the end of <time>", -4.499809670330265),
                                     ("<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),
+                                     -4.90527477843843),
+                                    ("monthminute", -4.90527477843843),
+                                    ("minutemonth", -4.212127597878484),
+                                    ("Aprilyear", -4.90527477843843),
                                     ("<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),
+                                     -4.499809670330265),
+                                    ("after <time-of-day>at <time-of-day>", -4.90527477843843),
+                                    ("SundayMarch", -4.90527477843843),
+                                    ("hh:mmby the end of <time>", -4.90527477843843),
+                                    ("minutenograin", -4.499809670330265),
                                     ("<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),
+                                     -4.499809670330265),
+                                    ("<time> <part-of-day><time-of-day> rano", -4.90527477843843),
+                                    ("<time-of-day> rano<time> <part-of-day>", -4.499809670330265),
+                                    ("at <time-of-day>intersect", -4.90527477843843),
                                     ("<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),
+                                     -4.90527477843843),
+                                    ("intersectyear", -3.6525118099430616),
+                                    ("intersectSeptember", -4.212127597878484),
+                                    ("minuteday", -3.200526686200004),
+                                    ("hh:mmon <date>", -4.499809670330265),
+                                    ("at <time-of-day>intersect by \",\"", -4.90527477843843),
+                                    ("MondayMarch", -4.90527477843843),
                                     ("<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),
+                                     -4.90527477843843),
+                                    ("tomorrowexactly <time-of-day>", -4.90527477843843),
+                                    ("absorption of , after named daySeptember", -4.90527477843843),
+                                    ("hh:mmon a named-day", -4.499809670330265),
+                                    ("Sundayon <date>", -4.499809670330265),
+                                    ("absorption of , after named dayFebruary",
+                                     -3.8066624897703196),
+                                    ("hh:mmby <time>", -4.90527477843843),
+                                    ("tomorrowat <time-of-day>", -4.90527477843843),
+                                    ("daynograin", -4.499809670330265),
                                     ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect",
-                                     -4.560869927091511),
-                                    ("Tuesdayintersect", -4.560869927091511),
-                                    ("Sundayintersect", -4.560869927091511)],
-                               n = 74}}),
+                                     -4.499809670330265),
+                                    ("Tuesdayintersect", -4.499809670330265),
+                                    ("Sundayintersect", -4.499809670330265)],
+                               n = 68}}),
        ("half after|past <integer> (hour-of-day)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -710,49 +721,47 @@
                    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,
+                     ClassData{prior = -6.0624621816434854e-2,
+                               unseen = -2.890371757896165,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 16},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -2.833213344056216, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.6739764335716716),
-                                    ("<time-of-day> rano<time-of-day> rano", -2.0794415416798357),
-                                    ("hh:mmhh:mm", -1.6739764335716716),
-                                    ("hourhour", -1.6739764335716716),
+                                   [("minuteminute", -1.791759469228055),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.1972245773362196),
+                                    ("hh:mmhh:mm", -1.791759469228055),
+                                    ("hourhour", -1.791759469228055),
+                                    ("minutehour", -2.1972245773362196),
                                     ("<time-of-day> rano<integer> (latent time-of-day)",
-                                     -2.0794415416798357)],
-                               n = 4},
+                                     -2.1972245773362196),
+                                    ("hh:mm<integer> (latent time-of-day)", -2.1972245773362196)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                     ClassData{prior = -0.9808292530117262, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.6739764335716716),
-                                    ("minutehour", -1.6739764335716716),
-                                    ("hh:mmintersect", -1.6739764335716716),
-                                    ("hh:mm<integer> (latent time-of-day)", -1.6739764335716716)],
-                               n = 4}}),
+                                   [("minuteminute", -1.540445040947149),
+                                    ("minutehour", -1.9459101490553135),
+                                    ("hh:mmintersect", -1.540445040947149),
+                                    ("hh:mm<integer> (latent time-of-day)", -1.9459101490553135)],
+                               n = 3}}),
        ("Saturday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.1972245773362196,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 7},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("from <hour-of-day> - <hour-of-day> (interval)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -791,34 +800,32 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.772588722239781,
+                     ClassData{prior = -0.1823215567939546, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("<time-of-day> rano<time-of-day> rano", -2.0149030205422647),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("hourhour", -1.6094379124341003),
+                                   [("minuteminute", -1.7346010553881064),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.1400661634962708),
+                                    ("hh:mmhh:mm", -1.7346010553881064),
+                                    ("hourhour", -1.7346010553881064),
+                                    ("minutehour", -2.1400661634962708),
                                     ("<time-of-day> rano<integer> (latent time-of-day)",
-                                     -2.0149030205422647)],
-                               n = 4},
+                                     -2.1400661634962708),
+                                    ("hh:mm<integer> (latent time-of-day)", -2.1400661634962708)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
+                     ClassData{prior = -1.791759469228055, unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minutehour", -1.2992829841302609),
-                                    ("hh:mm<integer> (latent time-of-day)", -1.2992829841302609)],
-                               n = 2}}),
-       ("integer 21..99",
+                                   [("minutehour", -1.5040773967762742),
+                                    ("hh:mm<integer> (latent time-of-day)", -1.5040773967762742)],
+                               n = 1}}),
+       ("Three Kings' Day",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
                    koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
-                               n = 1}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("yyyy-mm-dd",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -828,15 +835,12 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("year (latent)",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                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}}),
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 20}}),
        ("mm/dd/yyyy",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.9459101490553135,
@@ -846,25 +850,35 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("evening|night",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
+                     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}}),
        ("third ordinal",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                     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}}),
+       ("All Saints' 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}}),
        ("Monday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -2.995732273553991,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 18},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("yesterday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -883,6 +897,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Saint Nicholas 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}}),
        ("hh:mm:ss",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -911,21 +932,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.7376696182833684,
+                     ClassData{prior = -0.3184537311185346, unseen = -3.784189633918261,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -7.598590697792199e-2),
-                                    ("fifteen", -3.0204248861443626)],
-                               n = 38},
+                                   [("integer (numeric)", -7.232066157962613e-2),
+                                    ("fifteen", -3.068052935133617)],
+                               n = 40},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.1354942159291497,
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.1466034741918754),
-                                    ("one", -2.3978952727983707)],
-                               n = 19}}),
+                                   [("integer (numeric)", -0.1823215567939546),
+                                    ("one", -2.1972245773362196)],
+                               n = 15}}),
+       ("Labour 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}}),
        ("nth <time> of <time>",
         Classifier{okData =
                      ClassData{prior = -0.5596157879354228, unseen = -2.833213344056216,
@@ -946,6 +973,13 @@
                                     ("second ordinalWednesdayOctober", -1.9459101490553135),
                                     ("first ordinalWednesdayOctober", -1.9459101490553135)],
                                n = 3}}),
+       ("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}}),
        ("April",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -953,6 +987,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("St Stephen'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}}),
        ("18th ordinal",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -974,7 +1015,7 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("valentine's day",
+       ("Corpus Christi",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1},
@@ -1003,9 +1044,16 @@
                    koData =
                      ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("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}}),
        ("<unit-of-duration> as a duration",
         Classifier{okData =
-                     ClassData{prior = -2.1226137135450447,
+                     ClassData{prior = -2.1435203983643585,
                                unseen = -3.9318256327243257,
                                likelihoods =
                                  HashMap.fromList
@@ -1020,24 +1068,24 @@
                                     ("day (grain)", -2.5257286443082556)],
                                n = 17},
                    koData =
-                     ClassData{prior = -0.12751332029895956, unseen = -5.58724865840025,
+                     ClassData{prior = -0.12470347850095725, unseen = -5.60947179518496,
                                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}}),
+                                   [("week", -2.050454004806584),
+                                    ("month (grain)", -3.120895416507997),
+                                    ("hour (grain)", -2.6100697927420065),
+                                    ("year (grain)", -2.715430308399833),
+                                    ("second", -3.996364153861897),
+                                    ("week (grain)", -2.050454004806584),
+                                    ("day", -2.3869262414277963), ("quarter", -3.4085774889597777),
+                                    ("minute (grain)", -3.120895416507997),
+                                    ("year", -2.715430308399833),
+                                    ("second (grain)", -3.996364153861897),
+                                    ("hour", -2.6100697927420065), ("month", -3.120895416507997),
+                                    ("quarter (grain)", -3.4085774889597777),
+                                    ("minute", -3.120895416507997),
+                                    ("day (grain)", -2.3869262414277963)],
+                               n = 128}}),
        ("this <part-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -1050,35 +1098,29 @@
                    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,
+                     ClassData{prior = -0.2318016140573243, unseen = -4.060443010546419,
                                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)],
+                                   [("15th ordinalFebruary", -2.9444389791664407),
+                                    ("8th ordinalAugust", -2.9444389791664407),
+                                    ("13th ordinalFebruary", -3.349904087274605),
+                                    ("first ordinalMarch", -2.9444389791664407),
+                                    ("ordinal (digits)February", -1.55814461804655),
+                                    ("third ordinalMarch", -3.349904087274605),
+                                    ("month", -0.8649974374866046),
+                                    ("ordinal (digits)March", -2.4336133554004498)],
                                n = 23},
                    koData =
-                     ClassData{prior = -1.7227665977411035, unseen = -3.044522437723423,
+                     ClassData{prior = -1.575536360758419, unseen = -3.1780538303479458,
                                likelihoods =
                                  HashMap.fromList
-                                   [("14th ordinalApril", -1.8971199848858813),
-                                    ("ordinal (digits)April", -1.6094379124341003),
-                                    ("month", -1.2039728043259361)],
-                               n = 5}}),
+                                   [("14th ordinalApril", -2.03688192726104),
+                                    ("third ordinalMay", -2.4423470353692043),
+                                    ("ordinal (digits)April", -1.749199854809259),
+                                    ("month", -1.1895840668738362)],
+                               n = 6}}),
        ("<duration> hence",
         Classifier{okData =
                      ClassData{prior = -0.40546510810816444,
@@ -1110,18 +1152,13 @@
                                n = 11}}),
        ("Friday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                     ClassData{prior = -0.10536051565782628,
+                               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}}),
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("tomorrow",
         Classifier{okData =
                      ClassData{prior = -0.2876820724517809,
@@ -1149,6 +1186,20 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Assumption Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.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,
@@ -1178,6 +1229,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("by <time>",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -2.4849066497880004,
@@ -1228,11 +1286,13 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
        ("Sunday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                     ClassData{prior = -0.10008345855698253,
+                               unseen = -3.044522437723423,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 19},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -2.3513752571634776,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("afternoon",
         Classifier{okData =
                      ClassData{prior = -0.5108256237659907,
@@ -1416,13 +1476,6 @@
                    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,
@@ -1454,6 +1507,20 @@
                                    [("integer (numeric)noon", -1.0986122886681098),
                                     ("hour", -1.0986122886681098)],
                                n = 2}}),
+       ("Holy Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
        ("intersect by \",\"",
         Classifier{okData =
                      ClassData{prior = -0.2282586519809802, unseen = -4.727387818712341,
@@ -1611,28 +1678,37 @@
                                     ("day", -1.6739764335716716), ("year", -2.0794415416798357),
                                     ("month", -2.0794415416798357)],
                                n = 5}}),
+       ("day-before-yesterday (single-word)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Constitution 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}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -1.2809338454620642), ("Sunday", -1.791759469228055),
-                                    ("Tuesday", -1.791759469228055)],
+                                   [("day", -0.8754687373538999), ("Sunday", -1.3862943611198906),
+                                    ("Tuesday", -1.3862943611198906)],
                                n = 4},
                    koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -3.7612001156935624,
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.3978952727983707,
                                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}}),
+                                   [("Monday", -1.6094379124341003), ("day", -0.916290731874155),
+                                    ("Sunday", -1.2039728043259361)],
+                               n = 3}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.995732273553991,
@@ -1664,6 +1740,13 @@
                                     ("10th ordinal", -1.7227665977411035),
                                     ("9th ordinal", -1.7227665977411035)],
                                n = 20}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("noon",
         Classifier{okData =
                      ClassData{prior = -1.791759469228055, unseen = -1.3862943611198906,
@@ -1672,6 +1755,15 @@
                      ClassData{prior = -0.1823215567939546,
                                unseen = -2.4849066497880004,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("Christmas",
+        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}}),
        ("until <time-of-day>",
         Classifier{okData =
                      ClassData{prior = -0.8873031950009028,
@@ -1703,6 +1795,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ash Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 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> rano",
         Classifier{okData =
                      ClassData{prior = -0.10008345855698253,
@@ -1777,15 +1876,6 @@
                                     ("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,
@@ -1821,7 +1911,7 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("halloween day",
+       ("Halloween Day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1},
@@ -1906,13 +1996,22 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("second ordinal",
+       ("New Year's Day",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("second ordinal",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
        ("<time-of-day> popo\322udniu/wieczorem/w nocy",
         Classifier{okData =
                      ClassData{prior = -1.5037877364540559e-2,
@@ -1945,33 +2044,36 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -1.4469189829363254, unseen = -3.044522437723423,
+                     ClassData{prior = -1.2237754316221157,
+                               unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.3862943611198906),
-                                    ("hh:mmhh:mm", -1.3862943611198906)],
-                               n = 4},
+                                   [("minuteminute", -1.4816045409242156),
+                                    ("hh:mmhh:mm", -1.4816045409242156),
+                                    ("minutehour", -2.3978952727983707),
+                                    ("hh:mm<integer> (latent time-of-day)", -2.3978952727983707)],
+                               n = 5},
                    koData =
-                     ClassData{prior = -0.2682639865946794,
-                               unseen = -3.6635616461296463,
+                     ClassData{prior = -0.3483066942682157,
+                               unseen = -3.6109179126442243,
                                likelihoods =
                                  HashMap.fromList
-                                   [("about <time-of-day>noon", -2.9444389791664407),
+                                   [("about <time-of-day>noon", -2.890371757896165),
                                     ("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),
+                                     -2.890371757896165),
+                                    ("minuteminute", -2.890371757896165),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.890371757896165),
+                                    ("until <time-of-day>noon", -2.890371757896165),
+                                    ("hh:mmhh:mm", -2.890371757896165),
+                                    ("hourhour", -1.6376087894007967),
+                                    ("minutehour", -1.791759469228055),
+                                    ("at <time-of-day>noon", -2.890371757896165),
                                     ("<time-of-day> rano<integer> (latent time-of-day)",
-                                     -2.9444389791664407),
+                                     -2.890371757896165),
                                     ("until <time-of-day><integer> (latent time-of-day)",
-                                     -2.9444389791664407),
-                                    ("hh:mm<integer> (latent time-of-day)", -1.845826690498331)],
-                               n = 13}}),
+                                     -2.890371757896165),
+                                    ("hh:mm<integer> (latent time-of-day)", -1.9740810260220096)],
+                               n = 12}}),
        ("<hour-of-day> - <hour-of-day> (interval)",
         Classifier{okData =
                      ClassData{prior = -1.5040773967762742,
@@ -2049,27 +2151,26 @@
                                n = 8}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.912023005428146,
+                     ClassData{prior = -4.8790164169432056e-2,
+                               unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)September", -3.1986731175506815),
-                                    ("integer (numeric)May", -2.505525936990736),
-                                    ("integer (numeric)April", -3.1986731175506815),
-                                    ("integer (numeric)August", -3.1986731175506815),
-                                    ("integer (numeric)February", -1.589235205116581),
-                                    ("month", -0.8472978603872037),
-                                    ("integer (numeric)November", -2.2823823856765264),
-                                    ("integer (numeric)March", -3.1986731175506815)],
+                                   [("integer (numeric)September", -3.1780538303479458),
+                                    ("integer (numeric)May", -2.4849066497880004),
+                                    ("integer (numeric)April", -3.1780538303479458),
+                                    ("integer (numeric)August", -3.1780538303479458),
+                                    ("integer (numeric)February", -1.5686159179138452),
+                                    ("month", -0.8266785731844679),
+                                    ("integer (numeric)November", -2.2617630984737906),
+                                    ("integer (numeric)March", -3.1780538303479458)],
                                n = 20},
                    koData =
-                     ClassData{prior = -2.3978952727983707, unseen = -2.639057329615259,
+                     ClassData{prior = -3.044522437723423, unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)August", -1.8718021769015913),
-                                    ("month", -1.466337068793427),
-                                    ("integer (numeric)July", -1.8718021769015913)],
-                               n = 2}}),
+                                   [("integer (numeric)May", -1.6094379124341003),
+                                    ("month", -1.6094379124341003)],
+                               n = 1}}),
        ("this|next <day-of-week>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.1354942159291497,
@@ -2084,11 +2185,13 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("three",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                     ClassData{prior = -0.1670540846631662,
+                               unseen = -2.5649493574615367,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 11},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -1.8718021769015913,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
        ("ordinal (digits)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.4011973816621555,
@@ -2132,6 +2235,15 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("lato",
+        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}}),
        ("morning",
         Classifier{okData =
                      ClassData{prior = -0.7731898882334817,
@@ -2153,6 +2265,13 @@
                                      -0.6931471805599453),
                                     ("hour", -0.6931471805599453)],
                                n = 2}}),
+       ("Women'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}}),
        ("week-end",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -2195,12 +2314,13 @@
                                n = 22}}),
        ("day (grain)",
         Classifier{okData =
-                     ClassData{prior = -0.12783337150988489,
+                     ClassData{prior = -0.20479441264601328,
                                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}}),
+                     ClassData{prior = -1.6863989535702288,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
        ("9th ordinal",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -2262,35 +2382,34 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = -0.6286086594223742, unseen = -3.912023005428146,
+                     ClassData{prior = -0.5389965007326869, unseen = -3.784189633918261,
                                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},
+                                   [("Thursday", -3.068052935133617), ("zima", -2.662587827025453),
+                                    ("Wednesday", -3.068052935133617),
+                                    ("Saturday", -3.068052935133617),
+                                    ("Monday", -3.068052935133617), ("Friday", -3.068052935133617),
+                                    ("day", -1.276293465905562), ("Sunday", -3.068052935133617),
+                                    ("hour", -2.374905754573672), ("Tuesday", -3.068052935133617),
+                                    ("lato", -2.662587827025453), ("week-end", -2.374905754573672)],
+                               n = 14},
                    koData =
-                     ClassData{prior = -0.7621400520468967, unseen = -3.828641396489095,
+                     ClassData{prior = -0.8754687373538999, unseen = -3.58351893845611,
                                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}}),
+                                   [("April", -2.456735772821304),
+                                    ("February", -1.3581234841531944),
+                                    ("month", -1.157452788691043)],
+                               n = 10}}),
        ("<named-month> <day-of-month> (ordinal)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
diff --git a/Duckling/Ranking/Classifiers/PT_XX.hs b/Duckling/Ranking/Classifiers/PT_XX.hs
--- a/Duckling/Ranking/Classifiers/PT_XX.hs
+++ b/Duckling/Ranking/Classifiers/PT_XX.hs
@@ -83,1357 +83,1817 @@
                                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.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Ter\231a-feira", -1.5040773967762742),
-                                    ("Domingo", -1.0986122886681098), ("day", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               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}}),
-       ("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}}),
-       ("Julho",
-        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 `da` or `de`",
-        Classifier{okData =
-                     ClassData{prior = -1.8325814637483102, unseen = -4.736198448394496,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.9356283494842854),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
-                                     -4.034240638152395),
-                                    ("<day-of-month> de <named-month>intersect",
-                                     -4.034240638152395),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
-                                     -4.034240638152395),
-                                    ("dayday", -3.34109345759245),
-                                    ("Quart-feira<cycle> (que vem)", -4.034240638152395),
-                                    ("dayyear", -2.088330489097082),
-                                    ("dd-dd <month>(interval)year", -4.034240638152395),
-                                    ("day of month (1st)Mar\231o", -3.34109345759245),
-                                    ("two time tokens separated by \",\"2year", -3.628775530044231),
-                                    ("intersectyear", -4.034240638152395),
-                                    ("<day-of-month> de <named-month>year", -2.6479462770325046),
-                                    ("dia <day-of-month> (non ordinal)Fevereiro",
-                                     -3.628775530044231),
-                                    ("two time tokens separated by \",\"year", -3.628775530044231),
-                                    ("Domingo<cycle> passado", -4.034240638152395),
-                                    ("dayweek", -3.34109345759245),
-                                    ("Quart-feiraproximo <cycle> ", -4.034240638152395)],
-                               n = 24},
-                   koData =
-                     ClassData{prior = -0.1743533871447778, unseen = -5.762051382780177,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)<datetime> - <datetime> (interval)",
-                                     -4.660289485209171),
-                                    ("hourday", -2.9256884298210646),
-                                    ("year (latent)Abril", -4.660289485209171),
-                                    ("year (latent)Julho", -3.967142304649226),
-                                    ("time-of-day (latent)Fevereiro", -3.8129916248219673),
-                                    ("monthday", -4.37260741275739),
-                                    ("monthyear", -3.561677196541061),
-                                    ("yearhour", -3.6794602321974446),
-                                    ("houryear", -3.119844444262022),
-                                    ("year (latent)Maio", -4.149463861443181),
-                                    ("time-of-day (latent)two time tokens separated by \",\"2",
-                                     -4.660289485209171),
-                                    ("Setembroyear", -3.967142304649226),
-                                    ("time-of-day (latent)Setembro", -3.967142304649226),
-                                    ("time-of-day (latent)intersect", -3.119844444262022),
-                                    ("year (latent)<time-of-day> <part-of-day>",
-                                     -5.065754593317335),
-                                    ("\224s <time-of-day>Julho", -5.065754593317335),
-                                    ("year (latent)intersect", -4.37260741275739),
-                                    ("Setembrointersect", -5.065754593317335),
-                                    ("intersect by `da` or `de`two time tokens separated by \",\"",
-                                     -5.065754593317335),
-                                    ("year (latent)amanh\227 pela <part-of-day>",
-                                     -5.065754593317335),
-                                    ("hourmonth", -1.8877007629693896),
-                                    ("time-of-day (latent)intersect by `da` or `de`",
-                                     -3.2739951240892804),
-                                    ("monthmonth", -5.065754593317335),
-                                    ("Setembrotwo time tokens separated by \",\"2",
-                                     -5.065754593317335),
-                                    ("year (latent)Fevereiro", -3.8129916248219673),
-                                    ("time-of-day (latent)Dezembro", -5.065754593317335),
-                                    ("dayyear", -5.065754593317335),
-                                    ("time-of-day (latent)Julho", -4.149463861443181),
-                                    ("time-of-day (latent)Abril", -4.660289485209171),
-                                    ("de <datetime> - <datetime> (interval)Janeiro",
-                                     -5.065754593317335),
-                                    ("year (latent)<dim time> da manha", -5.065754593317335),
-                                    ("time-of-day (latent)Mar\231o", -3.967142304649226),
-                                    ("year (latent)Janeiro", -5.065754593317335),
-                                    ("year (latent)Dezembro", -5.065754593317335),
-                                    ("yearmonth", -2.3577043922151253),
-                                    ("two time tokens separated by \",\"2year", -4.660289485209171),
-                                    ("Setembrotwo time tokens separated by \",\"",
-                                     -5.065754593317335),
-                                    ("intersect by `da` or `de`intersect", -5.065754593317335),
-                                    ("intersectyear", -5.065754593317335),
-                                    ("intersect by `da` or `de`two time tokens separated by \",\"2",
-                                     -5.065754593317335),
-                                    ("time-of-day (latent)Maio", -4.149463861443181),
-                                    ("<day-of-month> de <named-month>year", -5.065754593317335),
-                                    ("Maioyear", -4.660289485209171),
-                                    ("year (latent)Setembro", -3.967142304649226),
-                                    ("\224s <time-of-day>Janeiro", -5.065754593317335),
-                                    ("two time tokens separated by \",\"year", -4.660289485209171),
-                                    ("time-of-day (latent)two time tokens separated by \",\"",
-                                     -4.660289485209171),
-                                    ("intersect by `da` or `de`year", -3.561677196541061),
-                                    ("year (latent)<datetime> - <datetime> (interval)",
-                                     -4.660289485209171),
-                                    ("yearday", -5.065754593317335),
-                                    ("time-of-day (latent)Janeiro", -5.065754593317335),
-                                    ("Julhoyear", -5.065754593317335),
-                                    ("year (latent)Mar\231o", -3.967142304649226)],
-                               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.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearSexta-feira", -2.917770732084279),
-                                    ("dayday", -1.3083328196501787),
-                                    ("de <year>Sexta-feira", -2.917770732084279),
-                                    ("Sexta-feiraintersect", -2.512305623976115),
-                                    ("intersectSexta-feira", -2.917770732084279),
-                                    ("Sexta-feira<day-of-month> de <named-month>",
-                                     -2.512305623976115),
-                                    ("Sexta-feiraintersect by `da` or `de`", -2.512305623976115),
-                                    ("intersect by `da` or `de`Sexta-feira", -2.917770732084279),
-                                    ("yearday", -2.512305623976115),
-                                    ("Segunda-feira<day-of-month> de <named-month>",
-                                     -2.917770732084279)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -0.4382549309311553, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -2.3978952727983707),
-                                    ("dayhour", -1.5224265354444706),
-                                    ("daymonth", -2.6210388241125804),
-                                    ("monthday", -2.908720896564361),
-                                    ("Segunda-feiraintersect by `da` or `de`", -2.908720896564361),
-                                    ("Sexta-feiraintersect", -2.908720896564361),
-                                    ("intersectSexta-feira", -2.908720896564361),
-                                    ("Sexta-feiraintersect by `da` or `de`", -1.6094379124341003),
-                                    ("intersect by `da` or `de`Sexta-feira", -2.3978952727983707)],
-                               n = 20}}),
-       ("Sexta-feira",
-        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 (0..19)",
-        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}}),
-       ("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.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)Fevereiro", -2.228477120840324),
-                                    ("integer (numeric)Mar\231o", -3.0757749812275272),
-                                    ("integer (0..19)Maio", -3.0757749812275272),
-                                    ("integer (numeric)Abril", -3.481240089335692),
-                                    ("integer (numeric)Julho", -3.481240089335692),
-                                    ("integer (numeric)Dezembro", -3.481240089335692),
-                                    ("integer (numeric)Janeiro", -3.481240089335692),
-                                    ("month", -0.878550403891308),
-                                    ("integer (0..19)Julho", -3.481240089335692),
-                                    ("integer (0..19)Abril", -3.481240089335692),
-                                    ("integer (numeric)Maio", -3.0757749812275272),
-                                    ("integer (0..19)Mar\231o", -2.7880929087757464),
-                                    ("integer (numeric)Setembro", -2.382627800667582)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -2.639057329615259, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)Julho", -1.7346010553881064),
-                                    ("month", -1.7346010553881064)],
-                               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),
-                                    ("Fevereiromorning", -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),
-                                    ("Dezembrotime-of-day (latent)", -2.1972245773362196),
-                                    ("Dezembro<day-of-month> de <named-month>",
-                                     -2.1972245773362196),
-                                    ("Dezembroyear (latent)", -2.1972245773362196),
-                                    ("Dezembrointersect by `da` or `de`", -1.791759469228055)],
-                               n = 5}}),
-       ("Maio",
-        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}}),
-       ("number (21..29 31..39 .. 91..99)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("tens (20..90)integer (0..19)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<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.14166355650266,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> de <named-month>in the <part-of-day>",
-                                     -4.037186148382152),
-                                    ("dayhour", -2.3632097148104805),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
-                                     -4.442651256490317),
-                                    ("nowquinze para as <hour-of-day> (as relative minutes)",
-                                     -4.442651256490317),
-                                    ("Quart-feiraamanh\227 pela <part-of-day>", -4.442651256490317),
-                                    ("now\224s <time-of-day>", -4.037186148382152),
-                                    ("<day-of-month> de <named-month>intersect",
-                                     -4.442651256490317),
-                                    ("now<hour-of-day> and 3/4", -4.442651256490317),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
-                                     -4.442651256490317),
-                                    ("Segunda-feirain the <part-of-day>", -4.442651256490317),
-                                    ("Quart-feira<time-of-day> <part-of-day>", -4.442651256490317),
-                                    ("yearSexta-feira", -4.442651256490317),
-                                    ("dayday", -2.9385738597140425),
-                                    ("hourhour", -4.442651256490317),
-                                    ("dayyear", -2.4277482359480516),
-                                    ("de <year>Sexta-feira", -4.442651256490317),
-                                    ("minutehour", -3.1898882879949486),
-                                    ("<hour-of-day> and quinzein the <part-of-day>",
-                                     -4.037186148382152),
-                                    ("intersect by `da` or `de`in the <part-of-day>",
-                                     -4.037186148382152),
-                                    ("now<hour-of-day> and <relative minutes>", -4.442651256490317),
-                                    ("tomorrow<time-of-day> horas", -4.037186148382152),
-                                    ("now<integer> para as <hour-of-day> (as relative minutes)",
-                                     -4.442651256490317),
-                                    ("\224s <time-of-day>in the <part-of-day>",
-                                     -3.7495040759303713),
-                                    ("Sexta-feiraintersect", -4.442651256490317),
-                                    ("dayminute", -3.1898882879949486),
-                                    ("intersectSexta-feira", -4.442651256490317),
-                                    ("Sexta-feira<day-of-month> de <named-month>",
-                                     -4.442651256490317),
-                                    ("dd-dd <month>(interval)de <year>", -4.442651256490317),
-                                    ("Sexta-feiraintersect by `da` or `de`", -4.442651256490317),
-                                    ("intersect by `da` or `de`Sexta-feira", -4.442651256490317),
-                                    ("dia <day-of-month> de <named-month>in the <part-of-day>",
-                                     -4.037186148382152),
-                                    ("yearday", -4.037186148382152),
-                                    ("two time tokens separated by \",\"de <year>",
-                                     -4.037186148382152),
-                                    ("dd[/-]mmyear", -4.442651256490317),
-                                    ("Quart-feira\224s <time-of-day>", -4.442651256490317),
-                                    ("<day-of-month> de <named-month>de <year>",
-                                     -3.056356895370426),
-                                    ("Quart-feira<dim time> da manha", -4.442651256490317),
-                                    ("tomorrowdepois das <time-of-day>", -4.037186148382152),
-                                    ("<hour-of-day> and <relative minutes>in the <part-of-day>",
-                                     -4.037186148382152),
-                                    ("two time tokens separated by \",\"2de <year>",
-                                     -4.037186148382152),
-                                    ("intersectde <year>", -4.442651256490317)],
-                               n = 52},
-                   koData =
-                     ClassData{prior = -0.6836684366054016, unseen = -5.153291594497779,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -2.9502698994772336),
-                                    ("dayhour", -3.068052935133617),
-                                    ("daymonth", -4.454347296253507),
-                                    ("monthday", -3.355735007585398),
-                                    ("monthyear", -2.9502698994772336),
-                                    ("now\224s <time-of-day>", -4.048882188145344),
-                                    ("houryear", -2.5084371471981943),
-                                    ("Dezembro\224s <time-of-day>", -4.454347296253507),
-                                    ("<time-of-day> am|pm<day-of-month> de <named-month>",
-                                     -4.454347296253507),
-                                    ("Fevereiroin the <part-of-day>", -4.048882188145344),
-                                    ("monthhour", -3.2015843277581397),
-                                    ("Setembrointersect", -4.454347296253507),
-                                    ("intersect by `da` or `de`two time tokens separated by \",\"",
-                                     -4.454347296253507),
-                                    ("hourmonth", -4.454347296253507),
-                                    ("Julhode <year>", -4.454347296253507),
-                                    ("<time-of-day> am|pmintersect by `da` or `de`",
-                                     -4.454347296253507),
-                                    ("Setembrotwo time tokens separated by \",\"2",
-                                     -4.454347296253507),
-                                    ("dayyear", -4.454347296253507),
-                                    ("intersect by `da` or `de`\224s <time-of-day>",
-                                     -4.454347296253507),
-                                    ("intersect by `da` or `de`in the <part-of-day>",
-                                     -4.048882188145344),
-                                    ("Setembrode <year>", -3.355735007585398),
-                                    ("now<hour-of-day> and <relative minutes>", -4.454347296253507),
-                                    ("daysecond", -4.454347296253507),
-                                    ("Ter\231a-feiraright now", -4.454347296253507),
-                                    ("Sexta-feiraintersect", -4.454347296253507),
-                                    ("dayminute", -4.048882188145344),
-                                    ("Setembrotwo time tokens separated by \",\"",
-                                     -4.454347296253507),
-                                    ("intersect by `da` or `de`intersect", -4.454347296253507),
-                                    ("intersectSexta-feira", -4.048882188145344),
-                                    ("intersect by `da` or `de`two time tokens separated by \",\"2",
-                                     -4.454347296253507),
-                                    ("Sexta-feiraintersect by `da` or `de`", -3.355735007585398),
-                                    ("intersect by `da` or `de`Sexta-feira", -3.5380565643793527),
-                                    ("two time tokens separated by \",\"de <year>",
-                                     -4.048882188145344),
-                                    ("intersect by `da` or `de`de <year>", -2.9502698994772336),
-                                    ("<day-of-month> de <named-month>\224s <time-of-day>",
-                                     -4.454347296253507),
-                                    ("Maiode <year>", -4.048882188145344),
-                                    ("<day-of-month> de <named-month>de <year>",
-                                     -4.454347296253507),
-                                    ("two time tokens separated by \",\"2de <year>",
-                                     -4.048882188145344),
-                                    ("intersectde <year>", -4.454347296253507)],
-                               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.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearSexta-feira", -2.917770732084279),
-                                    ("dayday", -1.3083328196501787),
-                                    ("de <year>Sexta-feira", -2.917770732084279),
-                                    ("Sexta-feiraintersect", -2.512305623976115),
-                                    ("intersectSexta-feira", -2.917770732084279),
-                                    ("Sexta-feira<day-of-month> de <named-month>",
-                                     -2.512305623976115),
-                                    ("Sexta-feiraintersect by `da` or `de`", -2.512305623976115),
-                                    ("intersect by `da` or `de`Sexta-feira", -2.917770732084279),
-                                    ("yearday", -2.512305623976115),
-                                    ("Segunda-feira<day-of-month> de <named-month>",
-                                     -2.917770732084279)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -0.4382549309311553, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -2.3978952727983707),
-                                    ("dayhour", -1.5224265354444706),
-                                    ("daymonth", -2.6210388241125804),
-                                    ("monthday", -2.908720896564361),
-                                    ("Segunda-feiraintersect by `da` or `de`", -2.908720896564361),
-                                    ("Sexta-feiraintersect", -2.908720896564361),
-                                    ("intersectSexta-feira", -2.908720896564361),
-                                    ("Sexta-feiraintersect by `da` or `de`", -1.6094379124341003),
-                                    ("intersect by `da` or `de`Sexta-feira", -2.3978952727983707)],
-                               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),
-                                    ("integer (0..19)", -1.0116009116784799),
-                                    ("negative numbers", -3.0910424533583156),
-                                    ("tens (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),
-                                    ("Domingo", -1.252762968495368), ("day", -0.8472978603872037)],
-                               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),
-                                    ("Fevereiromorning", -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}}),
-       ("Segunda-feira",
-        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}}),
-       ("Fevereiro",
-        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}}),
-       ("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}}),
-       ("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)Fevereiro", -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}}),
-       ("Ter\231a-feira",
-        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}}),
-       ("Domingo",
-        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}}),
-       ("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}}),
-       ("dd-dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julho", -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),
-                                    ("integer (0..19)noon", -1.0116009116784799),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               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),
-                                    ("Fevereiro", -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}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
-       ("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}}),
-       ("Janeiro",
-        Classifier{okData =
-                     ClassData{prior = 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.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}}),
-       ("Dezembro",
-        Classifier{okData =
-                     ClassData{prior = 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 (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.9328200338253656, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.0986122886681098),
-                                    ("integer (0..19)", -0.46262352194811296)],
-                               n = 24},
-                   koData =
-                     ClassData{prior = -0.4999559515290868, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.5108256237659907),
-                                    ("integer (0..19)", -1.0498221244986778),
-                                    ("tens (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>tens (20..90)", -2.5902671654458267),
-                                    ("time-of-day (latent)integer (0..19)", -2.0794415416798357),
-                                    ("time-of-day (latent)tens (20..90)", -2.5902671654458267),
-                                    ("nooninteger (0..19)", -2.995732273553991),
-                                    ("time-of-day (latent)number (21..29 31..39 .. 91..99)",
-                                     -2.5902671654458267),
-                                    ("hour", -0.8556661100577202),
-                                    ("\224s <time-of-day>number (21..29 31..39 .. 91..99)",
-                                     -2.5902671654458267),
-                                    ("\224s <time-of-day>integer (0..19)", -2.3025850929940455)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.4350845252893227,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224s <time-of-day>tens (20..90)", -1.791759469228055),
-                                    ("time-of-day (latent)integer (0..19)", -2.1972245773362196),
-                                    ("time-of-day (latent)tens (20..90)", -1.791759469228055),
-                                    ("hour", -1.0986122886681098)],
-                               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
-                                   [("number (21..29 31..39 .. 91..99)hora (grain)",
-                                     -3.4657359027997265),
-                                    ("week", -2.772588722239781),
-                                    ("integer (0..19)segundo (grain)", -3.4657359027997265),
-                                    ("integer (numeric)hora (grain)", -3.4657359027997265),
-                                    ("integer (numeric)dia (grain)", -3.4657359027997265),
-                                    ("integer (0..19)ano (grain)", -3.0602707946915624),
-                                    ("second", -3.4657359027997265),
-                                    ("integer (0..19)semana (grain)", -2.772588722239781),
-                                    ("integer (numeric)ano (grain)", -3.4657359027997265),
-                                    ("integer (0..19)mes (grain)", -3.0602707946915624),
-                                    ("integer (0..19)hora (grain)", -2.772588722239781),
-                                    ("integer (numeric)minutos (grain)", -2.772588722239781),
-                                    ("day", -3.0602707946915624), ("year", -2.772588722239781),
-                                    ("integer (0..19)minutos (grain)", -3.0602707946915624),
-                                    ("hour", -2.367123614131617), ("month", -3.0602707946915624),
-                                    ("minute", -2.367123614131617),
-                                    ("integer (0..19)dia (grain)", -3.4657359027997265)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -0.7444404749474959, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("integer (numeric)hora (grain)", -2.70805020110221),
-                                    ("integer (numeric)dia (grain)", -2.995732273553991),
-                                    ("integer (0..19)ano (grain)", -3.4011973816621555),
-                                    ("integer (numeric)mes (grain)", -3.4011973816621555),
-                                    ("second", -2.995732273553991),
-                                    ("integer (0..19)semana (grain)", -3.4011973816621555),
-                                    ("integer (numeric)semana (grain)", -3.4011973816621555),
-                                    ("integer (numeric)ano (grain)", -2.995732273553991),
-                                    ("integer (0..19)mes (grain)", -2.995732273553991),
-                                    ("integer (0..19)hora (grain)", -2.995732273553991),
-                                    ("integer (numeric)minutos (grain)", -2.995732273553991),
-                                    ("day", -2.995732273553991),
-                                    ("integer (numeric)segundo (grain)", -2.995732273553991),
-                                    ("year", -2.70805020110221), ("hour", -2.3025850929940455),
-                                    ("month", -2.70805020110221), ("minute", -2.995732273553991)],
-                               n = 19}}),
-       ("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),
-                                    ("integer (0..19)ano (grain)", -2.4849066497880004),
-                                    ("second", -2.4849066497880004),
-                                    ("integer (0..19)mes (grain)", -2.4849066497880004),
-                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
-                                    ("day", -2.4849066497880004),
-                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
-                                    ("year", -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}}),
-       ("Quart-feira",
-        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}}),
-       ("Quinta-feira",
-        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}}),
-       ("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),
-                                    ("Quart-feira", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Setembro",
-        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}}),
-       ("<part-of-day> dessa semana",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Ter\231a-feira", -0.6931471805599453),
-                                    ("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),
-                                    ("integer (0..19)mes (grain)", -1.791759469228055),
-                                    ("year", -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}}),
-       ("negative numbers",
-        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}}),
-       ("<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),
-                                    ("Dezembro<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),
-                                    ("Dezembrointersect by `da` or `de`", -2.538973871058276),
-                                    ("dd[/-]mmyear", -2.9444389791664407)],
-                               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}}),
-       ("Mar\231o",
-        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}}),
-       ("tens (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}}),
-       ("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.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Segunda-feira", -1.6582280766035324),
-                                    ("Ter\231a-feira", -1.0986122886681098),
-                                    ("day", -0.7419373447293773)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               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,
+                     ClassData{prior = 0.0, unseen = -4.430816798843313,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 82},
+                   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.23299584775722143,
+                               unseen = -5.318119993844216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 202},
+                   koData =
+                     ClassData{prior = -1.5709716316063043, unseen = -4.007333185232471,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 53}}),
+       ("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.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Ter\231a-feira", -1.5040773967762742),
+                                    ("Domingo", -1.0986122886681098), ("day", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> <cycle> <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.121230377255882, unseen = -5.393627546352362,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.4378280112350734),
+                                    ("ordinals (1..10)mes (grain)year", -2.61648300757672),
+                                    ("ordinals (1..10)trimestre (grain)de <year>",
+                                     -1.7781538171722764),
+                                    ("quarteryear", -1.4378280112350734),
+                                    ("ordinals (1..10)mes (grain)de <year>", -1.8055527913603908),
+                                    ("ordinals (11..19)mes (grain)de <year>", -4.695924549256556),
+                                    ("ordinals (1..10)trimestre (grain)year", -2.61648300757672)],
+                               n = 102},
+                   koData =
+                     ClassData{prior = -0.39434505706408673,
+                               unseen = -6.082218910376446,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -5.3867860145356445),
+                                    ("quarterquarter", -1.227902931175973),
+                                    ("monthmonth", -1.6491163962522766),
+                                    ("ordinals (1..10)mes (grain)<datetime> - <datetime> (interval)",
+                                     -2.49641425663948),
+                                    ("ordinals (1..10)mes (grain)entre <datetime> e <datetime> (interval)",
+                                     -2.5245851336061764),
+                                    ("ordinals (1..10)trimestre (grain)intersect",
+                                     -2.9888907417372743),
+                                    ("ordinals (1..10)mes (grain)de <year>", -5.3867860145356445),
+                                    ("ordinals (1..10)trimestre (grain)<datetime> - <datetime> (interval)",
+                                     -2.0545815043604407),
+                                    ("ordinals (1..10)trimestre (grain)entre <datetime> e <datetime> (interval)",
+                                     -2.128689476514163),
+                                    ("ordinals (1..10)mes (grain)intersect", -3.37188299399338)],
+                               n = 211}}),
+       ("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}}),
+       ("proximo <cycle> ",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("semana (grain)", -1.791759469228055),
+                                    ("mes (grain)", -2.1972245773362196),
+                                    ("quarter", -2.1972245773362196), ("year", -2.1972245773362196),
+                                    ("ano (grain)", -2.1972245773362196),
+                                    ("trimestre (grain)", -2.1972245773362196),
+                                    ("month", -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135),
+                                    ("semana (grain)", -1.9459101490553135),
+                                    ("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("ano (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               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}}),
+       ("Julho",
+        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}}),
+       ("intersect by `da` or `de`",
+        Classifier{okData =
+                     ClassData{prior = -1.9568392195875037,
+                               unseen = -4.8283137373023015,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -3.028522096376982),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
+                                     -4.127134385045092),
+                                    ("<day-of-month> de <named-month>intersect",
+                                     -4.127134385045092),
+                                    ("dd-dd <month> de (interval)year", -4.127134385045092),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
+                                     -4.127134385045092),
+                                    ("dayday", -3.4339872044851463),
+                                    ("Quart-feira<cycle> (que vem)", -4.127134385045092),
+                                    ("dayyear", -2.1122313645028266),
+                                    ("quarteryear", -4.127134385045092),
+                                    ("dd-dd <month>(interval)year", -4.127134385045092),
+                                    ("<ordinal> trimestreyear", -4.127134385045092),
+                                    ("day of month (1st)Mar\231o", -3.4339872044851463),
+                                    ("two time tokens separated by \",\"2year", -3.721669276936927),
+                                    ("intersectyear", -4.127134385045092),
+                                    ("<day-of-month> de <named-month>year", -2.740840023925201),
+                                    ("dia <day-of-month> (non ordinal)Fevereiro",
+                                     -3.721669276936927),
+                                    ("two time tokens separated by \",\"year", -3.721669276936927),
+                                    ("Domingo<cycle> passado", -4.127134385045092),
+                                    ("dayweek", -3.4339872044851463),
+                                    ("Quart-feiraproximo <cycle> ", -4.127134385045092)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -0.15234072458201878,
+                               unseen = -5.963579343618447,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)<datetime> - <datetime> (interval)",
+                                     -4.862393050955164),
+                                    ("hourday", -3.1277919955670574),
+                                    ("year (latent)Abril", -4.862393050955164),
+                                    ("year (latent)Julho", -3.396055982161737),
+                                    ("time-of-day (latent)Fevereiro", -4.01509519056796),
+                                    ("monthday", -4.574710978503383),
+                                    ("monthyear", -3.6584202466292277),
+                                    ("yearhour", -3.8815637979434374),
+                                    ("entre <datetime> e <datetime> (interval)Julho",
+                                     -3.6584202466292277),
+                                    ("houryear", -3.3219480100080148),
+                                    ("year (latent)Maio", -4.351567427189173),
+                                    ("time-of-day (latent)two time tokens separated by \",\"2",
+                                     -4.862393050955164),
+                                    ("Setembroyear", -4.169245870395218),
+                                    ("time-of-day (latent)Setembro", -4.169245870395218),
+                                    ("time-of-day (latent)intersect", -3.3219480100080148),
+                                    ("year (latent)<time-of-day> <part-of-day>",
+                                     -5.267858159063328),
+                                    ("\224s <time-of-day>Julho", -4.574710978503383),
+                                    ("year (latent)intersect", -4.574710978503383),
+                                    ("Setembrointersect", -5.267858159063328),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"",
+                                     -5.267858159063328),
+                                    ("year (latent)amanh\227 pela <part-of-day>",
+                                     -5.267858159063328),
+                                    ("hourmonth", -1.7713505975968478),
+                                    ("time-of-day (latent)intersect by `da` or `de`",
+                                     -3.4760986898352733),
+                                    ("monthmonth", -5.267858159063328),
+                                    ("Setembrotwo time tokens separated by \",\"2",
+                                     -5.267858159063328),
+                                    ("year (latent)Fevereiro", -4.01509519056796),
+                                    ("time-of-day (latent)Dezembro", -5.267858159063328),
+                                    ("dayyear", -5.267858159063328),
+                                    ("time-of-day (latent)Julho", -3.563110066824903),
+                                    ("time-of-day (latent)Abril", -4.862393050955164),
+                                    ("passado <cycle>year", -5.267858159063328),
+                                    ("year (latent)<dim time> da manha", -5.267858159063328),
+                                    ("time-of-day (latent)Mar\231o", -4.169245870395218),
+                                    ("year (latent)Janeiro", -5.267858159063328),
+                                    ("year (latent)Dezembro", -5.267858159063328),
+                                    ("entre <datetime> e <datetime> (interval)Janeiro",
+                                     -5.267858159063328),
+                                    ("yearmonth", -2.1998052239297112),
+                                    ("two time tokens separated by \",\"2year", -4.862393050955164),
+                                    ("Setembrotwo time tokens separated by \",\"",
+                                     -5.267858159063328),
+                                    ("intersect by `da` or `de`intersect", -5.267858159063328),
+                                    ("intersectyear", -5.267858159063328),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"2",
+                                     -5.267858159063328),
+                                    ("time-of-day (latent)Maio", -4.351567427189173),
+                                    ("<day-of-month> de <named-month>year", -5.267858159063328),
+                                    ("antes das <time-of-day>Julho", -4.01509519056796),
+                                    ("Maioyear", -4.862393050955164),
+                                    ("year (latent)Setembro", -4.169245870395218),
+                                    ("\224s <time-of-day>Janeiro", -5.267858159063328),
+                                    ("two time tokens separated by \",\"year", -4.862393050955164),
+                                    ("time-of-day (latent)two time tokens separated by \",\"",
+                                     -4.862393050955164),
+                                    ("intersect by `da` or `de`year", -3.763780762287054),
+                                    ("year (latent)<datetime> - <datetime> (interval)",
+                                     -4.862393050955164),
+                                    ("yearday", -5.267858159063328),
+                                    ("time-of-day (latent)Janeiro", -5.267858159063328),
+                                    ("Julhoyear", -5.267858159063328),
+                                    ("de <datetime> - <datetime> (interval)Julho",
+                                     -5.267858159063328),
+                                    ("year (latent)Mar\231o", -4.169245870395218)],
+                               n = 158}}),
+       ("<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.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   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.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearSexta-feira", -2.917770732084279),
+                                    ("dayday", -1.3083328196501787),
+                                    ("de <year>Sexta-feira", -2.917770732084279),
+                                    ("Sexta-feiraintersect", -2.512305623976115),
+                                    ("intersectSexta-feira", -2.917770732084279),
+                                    ("Sexta-feira<day-of-month> de <named-month>",
+                                     -2.512305623976115),
+                                    ("Sexta-feiraintersect by `da` or `de`", -2.512305623976115),
+                                    ("intersect by `da` or `de`Sexta-feira", -2.917770732084279),
+                                    ("yearday", -2.512305623976115),
+                                    ("Segunda-feira<day-of-month> de <named-month>",
+                                     -2.917770732084279)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.4382549309311553, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.3978952727983707),
+                                    ("dayhour", -1.5224265354444706),
+                                    ("daymonth", -2.6210388241125804),
+                                    ("monthday", -2.908720896564361),
+                                    ("Segunda-feiraintersect by `da` or `de`", -2.908720896564361),
+                                    ("Sexta-feiraintersect", -2.908720896564361),
+                                    ("intersectSexta-feira", -2.908720896564361),
+                                    ("Sexta-feiraintersect by `da` or `de`", -1.6094379124341003),
+                                    ("intersect by `da` or `de`Sexta-feira", -2.3978952727983707)],
+                               n = 20}}),
+       ("Sexta-feira",
+        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 (0..19)",
+        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}}),
+       ("desde <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)Julho",
+                                     -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> de <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2682639865946794, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Fevereiro", -2.228477120840324),
+                                    ("integer (numeric)Mar\231o", -3.0757749812275272),
+                                    ("integer (0..19)Maio", -3.0757749812275272),
+                                    ("integer (numeric)Abril", -3.481240089335692),
+                                    ("integer (numeric)Julho", -3.481240089335692),
+                                    ("integer (numeric)Dezembro", -3.481240089335692),
+                                    ("integer (numeric)Janeiro", -3.481240089335692),
+                                    ("month", -0.878550403891308),
+                                    ("integer (0..19)Julho", -3.481240089335692),
+                                    ("integer (0..19)Abril", -3.481240089335692),
+                                    ("integer (numeric)Maio", -3.0757749812275272),
+                                    ("integer (0..19)Mar\231o", -2.7880929087757464),
+                                    ("integer (numeric)Setembro", -2.382627800667582)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.4469189829363254,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Julho", -1.1700712526502546),
+                                    ("month", -1.1700712526502546)],
+                               n = 8}}),
+       ("<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),
+                                    ("Fevereiromorning", -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 = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("hourhour", -0.6931471805599453)],
+                               n = 2}}),
+       ("Maio",
+        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}}),
+       ("number (21..29 31..39 .. 91..99)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("tens (20..90)integer (0..19)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> <cycle> de <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -5.049856007249537,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.4325072042750222),
+                                    ("ordinals (1..10)mes (grain)year", -1.4599061784631366),
+                                    ("ordinals (11..19)mes (grain)year", -4.350277936359301),
+                                    ("quarteryear", -1.4325072042750222),
+                                    ("ordinals (1..10)trimestre (grain)year", -1.4325072042750222)],
+                               n = 72},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -5.429345628954441,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -4.7318028369214575),
+                                    ("ordinals (1..10)mes (grain)year", -4.7318028369214575),
+                                    ("quarterquarter", -1.2505627475857655),
+                                    ("monthmonth", -1.6407603835631415),
+                                    ("ordinals (1..10)mes (grain)<datetime> - <datetime> (interval)",
+                                     -1.9909628129962564),
+                                    ("ordinals (1..10)trimestre (grain)intersect",
+                                     -2.4292177439274116),
+                                    ("ordinals (1..10)trimestre (grain)<datetime> - <datetime> (interval)",
+                                     -1.5963086209923076),
+                                    ("ordinals (1..10)mes (grain)intersect", -2.785892687866144)],
+                               n = 108}}),
+       ("<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 = -1.281981514494508, unseen = -5.225746673713201,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> de <named-month>in the <part-of-day>",
+                                     -4.121743536410215),
+                                    ("dayhour", -2.4477671028385437),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
+                                     -4.527208644518379),
+                                    ("nowquinze para as <hour-of-day> (as relative minutes)",
+                                     -4.527208644518379),
+                                    ("Quart-feiraamanh\227 pela <part-of-day>", -4.527208644518379),
+                                    ("now\224s <time-of-day>", -4.121743536410215),
+                                    ("<day-of-month> de <named-month>intersect",
+                                     -4.527208644518379),
+                                    ("now<hour-of-day> and 3/4", -4.527208644518379),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
+                                     -4.527208644518379),
+                                    ("Segunda-feirain the <part-of-day>", -4.527208644518379),
+                                    ("Quart-feira<time-of-day> <part-of-day>", -4.527208644518379),
+                                    ("yearSexta-feira", -4.527208644518379),
+                                    ("dayday", -3.0231312477421053),
+                                    ("hourhour", -4.527208644518379),
+                                    ("dayyear", -2.512305623976115),
+                                    ("de <year>Sexta-feira", -4.527208644518379),
+                                    ("quarteryear", -4.527208644518379),
+                                    ("minutehour", -3.2744456760230114),
+                                    ("<hour-of-day> and quinzein the <part-of-day>",
+                                     -4.121743536410215),
+                                    ("intersect by `da` or `de`in the <part-of-day>",
+                                     -4.121743536410215),
+                                    ("now<hour-of-day> and <relative minutes>", -4.527208644518379),
+                                    ("tomorrow<time-of-day> horas", -4.121743536410215),
+                                    ("dd-dd <month> de (interval)de <year>", -4.527208644518379),
+                                    ("now<integer> para as <hour-of-day> (as relative minutes)",
+                                     -4.527208644518379),
+                                    ("\224s <time-of-day>in the <part-of-day>", -3.834061463958434),
+                                    ("Sexta-feiraintersect", -4.527208644518379),
+                                    ("dayminute", -3.2744456760230114),
+                                    ("<ordinal> trimestrede <year>", -4.527208644518379),
+                                    ("intersectSexta-feira", -4.527208644518379),
+                                    ("Sexta-feira<day-of-month> de <named-month>",
+                                     -4.527208644518379),
+                                    ("dd-dd <month>(interval)de <year>", -4.527208644518379),
+                                    ("Sexta-feiraintersect by `da` or `de`", -4.527208644518379),
+                                    ("intersect by `da` or `de`Sexta-feira", -4.527208644518379),
+                                    ("dia <day-of-month> de <named-month>in the <part-of-day>",
+                                     -4.121743536410215),
+                                    ("yearday", -4.121743536410215),
+                                    ("two time tokens separated by \",\"de <year>",
+                                     -4.121743536410215),
+                                    ("Quart-feira\224s <time-of-day>", -4.527208644518379),
+                                    ("<day-of-month> de <named-month>de <year>",
+                                     -3.1409142833984887),
+                                    ("Quart-feira<dim time> da manha", -4.527208644518379),
+                                    ("tomorrowdepois das <time-of-day>", -4.121743536410215),
+                                    ("<hour-of-day> and <relative minutes>in the <part-of-day>",
+                                     -4.121743536410215),
+                                    ("two time tokens separated by \",\"2de <year>",
+                                     -4.121743536410215),
+                                    ("intersectde <year>", -4.527208644518379)],
+                               n = 53},
+                   koData =
+                     ClassData{prior = -0.3250197428894252, unseen = -5.87493073085203,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.4742225166770453),
+                                    ("dayhour", -3.7926762477955798),
+                                    ("daymonth", -5.178970608915471),
+                                    ("monthday", -4.080358320247361),
+                                    ("monthyear", -3.4742225166770453),
+                                    ("now\224s <time-of-day>", -4.773505500807306),
+                                    ("entre <datetime> e <datetime> (interval)Julho",
+                                     -3.56953269648137),
+                                    ("houryear", -3.233060459860157),
+                                    ("Dezembro\224s <time-of-day>", -5.178970608915471),
+                                    ("\224s <time-of-day>Julho", -4.773505500807306),
+                                    ("<time-of-day> am|pm<day-of-month> de <named-month>",
+                                     -4.485823428355525),
+                                    ("Fevereiroin the <part-of-day>", -4.773505500807306),
+                                    ("de <year>antes das <time-of-day>", -2.4381305849902697),
+                                    ("monthhour", -3.9262076404201025),
+                                    ("Setembrointersect", -5.178970608915471),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"",
+                                     -5.178970608915471),
+                                    ("hourmonth", -3.3071684320138792),
+                                    ("Julhode <year>", -5.178970608915471),
+                                    ("<time-of-day> am|pmintersect by `da` or `de`",
+                                     -4.485823428355525),
+                                    ("Setembrotwo time tokens separated by \",\"2",
+                                     -5.178970608915471),
+                                    ("dayyear", -5.178970608915471),
+                                    ("intersect by `da` or `de`\224s <time-of-day>",
+                                     -5.178970608915471),
+                                    ("passado <cycle>year", -5.178970608915471),
+                                    ("de <year>o <ordinal> <cycle> de <time>", -4.773505500807306),
+                                    ("intersect by `da` or `de`in the <part-of-day>",
+                                     -4.773505500807306),
+                                    ("Setembrode <year>", -4.080358320247361),
+                                    ("now<hour-of-day> and <relative minutes>", -5.178970608915471),
+                                    ("yearmonth", -2.4381305849902697),
+                                    ("Ter\231a-feiraright now", -5.178970608915471),
+                                    ("Sexta-feiraintersect", -5.178970608915471),
+                                    ("dayminute", -4.773505500807306),
+                                    ("Setembrotwo time tokens separated by \",\"",
+                                     -5.178970608915471),
+                                    ("intersect by `da` or `de`intersect", -5.178970608915471),
+                                    ("intersectSexta-feira", -4.773505500807306),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"2",
+                                     -5.178970608915471),
+                                    ("yearo <ordinal> <cycle> de <time>", -4.773505500807306),
+                                    ("passado <cycle>de <year>", -5.178970608915471),
+                                    ("Sexta-feiraintersect by `da` or `de`", -4.080358320247361),
+                                    ("intersect by `da` or `de`Sexta-feira", -4.2626798770413155),
+                                    ("two time tokens separated by \",\"de <year>",
+                                     -4.773505500807306),
+                                    ("intersect by `da` or `de`de <year>", -3.6748932121391964),
+                                    ("<day-of-month> de <named-month>\224s <time-of-day>",
+                                     -5.178970608915471),
+                                    ("yearquarter", -2.158545722771108),
+                                    ("de <datetime> - <datetime> (interval)Julho",
+                                     -5.178970608915471),
+                                    ("daynograin", -5.178970608915471),
+                                    ("yearantes das <time-of-day>", -2.3457572648592544),
+                                    ("Maiode <year>", -4.773505500807306),
+                                    ("<day-of-month> de <named-month>de <year>",
+                                     -5.178970608915471),
+                                    ("two time tokens separated by \",\"2de <year>",
+                                     -4.773505500807306),
+                                    ("intersectde <year>", -5.178970608915471)],
+                               n = 138}}),
+       ("<ordinal> <cycle> de <year> - <ordinal> <cycle> de <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyearmonthyear", -1.3862943611198906),
+                                    ("ordinals (1..10)mes (grain)yearordinals (1..10)mes (grain)year",
+                                     -1.3862943611198906),
+                                    ("ordinals (1..10)trimestre (grain)yearordinals (1..10)trimestre (grain)year",
+                                     -1.3862943611198906),
+                                    ("quarteryearquarteryear", -1.3862943611198906)],
+                               n = 30},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("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.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearSexta-feira", -2.917770732084279),
+                                    ("dayday", -1.3083328196501787),
+                                    ("de <year>Sexta-feira", -2.917770732084279),
+                                    ("Sexta-feiraintersect", -2.512305623976115),
+                                    ("intersectSexta-feira", -2.917770732084279),
+                                    ("Sexta-feira<day-of-month> de <named-month>",
+                                     -2.512305623976115),
+                                    ("Sexta-feiraintersect by `da` or `de`", -2.512305623976115),
+                                    ("intersect by `da` or `de`Sexta-feira", -2.917770732084279),
+                                    ("yearday", -2.512305623976115),
+                                    ("Segunda-feira<day-of-month> de <named-month>",
+                                     -2.917770732084279)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.4382549309311553, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.3978952727983707),
+                                    ("dayhour", -1.5224265354444706),
+                                    ("daymonth", -2.6210388241125804),
+                                    ("monthday", -2.908720896564361),
+                                    ("Segunda-feiraintersect by `da` or `de`", -2.908720896564361),
+                                    ("Sexta-feiraintersect", -2.908720896564361),
+                                    ("intersectSexta-feira", -2.908720896564361),
+                                    ("Sexta-feiraintersect by `da` or `de`", -1.6094379124341003),
+                                    ("intersect by `da` or `de`Sexta-feira", -2.3978952727983707)],
+                               n = 20}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4135623183407838),
+                                    ("integer (0..19)", -1.3545456628053103),
+                                    ("negative numbers", -3.028522096376982),
+                                    ("tens (20..90)", -3.4339872044851463)],
+                               n = 58}}),
+       ("n[ao] <date>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dia <day-of-month> (non ordinal)", -1.252762968495368),
+                                    ("Domingo", -1.252762968495368), ("day", -0.8472978603872037)],
+                               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),
+                                    ("Fevereiromorning", -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}}),
+       ("Segunda-feira",
+        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}}),
+       ("Fevereiro",
+        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}}),
+       ("<ordinal> trimestre <year>",
+        Classifier{okData =
+                     ClassData{prior = -1.2499579175677595, unseen = -4.700480365792417,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (1..10)trimestre (grain)de <year>",
+                                     -1.080429969584919),
+                                    ("quarteryear", -0.7401041636477163),
+                                    ("ordinals (1..10)trimestre (grain)year", -1.9187591599893623)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -0.3375964638334939, unseen = -5.568344503761097,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterquarter", -0.7124901434030763),
+                                    ("ordinals (1..10)trimestre (grain)intersect",
+                                     -2.4734779539643776),
+                                    ("ordinals (1..10)trimestre (grain)<datetime> - <datetime> (interval)",
+                                     -1.539168716587544),
+                                    ("ordinals (1..10)trimestre (grain)entre <datetime> e <datetime> (interval)",
+                                     -1.6132766887412662)],
+                               n = 127}}),
+       ("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}}),
+       ("<ordinal> trimestre",
+        Classifier{okData =
+                     ClassData{prior = -2.871679624884012, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (1..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -5.826890812397576e-2,
+                               unseen = -4.634728988229636,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (1..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 50}}),
+       ("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)Fevereiro", -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}}),
+       ("passado <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.7621400520468967,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5686159179138452),
+                                    ("semana (grain)", -1.5686159179138452),
+                                    ("quarter", -2.0794415416798357),
+                                    ("trimestre (grain)", -2.0794415416798357),
+                                    ("hour", -2.4849066497880004),
+                                    ("hora (grain)", -2.4849066497880004)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.6286086594223742, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mes (grain)", -1.6486586255873816),
+                                    ("quarter", -2.159484249353372), ("year", -2.159484249353372),
+                                    ("ano (grain)", -2.159484249353372),
+                                    ("trimestre (grain)", -2.159484249353372),
+                                    ("month", -1.6486586255873816)],
+                               n = 8}}),
+       ("Ter\231a-feira",
+        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}}),
+       ("Domingo",
+        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}}),
+       ("antes das <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.691243082785829, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -2.03688192726104), ("noon", -2.03688192726104),
+                                    ("hour", -1.5260563034950494)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -7.020425867324857e-2,
+                               unseen = -4.836281906951478,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> <cycle> <time>", -2.120263536200091),
+                                    ("intersect by `da` or `de`", -2.8824035882469876),
+                                    ("<day-of-month> de <named-month>", -3.4420193761824103),
+                                    ("<ordinal> <cycle> de <time>", -2.2633643798407643),
+                                    ("year (latent)", -3.4420193761824103),
+                                    ("<ordinal> trimestre <year>", -2.7488721956224653),
+                                    ("<ordinal> trimestre", -2.7488721956224653),
+                                    ("day", -3.4420193761824103), ("quarter", -1.4961092271270973),
+                                    ("time-of-day (latent)", -3.4420193761824103),
+                                    ("year", -3.4420193761824103), ("hour", -2.8824035882469876),
+                                    ("month", -1.995100393246085)],
+                               n = 55}}),
+       ("dd-dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julho", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (11..19)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("ordinals (1..10)ordinals (1..10)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> passado",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135),
+                                    ("semana (grain)", -1.9459101490553135),
+                                    ("mes (grain)", -2.639057329615259),
+                                    ("quarter", -2.2335922215070942), ("year", -2.639057329615259),
+                                    ("ano (grain)", -2.639057329615259),
+                                    ("trimestre (grain)", -2.2335922215070942),
+                                    ("hour", -2.2335922215070942), ("month", -2.639057329615259),
+                                    ("hora (grain)", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.7047480922384253, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("ano (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               n = 2}}),
+       ("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 = -4.219507705176107,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 66},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (1..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -4.672828834461907,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 105},
+                   koData =
+                     ClassData{prior = -1.5040773967762742,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("<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),
+                                    ("integer (0..19)noon", -1.0116009116784799),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("o <ordinal> trimestre",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (1..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 4}}),
+       ("<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),
+                                    ("Fevereiro", -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}}),
+       ("n passados <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)mes (grain)", -1.3862943611198906),
+                                    ("integer (numeric)ano (grain)", -1.3862943611198906),
+                                    ("year", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> actual",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -0.6931471805599453),
+                                    ("trimestre (grain)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
+       ("passados n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)dia (grain)", -2.0794415416798357),
+                                    ("integer (numeric)mes (grain)", -1.6739764335716716),
+                                    ("integer (numeric)ano (grain)", -1.6739764335716716),
+                                    ("day", -2.0794415416798357), ("year", -1.6739764335716716),
+                                    ("month", -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> passados",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)mes (grain)", -1.3862943611198906),
+                                    ("integer (numeric)ano (grain)", -1.3862943611198906),
+                                    ("year", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Janeiro",
+        Classifier{okData =
+                     ClassData{prior = 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.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}}),
+       ("\250ltimo <cycle> <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.540445040947149),
+                                    ("trimestre (grain)year", -1.9459101490553135),
+                                    ("quarteryear", -1.540445040947149),
+                                    ("mes (grain)year", -1.9459101490553135),
+                                    ("trimestre (grain)de <year>", -1.9459101490553135),
+                                    ("mes (grain)de <year>", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dezembro",
+        Classifier{okData =
+                     ClassData{prior = 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 (latent)",
+        Classifier{okData =
+                     ClassData{prior = -1.2163953243244932, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("integer (0..19)", -0.46262352194811296)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -0.3513978868378886, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3101549283038396),
+                                    ("integer (0..19)", -1.455287232606842),
+                                    ("tens (20..90)", -3.4011973816621555)],
+                               n = 57}}),
+       ("<hour-of-day> and <relative minutes>",
+        Classifier{okData =
+                     ClassData{prior = -0.2719337154836418, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224s <time-of-day>tens (20..90)", -2.5902671654458267),
+                                    ("time-of-day (latent)integer (0..19)", -2.0794415416798357),
+                                    ("time-of-day (latent)tens (20..90)", -2.5902671654458267),
+                                    ("nooninteger (0..19)", -2.995732273553991),
+                                    ("time-of-day (latent)number (21..29 31..39 .. 91..99)",
+                                     -2.5902671654458267),
+                                    ("hour", -0.8556661100577202),
+                                    ("\224s <time-of-day>number (21..29 31..39 .. 91..99)",
+                                     -2.5902671654458267),
+                                    ("\224s <time-of-day>integer (0..19)", -2.3025850929940455)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -1.4350845252893227,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224s <time-of-day>tens (20..90)", -1.791759469228055),
+                                    ("time-of-day (latent)integer (0..19)", -2.1972245773362196),
+                                    ("time-of-day (latent)tens (20..90)", -1.791759469228055),
+                                    ("hour", -1.0986122886681098)],
+                               n = 5}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -5.959209720224566e-2,
+                               unseen = -4.7535901911063645,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 114},
+                   koData =
+                     ClassData{prior = -2.849880396541428, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 7}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.7396671961948381, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (21..29 31..39 .. 91..99)hora (grain)",
+                                     -3.4657359027997265),
+                                    ("week", -2.772588722239781),
+                                    ("integer (0..19)segundo (grain)", -3.4657359027997265),
+                                    ("integer (numeric)hora (grain)", -3.4657359027997265),
+                                    ("integer (numeric)dia (grain)", -3.4657359027997265),
+                                    ("integer (0..19)ano (grain)", -3.0602707946915624),
+                                    ("second", -3.4657359027997265),
+                                    ("integer (0..19)semana (grain)", -2.772588722239781),
+                                    ("integer (numeric)ano (grain)", -3.4657359027997265),
+                                    ("integer (0..19)mes (grain)", -3.0602707946915624),
+                                    ("integer (0..19)hora (grain)", -2.772588722239781),
+                                    ("integer (numeric)minutos (grain)", -2.772588722239781),
+                                    ("day", -3.0602707946915624), ("year", -2.772588722239781),
+                                    ("integer (0..19)minutos (grain)", -3.0602707946915624),
+                                    ("hour", -2.367123614131617), ("month", -3.0602707946915624),
+                                    ("minute", -2.367123614131617),
+                                    ("integer (0..19)dia (grain)", -3.4657359027997265)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.6486954179891115, unseen = -4.23410650459726,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.120895416507997),
+                                    ("integer (numeric)hora (grain)", -2.833213344056216),
+                                    ("integer (numeric)dia (grain)", -3.120895416507997),
+                                    ("integer (0..19)ano (grain)", -3.5263605246161616),
+                                    ("integer (numeric)mes (grain)", -2.833213344056216),
+                                    ("second", -3.120895416507997),
+                                    ("integer (0..19)semana (grain)", -3.5263605246161616),
+                                    ("integer (numeric)semana (grain)", -3.5263605246161616),
+                                    ("integer (numeric)ano (grain)", -2.6100697927420065),
+                                    ("integer (0..19)mes (grain)", -3.120895416507997),
+                                    ("integer (0..19)hora (grain)", -3.120895416507997),
+                                    ("integer (numeric)minutos (grain)", -3.120895416507997),
+                                    ("day", -3.120895416507997),
+                                    ("integer (numeric)segundo (grain)", -3.120895416507997),
+                                    ("year", -2.4277482359480516), ("hour", -2.4277482359480516),
+                                    ("month", -2.4277482359480516), ("minute", -3.120895416507997)],
+                               n = 23}}),
+       ("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),
+                                    ("integer (0..19)ano (grain)", -2.4849066497880004),
+                                    ("second", -2.4849066497880004),
+                                    ("integer (0..19)mes (grain)", -2.4849066497880004),
+                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
+                                    ("day", -2.4849066497880004),
+                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
+                                    ("year", -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 = -1.252762968495368, 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 = -0.3364722366212129, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5}}),
+       ("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}}),
+       ("Quart-feira",
+        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}}),
+       ("o <ordinal> <cycle> de <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
+                                   [("monthyear", -1.3862943611198906),
+                                    ("ordinals (1..10)mes (grain)year", -1.3862943611198906),
+                                    ("quarteryear", -1.3862943611198906),
+                                    ("ordinals (1..10)trimestre (grain)year", -1.3862943611198906)],
+                               n = 4}}),
+       ("Quinta-feira",
+        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}}),
+       ("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.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> <cycle> <year> - <ordinal> <cycle> <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.465908118654584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (1..10)trimestre (grain)de <year>ordinals (1..10)trimestre (grain)de <year>",
+                                     -1.6817585740137264),
+                                    ("ordinals (1..10)mes (grain)de <year>ordinals (1..10)mes (grain)de <year>",
+                                     -1.6817585740137264),
+                                    ("monthyearmonthyear", -1.4098248585300848),
+                                    ("ordinals (1..10)mes (grain)yearordinals (1..10)mes (grain)year",
+                                     -2.662587827025453),
+                                    ("ordinals (1..10)trimestre (grain)yearordinals (1..10)trimestre (grain)year",
+                                     -2.662587827025453),
+                                    ("quarteryearquarteryear", -1.4098248585300848)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("trimestre (grain)",
+        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}}),
+       ("este <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135),
+                                    ("semana (grain)", -1.9459101490553135),
+                                    ("quarter", -1.9459101490553135), ("year", -1.9459101490553135),
+                                    ("ano (grain)", -1.9459101490553135),
+                                    ("trimestre (grain)", -1.9459101490553135)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.252762968495368),
+                                    ("dia (grain)", -1.252762968495368)],
+                               n = 3}}),
+       ("<named-month|named-day> next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("Quart-feira", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Setembro",
+        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 <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
+                                   [("year (latent)", -1.3862943611198906),
+                                    ("time-of-day (latent)", -1.3862943611198906),
+                                    ("year", -1.3862943611198906), ("hour", -1.3862943611198906)],
+                               n = 4}}),
+       ("\250ltimo <cycle> de <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.3862943611198906),
+                                    ("trimestre (grain)year", -1.3862943611198906),
+                                    ("quarteryear", -1.3862943611198906),
+                                    ("mes (grain)year", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<part-of-day> dessa semana",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Ter\231a-feira", -0.6931471805599453),
+                                    ("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}}),
+       ("dd-dd <month> de (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)Julho",
+                                     -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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),
+                                    ("integer (0..19)mes (grain)", -1.791759469228055),
+                                    ("year", -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}}),
+       ("negative numbers",
+        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}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.20938473514278214,
+                               unseen = -6.523562306149512,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> <cycle> <time><ordinal> trimestre <year>",
+                                     -3.4775703604467294),
+                                    ("de <year><ordinal> trimestre <year>", -3.7495040759303713),
+                                    ("<ordinal> trimestre <year><ordinal> <cycle> <time>",
+                                     -3.4775703604467294),
+                                    ("year<ordinal> <cycle> de <time>", -3.7495040759303713),
+                                    ("quarterquarter", -1.4722367909206153),
+                                    ("minuteminute", -5.8289456176102075),
+                                    ("<ordinal> <cycle> <time><ordinal> <cycle> <time>",
+                                     -2.8085207314658445),
+                                    ("dayday", -5.8289456176102075),
+                                    ("de <year><ordinal> <cycle> <time>", -3.7495040759303713),
+                                    ("hh(:|.|h)mm (time-of-day)hh(:|.|h)mm (time-of-day)",
+                                     -5.8289456176102075),
+                                    ("monthmonth", -2.332438056143727),
+                                    ("<day-of-month> de <named-month><day-of-month> de <named-month>",
+                                     -5.8289456176102075),
+                                    ("<ordinal> trimestre <year><ordinal> trimestre <year>",
+                                     -3.4775703604467294),
+                                    ("<ordinal> trimestre <year><ordinal> <cycle> de <time>",
+                                     -3.7495040759303713),
+                                    ("<ordinal> <cycle> <time><ordinal> <cycle> de <time>",
+                                     -3.088105593685006),
+                                    ("de <year><ordinal> <cycle> de <time>", -3.7495040759303713),
+                                    ("<ordinal> <cycle> de <time><ordinal> <cycle> <time>",
+                                     -3.088105593685006),
+                                    ("year<ordinal> trimestre <year>", -3.4775703604467294),
+                                    ("<ordinal> <cycle> de <time><ordinal> <cycle> de <time>",
+                                     -3.088105593685006),
+                                    ("year<ordinal> <cycle> <time>", -3.4775703604467294),
+                                    ("yearquarter", -1.906972281328893),
+                                    ("<ordinal> <cycle> de <time><ordinal> trimestre <year>",
+                                     -3.7495040759303713)],
+                               n = 322},
+                   koData =
+                     ClassData{prior = -1.66644816715088, unseen = -5.231108616854587,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -4.532599493153256),
+                                    ("dayhour", -4.532599493153256),
+                                    ("daymonth", -4.532599493153256),
+                                    ("monthday", -4.127134385045092),
+                                    ("year<ordinal> <cycle> de <time>", -2.45315795147342),
+                                    ("<day-of-month> de <named-month>intersect by `da` or `de`",
+                                     -4.127134385045092),
+                                    ("monthhour", -4.127134385045092),
+                                    ("de <year><ordinal> <cycle> <time>", -2.45315795147342),
+                                    ("monthmonth", -4.532599493153256),
+                                    ("hourhour", -4.532599493153256),
+                                    ("dayyear", -4.532599493153256),
+                                    ("Dezembro<day-of-month> de <named-month>", -4.532599493153256),
+                                    ("de <year><ordinal> <cycle> de <time>", -2.45315795147342),
+                                    ("yearmonth", -1.0360919316867756),
+                                    ("intersect by `da` or `de`<day-of-month> de <named-month>",
+                                     -4.127134385045092),
+                                    ("intersect by `da` or `de`intersect by `da` or `de`",
+                                     -4.127134385045092),
+                                    ("year<ordinal> <cycle> <time>", -2.181224235989778),
+                                    ("Dezembrointersect by `da` or `de`", -4.127134385045092),
+                                    ("dd[/-]mmyear", -4.532599493153256)],
+                               n = 75}}),
+       ("entre <datetime> e <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3171961329649449, unseen = -6.159095388491933,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> <cycle> <time><ordinal> trimestre <year>",
+                                     -3.4489287844833454),
+                                    ("<ordinal> trimestre <year><ordinal> <cycle> <time>",
+                                     -3.4489287844833454),
+                                    ("year<ordinal> <cycle> de <time>", -3.2666072276893905),
+                                    ("quarterquarter", -1.3948050507877991),
+                                    ("<ordinal> <cycle> <time><ordinal> <cycle> <time>",
+                                     -2.7896831555990813),
+                                    ("monthmonth", -2.2251533528612297),
+                                    ("<ordinal> trimestre <year><ordinal> trimestre <year>",
+                                     -3.4489287844833454),
+                                    ("<ordinal> trimestre <year><ordinal> <cycle> de <time>",
+                                     -3.5920296281240187),
+                                    ("<ordinal> <cycle> <time><ordinal> <cycle> de <time>",
+                                     -2.938103160717355),
+                                    ("<ordinal> <cycle> de <time><ordinal> <cycle> <time>",
+                                     -2.938103160717355),
+                                    ("year<ordinal> trimestre <year>", -3.2666072276893905),
+                                    ("<ordinal> <cycle> de <time><ordinal> <cycle> de <time>",
+                                     -2.938103160717355),
+                                    ("year<ordinal> <cycle> <time>", -3.2666072276893905),
+                                    ("yearquarter", -2.205735267004128),
+                                    ("<ordinal> <cycle> de <time><ordinal> trimestre <year>",
+                                     -3.5920296281240187)],
+                               n = 217},
+                   koData =
+                     ClassData{prior = -1.3026443318329657, unseen = -5.303304908059076,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.912023005428146),
+                                    ("monthday", -4.605170185988091),
+                                    ("monthyear", -4.605170185988091),
+                                    ("yearhour", -2.995732273553991),
+                                    ("year (latent)intersect by `da` or `de`", -3.3524072174927233),
+                                    ("time-of-day (latent)year (latent)", -3.3524072174927233),
+                                    ("houryear", -3.3524072174927233),
+                                    ("year<ordinal> <cycle> de <time>", -2.4079456086518722),
+                                    ("year (latent)<day-of-month> de <named-month>",
+                                     -3.912023005428146),
+                                    ("time-of-day (latent)<day-of-month> de <named-month>",
+                                     -3.912023005428146),
+                                    ("monthhour", -4.199705077879927),
+                                    ("yearyear", -3.3524072174927233),
+                                    ("hourmonth", -3.912023005428146),
+                                    ("time-of-day (latent)intersect by `da` or `de`",
+                                     -3.3524072174927233),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.3524072174927233),
+                                    ("year (latent)year (latent)", -3.3524072174927233),
+                                    ("monthmonth", -4.605170185988091),
+                                    ("hourhour", -2.995732273553991),
+                                    ("Dezembrotime-of-day (latent)", -4.605170185988091),
+                                    ("Dezembro<day-of-month> de <named-month>", -4.605170185988091),
+                                    ("Dezembroyear (latent)", -4.605170185988091),
+                                    ("year (latent)time-of-day (latent)", -3.3524072174927233),
+                                    ("yearmonth", -1.6607312068216509),
+                                    ("year<ordinal> <cycle> <time>", -2.4079456086518722),
+                                    ("yearday", -3.912023005428146),
+                                    ("Dezembrointersect by `da` or `de`", -4.199705077879927)],
+                               n = 81}}),
+       ("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}}),
+       ("desde <month> dd-dd de (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)Julho",
+                                     -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mar\231o",
+        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}}),
+       ("tens (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}}),
+       ("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.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Segunda-feira", -1.6582280766035324),
+                                    ("Ter\231a-feira", -1.0986122886681098),
+                                    ("day", -0.7419373447293773)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               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.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}}),
+       ("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.2484613592984996, 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.5141277326297755,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -2.803360380906535),
+                                    ("<time-of-day> horas", -2.803360380906535),
+                                    ("time-of-day (latent)", -1.4170660197866443),
+                                    ("<hour-of-day> and <relative minutes>", -2.3978952727983707),
+                                    ("hour", -1.1939224684724346), ("minute", -2.3978952727983707)],
+                               n = 11}}),
+       ("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}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)Julho",
+                                     -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("n <cycle> atras",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/RO_XX.hs b/Duckling/Ranking/Classifiers/RO_XX.hs
--- a/Duckling/Ranking/Classifiers/RO_XX.hs
+++ b/Duckling/Ranking/Classifiers/RO_XX.hs
@@ -185,6 +185,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                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}}),
        ("<named-day> pe <day-of-month> (number)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
diff --git a/Duckling/Ranking/Classifiers/RU_XX.hs b/Duckling/Ranking/Classifiers/RU_XX.hs
--- a/Duckling/Ranking/Classifiers/RU_XX.hs
+++ b/Duckling/Ranking/Classifiers/RU_XX.hs
@@ -19,4 +19,1085 @@
 import Duckling.Ranking.Types
 
 classifiers :: Classifiers
-classifiers = HashMap.fromList []
+classifiers
+  = HashMap.fromList
+      [("week",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1055\1086\1085\1077\1076\1077\1083\1100\1085\1080\1082",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.8096221715563133, unseen = -4.465908118654584,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 85},
+                   koData =
+                     ClassData{prior = -0.5888343339345626, unseen = -4.68213122712422,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 106}}),
+       ("\1057\1088\1077\1076\1072",
+        Classifier{okData =
+                     ClassData{prior = 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 (3..19)",
+        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}}),
+       ("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}}),
+       ("\1074\1095\1077\1088\1072",
+        Classifier{okData =
+                     ClassData{prior = 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.1941560144409575, unseen = -4.74493212836325,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clockmorning", -3.6375861597263857),
+                                    ("until <time-of-day>afternoon", -4.04305126783455),
+                                    ("dayhour", -2.9444389791664407),
+                                    ("on <date>evening", -4.04305126783455),
+                                    ("at <time-of-day>evening", -4.04305126783455),
+                                    ("intersect by ','evening", -3.6375861597263857),
+                                    ("intersectevening", -2.2512917986064953),
+                                    ("hourhour", -1.2396908869280152),
+                                    ("\1079\1072\1074\1090\1088\1072lunch", -4.04305126783455),
+                                    ("on <date>afternoon", -3.6375861597263857),
+                                    ("at <time-of-day>afternoon", -3.6375861597263857),
+                                    ("<time-of-day>  o'clockafternoon", -2.9444389791664407),
+                                    ("until <time-of-day>morning", -4.04305126783455),
+                                    ("minutehour", -2.9444389791664407),
+                                    ("time-of-day (latent)morning", -4.04305126783455),
+                                    ("hh:mmmorning", -4.04305126783455),
+                                    ("\1074\1095\1077\1088\1072evening", -4.04305126783455),
+                                    ("time-of-day (latent)evening", -4.04305126783455),
+                                    ("\1079\1072\1074\1090\1088\1072evening", -4.04305126783455),
+                                    ("\1089\1077\1075\1086\1076\1085\1103afternoon",
+                                     -4.04305126783455),
+                                    ("<time-of-day>  o'clockevening", -3.6375861597263857),
+                                    ("\1089\1077\1075\1086\1076\1085\1103evening",
+                                     -4.04305126783455),
+                                    ("hh:mmnight", -4.04305126783455),
+                                    ("hh:mmafternoon", -4.04305126783455),
+                                    ("on <date>morning", -4.04305126783455),
+                                    ("at <time-of-day>morning", -4.04305126783455)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.7346010553881064, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.772588722239781),
+                                    ("intersectevening", -2.4849066497880004),
+                                    ("hourhour", -1.791759469228055),
+                                    ("year (latent)afternoon", -3.1780538303479458),
+                                    ("year (latent)night", -3.1780538303479458),
+                                    ("time-of-day (latent)afternoon", -2.2617630984737906)],
+                               n = 9}}),
+       ("numbers prefix with -, minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("decimal number", -0.9808292530117262)],
+                               n = 22}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -0.8754687373538999,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -0.5389965007326869, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.7749523509116738),
+                                    ("time-of-day (latent)", -1.3049487216659381),
+                                    ("hh:mm", -2.691243082785829), ("hour", -0.8586616190375187),
+                                    ("minute", -2.691243082785829)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0116009116784799),
+                                    ("hour", -1.0116009116784799)],
+                               n = 3}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1055\1086\1085\1077\1076\1077\1083\1100\1085\1080\1082",
+                                     -1.9924301646902063),
+                                    ("\1057\1088\1077\1076\1072", -2.3978952727983707),
+                                    ("\1042\1086\1089\1082\1088\1077\1089\1077\1085\1100\1077",
+                                     -2.3978952727983707),
+                                    ("day", -0.8938178760220964),
+                                    ("\1057\1091\1073\1073\1086\1090\1072", -2.3978952727983707),
+                                    ("\1055\1103\1090\1085\1080\1094\1072", -1.7047480922384253)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -2.8170876966696335e-2,
+                               unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.7850112422383386),
+                                    ("<time-of-day>  o'clock", -2.0918640616783932),
+                                    ("intersect", -2.4485390056171257), ("day", -3.295836866004329),
+                                    ("time-of-day (latent)", -1.9095425048844386),
+                                    ("\1057\1091\1073\1073\1086\1090\1072", -3.7013019741124937),
+                                    ("hh:mm", -3.0081547935525483), ("hour", -0.9932517730102834),
+                                    ("this|next <day-of-week>", -3.7013019741124937),
+                                    ("minute", -2.7850112422383386)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -3.58351893845611, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -1.8718021769015913), ("day", -1.8718021769015913)],
+                               n = 1}}),
+       ("\1050\1086\1085\1077\1094 \1084\1077\1089\1103\1094\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1074\1077\1089\1085\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        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)time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("hourhour", -0.6931471805599453)],
+                               n = 1}}),
+       ("month (grain)",
+        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}}),
+       ("<time-of-day>  o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.13062018241706422,
+                               unseen = -4.532599493153256,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.2192034840549946),
+                                    ("on <date>", -2.2192034840549946),
+                                    ("time-of-day (latent)", -1.5260563034950494),
+                                    ("until <time-of-day>", -3.1354942159291497),
+                                    ("hour", -0.7375989431307791),
+                                    ("after <time-of-day>", -3.1354942159291497)],
+                               n = 43},
+                   koData =
+                     ClassData{prior = -2.1000608288825715,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9444616088408514),
+                                    ("hour", -0.9444616088408514)],
+                               n = 6}}),
+       ("\1053\1086\1074\1099\1081 \1075\1086\1076",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1083\1077\1090\1086",
+        Classifier{okData =
+                     ClassData{prior = 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 = -1.7578579175523736,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.18924199963852842,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.18589937814183854,
+                               unseen = -5.545177444479562,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1089\1077\1075\1086\1076\1085\1103on <date>",
+                                     -4.154969184038536),
+                                    ("hourday", -3.5953533961031128),
+                                    ("<datetime> - <datetime> (interval)year", -4.848116364598481),
+                                    ("\1063\1077\1090\1074\1077\1088\1075<time> timezone",
+                                     -4.442651256490317),
+                                    ("hh:mm<part-of-day> of <time>", -3.9318256327243257),
+                                    ("dayhour", -1.7346010553881064),
+                                    ("daymonth", -4.848116364598481),
+                                    ("monthyear", -4.442651256490317),
+                                    ("yearhour", -4.848116364598481),
+                                    ("intersect<time-of-day>  o'clock", -3.9318256327243257),
+                                    ("absorption of , after named daymm/dd/yyyy",
+                                     -4.848116364598481),
+                                    ("intersect<time> <part-of-day>", -3.9318256327243257),
+                                    ("intersect by ','year", -4.442651256490317),
+                                    ("on <date><time-of-day>  o'clock", -4.442651256490317),
+                                    ("mm/dd<time-of-day>  o'clock", -4.442651256490317),
+                                    ("on <date>at <time-of-day>", -4.442651256490317),
+                                    ("\1079\1072\1074\1090\1088\1072on <date>", -4.848116364598481),
+                                    ("dayday", -3.056356895370426),
+                                    ("at <time-of-day>\1079\1072\1074\1090\1088\1072",
+                                     -4.848116364598481),
+                                    ("mm/ddat <time-of-day>", -4.442651256490317),
+                                    ("on <date>\1079\1072\1074\1090\1088\1072", -4.848116364598481),
+                                    ("hh:mmintersect by ','", -4.848116364598481),
+                                    ("<day-of-month> (ordinal)\1052\1072\1088\1090",
+                                     -4.848116364598481),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -4.442651256490317),
+                                    ("dayyear", -2.9763141876968895),
+                                    ("<day-of-month> (non ordinal) <named-month>intersect",
+                                     -4.848116364598481),
+                                    ("\1053\1086\1103\1073\1088\1100year", -4.848116364598481),
+                                    ("minutehour", -3.5953533961031128),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -3.46182200347859),
+                                    ("\1089\1077\1075\1086\1076\1085\1103<time> <part-of-day>",
+                                     -4.442651256490317),
+                                    ("\1089\1077\1075\1086\1076\1085\1103at <time-of-day>",
+                                     -3.9318256327243257),
+                                    ("hh:mmintersect", -4.848116364598481),
+                                    ("\1054\1082\1090\1103\1073\1088\1100year", -4.848116364598481),
+                                    ("intersect by ','intersect", -4.848116364598481),
+                                    ("dayminute", -3.9318256327243257),
+                                    ("<time> <part-of-day>intersect", -4.848116364598481),
+                                    ("intersectyear", -4.442651256490317),
+                                    ("minuteday", -3.5953533961031128),
+                                    ("absorption of , after named dayintersect",
+                                     -3.9318256327243257),
+                                    ("\1079\1072\1074\1090\1088\1072<time-of-day>  o'clock",
+                                     -4.442651256490317),
+                                    ("year<time-of-day>  o'clock", -4.848116364598481),
+                                    ("<time-of-day>  o'clock\1079\1072\1074\1090\1088\1072",
+                                     -4.154969184038536),
+                                    ("\1057\1091\1073\1073\1086\1090\1072on <date>",
+                                     -4.848116364598481),
+                                    ("intersect by ','<time> <part-of-day>", -4.848116364598481),
+                                    ("\1057\1091\1073\1073\1086\1090\1072at <time-of-day>",
+                                     -4.442651256490317),
+                                    ("<time> <part-of-day>intersect by ','", -4.848116364598481),
+                                    ("<time> <part-of-day>\1057\1091\1073\1073\1086\1090\1072",
+                                     -4.848116364598481),
+                                    ("mm/ddyear", -4.442651256490317),
+                                    ("intersect by ','<time-of-day>  o'clock", -4.848116364598481),
+                                    ("absorption of , after named daymm/dd", -4.848116364598481),
+                                    ("mm/ddon <date>", -4.848116364598481),
+                                    ("<time> <part-of-day>absorption of , after named day",
+                                     -4.848116364598481),
+                                    ("intersectintersect", -4.848116364598481),
+                                    ("<part-of-day> of <time><day-of-month> (non ordinal) <named-month>",
+                                     -4.848116364598481),
+                                    ("\1057\1091\1073\1073\1086\1090\1072<time-of-day>  o'clock",
+                                     -4.442651256490317),
+                                    ("on <date>on <date>", -4.848116364598481),
+                                    ("\1079\1072\1074\1090\1088\1072at <time-of-day>",
+                                     -4.442651256490317),
+                                    ("\1089\1077\1075\1086\1076\1085\1103<time-of-day>  o'clock",
+                                     -4.442651256490317),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -3.7495040759303713)],
+                               n = 93},
+                   koData =
+                     ClassData{prior = -1.7740598921286541, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.979681653901961),
+                                    ("monthyear", -2.8810693652338513),
+                                    ("yearhour", -3.979681653901961),
+                                    ("intersect<time-of-day>  o'clock", -3.979681653901961),
+                                    ("intersect<time> <part-of-day>", -3.979681653901961),
+                                    ("absorption of , after named dayhh:mm", -3.979681653901961),
+                                    ("monthhour", -3.2865344733420154),
+                                    ("hourmonth", -3.979681653901961),
+                                    ("dayyear", -2.8810693652338513),
+                                    ("\1048\1102\1083\1100year", -3.5742165457937967),
+                                    ("between <time-of-day> and <time-of-day> (interval)\1048\1102\1083\1100",
+                                     -3.979681653901961),
+                                    ("\1048\1102\1083\1100intersect", -3.979681653901961),
+                                    ("\1089\1077\1075\1086\1076\1085\1103at <time-of-day>",
+                                     -3.979681653901961),
+                                    ("dayminute", -3.2865344733420154),
+                                    ("\1063\1077\1090\1074\1077\1088\1075hh:mm",
+                                     -3.5742165457937967),
+                                    ("\1040\1087\1088\1077\1083\1100year", -3.979681653901961),
+                                    ("year<time> <part-of-day>", -3.979681653901961),
+                                    ("mm/ddyear", -2.8810693652338513),
+                                    ("\1052\1072\1088\1090year", -3.5742165457937967)],
+                               n = 19}}),
+       ("\1040\1087\1088\1077\1083\1100",
+        Classifier{okData =
+                     ClassData{prior = 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 (grain)",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month (grain)", -1.3862943611198906),
+                                    ("year (grain)", -1.3862943611198906),
+                                    ("year", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("mm/dd/yyyy",
+        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}}),
+       ("\1054\1082\1090\1103\1073\1088\1100",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1063\1077\1090\1074\1077\1088\1075",
+        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}}),
+       ("\1079\1080\1084\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1042\1086\1089\1082\1088\1077\1089\1077\1085\1100\1077",
+        Classifier{okData =
+                     ClassData{prior = 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.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}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -0.9555114450274363),
+                                    ("nightabsorption of , after named day", -1.8718021769015913),
+                                    ("night\1057\1091\1073\1073\1086\1090\1072",
+                                     -1.8718021769015913),
+                                    ("nightintersect by ','", -1.8718021769015913),
+                                    ("nightintersect", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)\1052\1072\1088\1090",
+                                     -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1048\1102\1083\1100",
+        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}}),
+       ("\1053\1086\1103\1073\1088\1100",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1040\1074\1075\1091\1089\1090",
+        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}}),
+       ("\1057\1077\1085\1090\1103\1073\1088\1100",
+        Classifier{okData =
+                     ClassData{prior = 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 2",
+        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.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}}),
+       ("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}}),
+       ("night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1079\1072\1074\1090\1088\1072",
+        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 (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.10536051565782628),
+                                    ("integer (3..19)", -2.70805020110221)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3364722366212129),
+                                    ("integer (3..19)", -1.9459101490553135),
+                                    ("integer 2", -1.9459101490553135)],
+                               n = 18}}),
+       ("year",
+        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}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -1.2383742310432684, unseen = -4.23410650459726,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.4277482359480516),
+                                    ("integer 2week (grain)", -3.5263605246161616),
+                                    ("integer (numeric)day (grain)", -2.833213344056216),
+                                    ("second", -3.5263605246161616),
+                                    ("integer 2hour (grain)", -3.5263605246161616),
+                                    ("integer (numeric)second (grain) ", -3.5263605246161616),
+                                    ("integer (numeric)year (grain)", -3.5263605246161616),
+                                    ("day", -2.833213344056216), ("year", -3.120895416507997),
+                                    ("integer (3..19)week (grain)", -3.5263605246161616),
+                                    ("integer (numeric)week (grain)", -2.833213344056216),
+                                    ("hour", -2.833213344056216), ("month", -3.5263605246161616),
+                                    ("integer (numeric)minute (grain)", -2.4277482359480516),
+                                    ("integer (3..19)month (grain)", -3.5263605246161616),
+                                    ("minute", -2.4277482359480516),
+                                    ("integer (numeric)hour (grain)", -3.120895416507997),
+                                    ("integer 2year (grain)", -3.5263605246161616)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.3422862064866327, unseen = -4.844187086458591,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.2268439945173775),
+                                    ("integer 2week (grain)", -4.143134726391533),
+                                    ("integer (numeric)day (grain)", -3.4499875458315876),
+                                    ("integer (3..19)day (grain)", -4.143134726391533),
+                                    ("integer 2minute (grain)", -4.143134726391533),
+                                    ("second", -3.2268439945173775),
+                                    ("integer 2month (grain)", -4.143134726391533),
+                                    ("integer (3..19)second (grain) ", -4.143134726391533),
+                                    ("integer (numeric)second (grain) ", -3.7376696182833684),
+                                    ("integer (numeric)year (grain)", -3.7376696182833684),
+                                    ("integer (3..19)year (grain)", -4.143134726391533),
+                                    ("day", -3.044522437723423), ("year", -3.2268439945173775),
+                                    ("integer (3..19)week (grain)", -4.143134726391533),
+                                    ("integer 2day (grain)", -4.143134726391533),
+                                    ("integer (numeric)week (grain)", -3.7376696182833684),
+                                    ("integer (3..19)minute (grain)", -4.143134726391533),
+                                    ("hour", -1.6174060820832774), ("month", -3.2268439945173775),
+                                    ("integer (numeric)minute (grain)", -3.7376696182833684),
+                                    ("integer 2second (grain) ", -4.143134726391533),
+                                    ("integer (3..19)month (grain)", -4.143134726391533),
+                                    ("integer (numeric)month (grain)", -3.7376696182833684),
+                                    ("integer (3..19)hour (grain)", -4.143134726391533),
+                                    ("minute", -3.2268439945173775),
+                                    ("integer (numeric)hour (grain)", -1.6582280766035324),
+                                    ("integer 2year (grain)", -4.143134726391533)],
+                               n = 49}}),
+       ("ordinals (first..19th)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1057\1091\1073\1073\1086\1090\1072",
+        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}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -4.382026634673881, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0794415416798357),
+                                    ("week (grain)", -2.0794415416798357)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -1.2578782206860073e-2,
+                               unseen = -5.153291594497779,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8449093838194073),
+                                    ("month (grain)", -2.9502698994772336),
+                                    ("hour (grain)", -1.7462970951512977),
+                                    ("year (grain)", -2.9502698994772336),
+                                    ("second", -3.355735007585398),
+                                    ("week (grain)", -2.8449093838194073),
+                                    ("day", -2.662587827025453),
+                                    ("minute (grain)", -2.8449093838194073),
+                                    ("year", -2.9502698994772336),
+                                    ("second (grain) ", -3.355735007585398),
+                                    ("hour", -1.7462970951512977), ("month", -2.9502698994772336),
+                                    ("minute", -2.8449093838194073),
+                                    ("day (grain)", -2.662587827025453)],
+                               n = 79}}),
+       ("dd.(mm.)? - dd.mm.(yy[yy]?)? (interval)",
+        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}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.6690496289808848,
+                               unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
+                   koData =
+                     ClassData{prior = -0.7178397931503169,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20}}),
+       ("intersect by ','",
+        Classifier{okData =
+                     ClassData{prior = -6.0624621816434854e-2,
+                               unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1780538303479458),
+                                    ("dayhour", -2.772588722239781),
+                                    ("\1055\1086\1085\1077\1076\1077\1083\1100\1085\1080\1082<day-of-month> (non ordinal) <named-month>",
+                                     -2.772588722239781),
+                                    ("\1055\1103\1090\1085\1080\1094\1072mm/dd",
+                                     -3.1780538303479458),
+                                    ("\1057\1088\1077\1076\1072<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("\1055\1103\1090\1085\1080\1094\1072intersect",
+                                     -2.2617630984737906),
+                                    ("dayday", -1.3862943611198906),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -2.772588722239781),
+                                    ("\1057\1091\1073\1073\1086\1090\1072<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("minuteday", -2.772588722239781),
+                                    ("\1055\1103\1090\1085\1080\1094\1072mm/dd/yyyy",
+                                     -3.1780538303479458),
+                                    ("\1042\1086\1089\1082\1088\1077\1089\1077\1085\1100\1077<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("<part-of-day> of <time><day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("\1055\1103\1090\1085\1080\1094\1072<day-of-month> (non ordinal) <named-month>",
+                                     -2.772588722239781)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -2.833213344056216, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1055\1103\1090\1085\1080\1094\1072hh:mm",
+                                     -2.1972245773362196),
+                                    ("dayminute", -2.1972245773362196)],
+                               n = 1}}),
+       ("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}}),
+       ("\1042\1090\1086\1088\1085\1080\1082",
+        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}}),
+       ("\1055\1103\1090\1085\1080\1094\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228,
+                               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 = -0.8472978603872037,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055), ("day", -1.791759469228055),
+                                    ("year", -2.1972245773362196),
+                                    ("a <unit-of-duration>", -0.9444616088408514),
+                                    ("month", -2.1972245773362196)],
+                               n = 6}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("\1042\1090\1086\1088\1085\1080\1082", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("ordinals (first..19th)", 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.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.1972245773362196),
+                                    ("\1050\1086\1085\1077\1094 \1084\1077\1089\1103\1094\1072",
+                                     -2.6026896854443837),
+                                    ("<time-of-day>  o'clock", -1.9095425048844386),
+                                    ("time-of-day (latent)", -1.9095425048844386),
+                                    ("hour", -0.9932517730102834), ("month", -2.6026896854443837),
+                                    ("midnight|EOD|end of day", -2.6026896854443837)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1060\1077\1074\1088\1072\1083\1100",
+        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}}),
+       ("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}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.6109179126442243,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 35}}),
+       ("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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month (grain)", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.793208009442517),
+                                    ("integer (numeric)day (grain)", -3.1986731175506815),
+                                    ("integer (3..19)day (grain)", -3.1986731175506815),
+                                    ("second", -2.793208009442517),
+                                    ("integer (3..19)second (grain) ", -3.1986731175506815),
+                                    ("integer (numeric)second (grain) ", -3.1986731175506815),
+                                    ("integer (numeric)year (grain)", -3.1986731175506815),
+                                    ("integer (3..19)year (grain)", -3.1986731175506815),
+                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
+                                    ("integer (3..19)week (grain)", -3.1986731175506815),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("integer (3..19)minute (grain)", -3.1986731175506815),
+                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
+                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
+                                    ("integer (3..19)month (grain)", -3.1986731175506815),
+                                    ("integer (numeric)month (grain)", -3.1986731175506815),
+                                    ("integer (3..19)hour (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}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.740840023925201), ("second", -2.740840023925201),
+                                    ("day", -2.740840023925201), ("year", -2.740840023925201),
+                                    ("<integer> <unit-of-duration>", -0.8690378470236094),
+                                    ("hour", -2.0476928433652555), ("minute", -1.6422277352570913)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6190392084062235, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.8718021769015913),
+                                    ("hh:mmhh:mm", -1.8718021769015913),
+                                    ("dayday", -1.6486586255873816),
+                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
+                                     -2.159484249353372),
+                                    ("mm/ddmm/dd", -2.159484249353372)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.7731898882334817,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -2.0794415416798357),
+                                    ("mm/ddmm/dd/yyyy", -2.4849066497880004),
+                                    ("\1048\1102\1083\1100<day-of-month> (non ordinal) <named-month>",
+                                     -2.4849066497880004),
+                                    ("\1040\1074\1075\1091\1089\1090<day-of-month> (non ordinal) <named-month>",
+                                     -2.4849066497880004),
+                                    ("mm/ddhh:mm", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("mm/ddintersect", -2.4849066497880004),
+                                    ("dayminute", -2.0794415416798357)],
+                               n = 6}}),
+       ("\1089\1077\1075\1086\1076\1085\1103",
+        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> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("minuteminute", -1.2809338454620642),
+                                    ("hh:mmhh:mm", -1.2809338454620642),
+                                    ("minutehour", -1.791759469228055)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("hourminute", -1.3862943611198906),
+                                    ("minutehour", -1.791759469228055),
+                                    ("time-of-day (latent)hh:mm", -1.3862943611198906)],
+                               n = 3}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.639057329615259),
+                                    ("integer 2week (grain)", -3.044522437723423),
+                                    ("integer (numeric)day (grain)", -3.044522437723423),
+                                    ("integer 2minute (grain)", -3.044522437723423),
+                                    ("second", -2.639057329615259),
+                                    ("integer 2month (grain)", -3.044522437723423),
+                                    ("integer (numeric)second (grain) ", -3.044522437723423),
+                                    ("integer (numeric)year (grain)", -3.044522437723423),
+                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
+                                    ("integer 2day (grain)", -3.044522437723423),
+                                    ("integer (numeric)week (grain)", -3.044522437723423),
+                                    ("month", -2.639057329615259),
+                                    ("integer (numeric)minute (grain)", -3.044522437723423),
+                                    ("integer 2second (grain) ", -3.044522437723423),
+                                    ("integer (numeric)month (grain)", -3.044522437723423),
+                                    ("minute", -2.639057329615259),
+                                    ("integer 2year (grain)", -3.044522437723423)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -9.097177820572676e-2,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)\1052\1072\1088\1090", -2.2823823856765264),
+                                    ("integer (numeric)\1048\1102\1083\1100", -2.2823823856765264),
+                                    ("integer (numeric)\1057\1077\1085\1090\1103\1073\1088\1100",
+                                     -3.1986731175506815),
+                                    ("integer (numeric)\1040\1074\1075\1091\1089\1090",
+                                     -2.2823823856765264),
+                                    ("integer (numeric)\1040\1087\1088\1077\1083\1100",
+                                     -3.1986731175506815),
+                                    ("integer (numeric)\1060\1077\1074\1088\1072\1083\1100",
+                                     -1.8123787564307907),
+                                    ("month", -0.8007778447523107)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -2.4423470353692043,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)\1048\1102\1083\1100", -1.2992829841302609),
+                                    ("month", -1.2992829841302609)],
+                               n = 2}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1055\1086\1085\1077\1076\1077\1083\1100\1085\1080\1082",
+                                     -1.252762968495368),
+                                    ("day", -0.8472978603872037),
+                                    ("\1042\1090\1086\1088\1085\1080\1082", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1052\1072\1088\1090",
+        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}}),
+       ("\1056\1086\1078\1076\1077\1089\1090\1074\1086 \1061\1088\1080\1089\1090\1086\1074\1086",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("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.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -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}}),
+       ("day (grain)",
+        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}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1048\1102\1083\1100", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("week-end", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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/SK_XX.hs b/Duckling/Ranking/Classifiers/SK_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/SK_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.SK_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_XX.hs b/Duckling/Ranking/Classifiers/SV_XX.hs
--- a/Duckling/Ranking/Classifiers/SV_XX.hs
+++ b/Duckling/Ranking/Classifiers/SV_XX.hs
@@ -35,11 +35,12 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.832909122935104, unseen = -4.882801922586371,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 130},
+                     ClassData{prior = -0.8176416508043156, unseen = -4.897839799950911,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 132},
                    koData =
-                     ClassData{prior = -0.570544858467613, unseen = -5.14166355650266,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 169}}),
+                     ClassData{prior = -0.5824497609739314,
+                               unseen = -5.1298987149230735,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 167}}),
        ("the day before yesterday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -93,13 +94,19 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("dd/mm",
         Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
                    koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+                     ClassData{prior = -0.916290731874155, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("sommar",
+        Classifier{okData =
+                     ClassData{prior = 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.6094379124341003,
@@ -194,39 +201,43 @@
                                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,
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -0.9808292530117262),
-                                    ("hh:mmhh:mm", -0.9808292530117262)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("minuteminute", -1.2039728043259361),
+                                    ("hh:mmhh:mm", -1.2039728043259361),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.9459101490553135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 2}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 1}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 2},
+                                   [("hh:mmtime-of-day (latent)", -1.7047480922384253),
+                                    ("minuteminute", -1.2992829841302609),
+                                    ("hh:mmhh:mm", -1.2992829841302609),
+                                    ("minutehour", -1.7047480922384253)],
+                               n = 3},
                    koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
-                                    ("minuteminute", -1.7047480922384253),
-                                    ("minutehour", -1.2992829841302609),
-                                    ("hh:mmintersect", -1.7047480922384253)],
-                               n = 3}}),
+                                   [("hh:mmtime-of-day (latent)", -1.5040773967762742),
+                                    ("minuteminute", -1.5040773967762742),
+                                    ("minutehour", -1.5040773967762742),
+                                    ("hh:mmintersect", -1.5040773967762742)],
+                               n = 2}}),
        ("month (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -257,6 +268,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("vinter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Juli",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -303,142 +321,131 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4318772076479415, unseen = -5.877735781779639,
+                     ClassData{prior = -0.35003530316883363,
+                               unseen = -5.860786223465865,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Onsdagthis <cycle>", -5.181783550292085),
-                                    ("Torsdag<time> timezone", -3.929020581796717),
+                                   [("Onsdagthis <cycle>", -5.1647859739235145),
+                                    ("Torsdag<time> timezone", -3.912023005428146),
                                     ("<datetime> - <datetime> (interval)on <date>",
-                                     -4.083171261623976),
+                                     -4.0661736852554045),
                                     ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.083171261623976),
-                                    ("hourday", -5.181783550292085), ("dayhour", -2.93049175168559),
-                                    ("daymonth", -3.0417173867958143),
-                                    ("monthyear", -3.1668805297498204),
+                                     -4.0661736852554045),
+                                    ("hourday", -5.1647859739235145),
+                                    ("dayhour", -2.9134941753170187),
+                                    ("daymonth", -3.1498829533812494),
+                                    ("monthyear", -3.1498829533812494),
                                     ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.181783550292085),
-                                    ("Mandagon <date>", -5.181783550292085),
-                                    ("yyyy-mm-ddat <time-of-day>", -4.48863636973214),
-                                    ("intersecthh:mm", -5.181783550292085),
+                                     -4.75932086581535),
+                                    ("Mandagon <date>", -5.1647859739235145),
+                                    ("yyyy-mm-ddat <time-of-day>", -4.471638793363569),
+                                    ("intersecthh:mm", -5.1647859739235145),
                                     ("Torsdagbetween <datetime> and <datetime> (interval)",
-                                     -5.181783550292085),
-                                    ("Torsdagat <time-of-day>", -4.26549281841793),
-                                    ("Marsyear", -5.181783550292085),
+                                     -4.75932086581535),
+                                    ("Torsdagat <time-of-day>", -4.248495242049359),
+                                    ("Marsyear", -5.1647859739235145),
                                     ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -4.77631844218392),
-                                    ("Oktoberyear", -3.572345637857985),
+                                     -4.75932086581535),
+                                    ("Oktoberyear", -3.5553480614894135),
                                     ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.77631844218392),
+                                     -4.471638793363569),
                                     ("Torsdagfrom <datetime> - <datetime> (interval)",
-                                     -4.77631844218392),
-                                    ("last <day-of-week> of <time>year", -5.181783550292085),
-                                    ("todayat <time-of-day>", -4.77631844218392),
-                                    ("the <day-of-month> (ordinal)Februari", -5.181783550292085),
-                                    ("dayday", -3.3099813733904937),
-                                    ("dd/mmat <time-of-day>", -4.26549281841793),
-                                    ("intersect by \",\"hh:mm", -4.26549281841793),
-                                    ("dayyear", -3.39002408106403),
-                                    ("tomorrow<time-of-day> sharp", -4.77631844218392),
+                                     -4.471638793363569),
+                                    ("last <day-of-week> of <time>year", -5.1647859739235145),
+                                    ("todayat <time-of-day>", -4.75932086581535),
+                                    ("the <day-of-month> (ordinal)Februari", -5.1647859739235145),
+                                    ("dayday", -3.2929837970219227),
+                                    ("dd/mmat <time-of-day>", -4.248495242049359),
+                                    ("intersect by \",\"hh:mm", -4.248495242049359),
+                                    ("dayyear", -3.5553480614894135),
+                                    ("tomorrow<time-of-day> sharp", -4.75932086581535),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.77631844218392),
+                                     -4.75932086581535),
                                     ("Onsdag<named-month> <day-of-month> (non ordinal)",
-                                     -5.181783550292085),
-                                    ("Onsdagthis <time>", -4.48863636973214),
+                                     -5.1647859739235145),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.083171261623976),
-                                    ("tomorrowuntil <time-of-day>", -4.77631844218392),
+                                     -4.0661736852554045),
+                                    ("tomorrowuntil <time-of-day>", -4.75932086581535),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.48863636973214),
-                                    ("after <time-of-day>at <time-of-day>", -4.77631844218392),
-                                    ("the <day-of-month> (ordinal)Mars", -4.083171261623976),
+                                     -4.471638793363569),
+                                    ("after <time-of-day>at <time-of-day>", -4.75932086581535),
+                                    ("the <day-of-month> (ordinal)Mars", -4.0661736852554045),
                                     ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -4.77631844218392),
-                                    ("Mandagthis <cycle>", -5.181783550292085),
-                                    ("tomorrowafter <time-of-day>", -4.77631844218392),
+                                     -4.75932086581535),
+                                    ("Mandagthis <cycle>", -5.1647859739235145),
+                                    ("tomorrowafter <time-of-day>", -4.75932086581535),
                                     ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.26549281841793),
-                                    ("dayminute", -2.5076349008655563),
+                                     -4.248495242049359),
+                                    ("dayminute", -2.361425593016979),
                                     ("from <datetime> - <datetime> (interval)on <date>",
-                                     -4.48863636973214),
-                                    ("on <date>Mars", -4.083171261623976),
-                                    ("<ordinal> <cycle> of <time>year", -4.77631844218392),
-                                    ("minuteday", -2.5790938648477013),
+                                     -4.471638793363569),
+                                    ("on <date>Mars", -4.0661736852554045),
+                                    ("<ordinal> <cycle> of <time>year", -4.75932086581535),
+                                    ("minuteday", -2.5620962884791303),
                                     ("absorption of , after named dayintersect",
-                                     -5.181783550292085),
-                                    ("yearhh:mm", -5.181783550292085),
-                                    ("Tisdagthis <time>", -4.77631844218392),
-                                    ("Onsdagnext <cycle>", -5.181783550292085),
+                                     -5.1647859739235145),
+                                    ("yearhh:mm", -5.1647859739235145),
+                                    ("Tisdagthis <time>", -4.75932086581535),
+                                    ("Onsdagnext <cycle>", -5.1647859739235145),
                                     ("absorption of , after named dayintersect by \",\"",
-                                     -4.77631844218392),
-                                    ("Sondaglast <cycle>", -5.181783550292085),
-                                    ("dd/mmyear", -4.77631844218392),
-                                    ("Septemberyear", -4.26549281841793),
-                                    ("at <time-of-day>on <date>", -5.181783550292085),
+                                     -4.75932086581535),
+                                    ("Sondaglast <cycle>", -5.1647859739235145),
+                                    ("Septemberyear", -4.248495242049359),
+                                    ("at <time-of-day>on <date>", -5.1647859739235145),
                                     ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -5.181783550292085),
+                                     -5.1647859739235145),
                                     ("between <datetime> and <datetime> (interval)on <date>",
-                                     -5.181783550292085),
-                                    ("dayweek", -3.929020581796717),
-                                    ("Tisdagthis <cycle>", -5.181783550292085),
-                                    ("on <date>Februari", -5.181783550292085),
-                                    ("weekyear", -4.26549281841793),
-                                    ("hh:mmtomorrow", -4.48863636973214),
-                                    ("tomorrowat <time-of-day>", -3.929020581796717),
-                                    ("at <time-of-day>tomorrow", -4.77631844218392),
+                                     -5.1647859739235145),
+                                    ("dayweek", -4.0661736852554045),
+                                    ("Tisdagthis <cycle>", -5.1647859739235145),
+                                    ("on <date>Februari", -5.1647859739235145),
+                                    ("weekyear", -4.248495242049359),
+                                    ("hh:mmtomorrow", -4.471638793363569),
+                                    ("tomorrowat <time-of-day>", -3.912023005428146),
+                                    ("at <time-of-day>tomorrow", -4.75932086581535),
                                     ("Sondag<day-of-month> (non ordinal) <named-month>",
-                                     -5.181783550292085),
-                                    ("last <cycle> of <time>year", -4.26549281841793),
+                                     -5.1647859739235145),
+                                    ("last <cycle> of <time>year", -4.248495242049359),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.77631844218392),
-                                    ("yearminute", -5.181783550292085)],
-                               n = 137},
+                                     -4.75932086581535),
+                                    ("yearminute", -5.1647859739235145)],
+                               n = 136},
                    koData =
-                     ClassData{prior = -1.0477930402718967, unseen = -5.442417710521793,
+                     ClassData{prior = -1.2196389210703353, unseen = -5.262690188904886,
                                likelihoods =
                                  HashMap.fromList
-                                   [("OnsdagFebruari", -4.74493212836325),
-                                    ("dayhour", -2.7990219793079367),
-                                    ("daymonth", -2.1799827709017134),
-                                    ("monthday", -3.828641396489095),
-                                    ("monthyear", -3.828641396489095),
-                                    ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.74493212836325),
-                                    ("Mandagon <date>", -4.339467020255086),
-                                    ("yyyy-mm-ddat <time-of-day>", -4.051784947803305),
-                                    ("Torsdagbetween <datetime> and <datetime> (interval)",
-                                     -4.74493212836325),
-                                    ("Torsdagat <time-of-day>", -3.240854731586976),
-                                    ("Marsyear", -4.051784947803305),
+                                   [("OnsdagFebruari", -4.564348191467836),
+                                    ("dayhour", -2.6184380424125226),
+                                    ("daymonth", -2.4242820279715653),
+                                    ("monthyear", -3.648057459593681),
+                                    ("Mandagon <date>", -4.1588830833596715),
+                                    ("yyyy-mm-ddat <time-of-day>", -3.871201010907891),
+                                    ("Torsdagat <time-of-day>", -3.0602707946915624),
+                                    ("Marsyear", -3.871201010907891),
                                     ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -3.6463198396951406),
-                                    ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.74493212836325),
+                                     -3.4657359027997265),
                                     ("Torsdagfrom <datetime> - <datetime> (interval)",
-                                     -4.339467020255086),
-                                    ("Mandagintersect", -4.339467020255086),
-                                    ("absorption of , after named dayJuli", -4.339467020255086),
-                                    ("hourmonth", -4.339467020255086),
-                                    ("dd/mmat <time-of-day>", -3.828641396489095),
-                                    ("dayyear", -3.3586377672433594),
-                                    ("<named-month> <day-of-month> (non ordinal)Augusti",
-                                     -3.828641396489095),
-                                    ("Augusti<day-of-month> (non ordinal) <named-month>",
-                                     -3.828641396489095),
-                                    ("Onsdagthis <time>", -3.492169159867882),
-                                    ("Aprilyear", -4.74493212836325),
-                                    ("yearmonth", -4.74493212836325),
-                                    ("until <time-of-day>on <date>", -4.74493212836325),
-                                    ("Torsdaghh:mm", -4.339467020255086),
-                                    ("dayminute", -3.040184036124825),
-                                    ("minuteday", -3.240854731586976),
-                                    ("Tisdagthis <time>", -3.828641396489095),
-                                    ("hh:mmon <date>", -3.3586377672433594),
-                                    ("on <date>Februari", -4.339467020255086),
-                                    ("absorption of , after named dayFebruari", -4.051784947803305),
-                                    ("intersectFebruari", -4.339467020255086),
-                                    ("Mandagthis <time>", -4.74493212836325),
-                                    ("Sondagthis <time>", -4.339467020255086)],
-                               n = 74}}),
+                                     -4.564348191467836),
+                                    ("Mandagintersect", -4.1588830833596715),
+                                    ("absorption of , after named dayJuli", -4.1588830833596715),
+                                    ("hourmonth", -4.1588830833596715),
+                                    ("dd/mmat <time-of-day>", -3.648057459593681),
+                                    ("dayyear", -3.1780538303479458),
+                                    ("Onsdagthis <time>", -3.648057459593681),
+                                    ("Aprilyear", -4.564348191467836),
+                                    ("yearmonth", -4.564348191467836),
+                                    ("until <time-of-day>on <date>", -4.564348191467836),
+                                    ("Torsdaghh:mm", -4.1588830833596715),
+                                    ("dayminute", -3.311585222972468),
+                                    ("minuteday", -3.0602707946915624),
+                                    ("Tisdagthis <time>", -4.1588830833596715),
+                                    ("hh:mmon <date>", -3.1780538303479458),
+                                    ("on <date>Februari", -4.1588830833596715),
+                                    ("absorption of , after named dayFebruari", -3.871201010907891),
+                                    ("intersectFebruari", -4.1588830833596715),
+                                    ("Mandagthis <time>", -4.564348191467836),
+                                    ("Sondagthis <time>", -4.564348191467836)],
+                               n = 57}}),
        ("<ordinal> <cycle> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.890371757896165,
@@ -456,13 +463,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,
@@ -472,30 +472,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <datetime> - <datetime> (interval)",
         Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.1780538303479458,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.4350845252893227),
+                                   [("hh:mmtime-of-day (latent)", -2.4423470353692043),
+                                    ("minuteminute", -1.5260563034950494),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.3513752571634776),
-                                    ("hh:mmhh:mm", -1.4350845252893227),
-                                    ("hourhour", -2.3513752571634776)],
-                               n = 5},
+                                     -2.4423470353692043),
+                                    ("hh:mmhh:mm", -1.5260563034950494),
+                                    ("hourhour", -2.4423470353692043),
+                                    ("minutehour", -2.4423470353692043)],
+                               n = 6},
                    koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
+                     ClassData{prior = -0.5596157879354228, unseen = -3.332204510175204,
                                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}}),
+                                   [("yearhour", -2.6026896854443837),
+                                    ("hh:mmtime-of-day (latent)", -1.9095425048844386),
+                                    ("minuteminute", -1.9095425048844386),
+                                    ("yearyear", -2.6026896854443837),
+                                    ("year (latent)year (latent)", -2.6026896854443837),
+                                    ("minutehour", -1.9095425048844386),
+                                    ("hh:mmintersect", -1.9095425048844386),
+                                    ("year (latent)time-of-day (latent)", -2.6026896854443837)],
+                               n = 8}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.044522437723423,
@@ -521,23 +522,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("from <time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.6061358035703156,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
+                                   [("hh:mmtime-of-day (latent)", -2.3025850929940455),
+                                    ("minuteminute", -1.2039728043259361),
                                     ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
+                                     -2.3025850929940455),
+                                    ("hh:mmhh:mm", -1.2039728043259361),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("minutehour", -2.3025850929940455)],
+                               n = 7},
                    koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                     ClassData{prior = -1.0116009116784799, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
+                                   [("hh:mmtime-of-day (latent)", -1.0296194171811581),
+                                    ("minutehour", -1.0296194171811581)],
+                               n = 4}}),
        ("yyyy-mm-dd",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.9459101490553135,
@@ -550,12 +553,12 @@
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.3894647667617233),
-                                    ("integer (0..19)", -1.1314021114911006)],
-                               n = 29}}),
+                                   [("integer (numeric)", -0.15415067982725836),
+                                    ("integer (0..19)", -1.9459101490553135)],
+                               n = 12}}),
        ("Sondag",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -872,30 +875,32 @@
                                n = 2}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.9473813189441862, unseen = -3.713572066704308,
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.8066624897703196,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -5.129329438755058e-2),
-                                    ("integer (0..19)", -2.995732273553991)],
-                               n = 38},
+                                   [("integer (numeric)", -4.652001563489282e-2),
+                                    ("integer (0..19)", -3.0910424533583156)],
+                               n = 42},
                    koData =
-                     ClassData{prior = -0.4906229164484712, unseen = -4.143134726391533,
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.7376696182833684,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.21511137961694557),
-                                    ("integer (0..19)", -1.6422277352570913)],
-                               n = 60}}),
+                                   [("integer (numeric)", -0.10265415406008334),
+                                    ("integer (0..19)", -2.327277705584417)],
+                               n = 39}}),
        ("year",
         Classifier{okData =
-                     ClassData{prior = -0.24686007793152578,
-                               unseen = -3.295836866004329,
+                     ClassData{prior = -0.33024168687057687,
+                               unseen = -3.2188758248682006,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 25},
+                               n = 23},
                    koData =
-                     ClassData{prior = -1.5198257537444133,
-                               unseen = -2.1972245773362196,
+                     ClassData{prior = -1.2685113254635072,
+                               unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 7}}),
+                               n = 9}}),
        ("last <day-of-week> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -1145,27 +1150,21 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -2.6149597780361984, unseen = -2.833213344056216,
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Tisdag", -2.0794415416798357),
-                                    ("Sondag", -2.0794415416798357), ("day", -1.6739764335716716),
-                                    ("hour", -2.0794415416798357),
-                                    ("week-end", -2.0794415416798357)],
+                                   [("Tisdag", -1.791759469228055), ("Sondag", -1.791759469228055),
+                                    ("day", -1.3862943611198906), ("hour", -1.791759469228055),
+                                    ("week-end", -1.791759469228055)],
                                n = 3},
                    koData =
-                     ClassData{prior = -7.598590697792199e-2,
-                               unseen = -4.465908118654584,
+                     ClassData{prior = -0.916290731874155, unseen = -2.3978952727983707,
                                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}}),
+                                   [("Sondag", -1.6094379124341003),
+                                    ("Mandag", -1.6094379124341003), ("day", -1.2039728043259361)],
+                               n = 2}}),
        ("<day-of-month> (ordinal)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -1396,21 +1395,23 @@
                                n = 13}}),
        ("<time-of-day> - <time-of-day> (interval)",
         Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
+                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("minuteminute", -0.7985076962177716),
-                                    ("hh:mmhh:mm", -0.7985076962177716)],
-                               n = 8},
+                                   [("hh:mmtime-of-day (latent)", -2.0794415416798357),
+                                    ("minuteminute", -0.9808292530117262),
+                                    ("hh:mmhh:mm", -0.9808292530117262),
+                                    ("minutehour", -2.0794415416798357)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
+                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.8754687373538999),
-                                    ("minuteminute", -2.4849066497880004),
-                                    ("hh:mmhh:mm", -2.4849066497880004),
-                                    ("minutehour", -0.8754687373538999)],
-                               n = 10}}),
+                                   [("hh:mmtime-of-day (latent)", -0.916290731874155),
+                                    ("minuteminute", -2.3025850929940455),
+                                    ("hh:mmhh:mm", -2.3025850929940455),
+                                    ("minutehour", -0.916290731874155)],
+                               n = 8}}),
        ("last n <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -4.007333185232471,
@@ -1440,23 +1441,23 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month> (non ordinal)",
         Classifier{okData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.1780538303479458,
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.1354942159291497,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Aprilinteger (numeric)", -2.4423470353692043),
-                                    ("Februariinteger (numeric)", -1.3437347467010947),
-                                    ("month", -0.832909122935104),
-                                    ("Juliinteger (numeric)", -1.749199854809259)],
+                                   [("Aprilinteger (numeric)", -2.3978952727983707),
+                                    ("Februariinteger (numeric)", -1.2992829841302609),
+                                    ("month", -0.7884573603642702),
+                                    ("Juliinteger (numeric)", -1.7047480922384253)],
                                n = 9},
                    koData =
-                     ClassData{prior = -1.0296194171811581, unseen = -2.772588722239781,
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.9459101490553135,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Augustiinteger (numeric)", -1.0986122886681098),
-                                    ("Aprilinteger (numeric)", -2.0149030205422647),
-                                    ("month", -0.916290731874155)],
-                               n = 5}}),
+                                   [("Aprilinteger (numeric)", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
                      ClassData{prior = -0.1466034741918754, unseen = -3.828641396489095,
@@ -1605,31 +1606,25 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("this <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -3.6888794541139363,
+                     ClassData{prior = -1.0608719606852628, unseen = -3.367295829986474,
                                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},
+                                   [("sommar", -2.2335922215070942),
+                                    ("vinter", -2.2335922215070942), ("day", -1.7227665977411035),
+                                    ("Oktober", -2.2335922215070942), ("hour", -1.9459101490553135),
+                                    ("month", -2.2335922215070942),
+                                    ("week-end", -1.9459101490553135)],
+                               n = 9},
                    koData =
-                     ClassData{prior = -0.3184537311185346, unseen = -4.382026634673881,
+                     ClassData{prior = -0.42488319396526597,
+                               unseen = -3.8066624897703196,
                                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}}),
+                                   [("Tisdag", -3.0910424533583156),
+                                    ("September", -2.174751721484161), ("day", -3.0910424533583156),
+                                    ("Oktober", -1.3862943611198906), ("Mars", -2.6855773452501515),
+                                    ("month", -0.9509762898620451)],
+                               n = 17}}),
        ("within <duration>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
diff --git a/Duckling/Ranking/Classifiers/SW_XX.hs b/Duckling/Ranking/Classifiers/SW_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/SW_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.SW_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/TE_XX.hs b/Duckling/Ranking/Classifiers/TE_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/TE_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.TE_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/TH_XX.hs b/Duckling/Ranking/Classifiers/TH_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/TH_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.TH_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/TR_XX.hs b/Duckling/Ranking/Classifiers/TR_XX.hs
--- a/Duckling/Ranking/Classifiers/TR_XX.hs
+++ b/Duckling/Ranking/Classifiers/TR_XX.hs
@@ -19,4 +19,1270 @@
 import Duckling.Ranking.Types
 
 classifiers :: Classifiers
-classifiers = HashMap.fromList []
+classifiers
+  = HashMap.fromList
+      [("week",
+        Classifier{okData =
+                     ClassData{prior = 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.4302451371066514, unseen = -4.553876891600541,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 93},
+                   koData =
+                     ClassData{prior = -1.0508216248317612, unseen = -3.951243718581427,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 50}}),
+       ("Sal\305",
+        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}}),
+       ("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}}),
+       ("Ramazan Bayram\305",
+        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.3364722366212129, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.157452788691043),
+                                    ("tomorrowevening", -2.8622008809294686),
+                                    ("<day-of-month> (non ordinal) <named-month>part of days",
+                                     -2.8622008809294686),
+                                    ("Pazartesipart of days", -2.8622008809294686),
+                                    ("Cumartesipart of days", -2.8622008809294686),
+                                    ("Cumartesimorning", -2.8622008809294686),
+                                    ("tomorrowlunch", -2.8622008809294686),
+                                    ("tomorrowpart of days", -2.456735772821304),
+                                    ("yesterdayevening", -2.8622008809294686),
+                                    ("yesterdaypart of days", -2.8622008809294686)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.03688192726104),
+                                    ("\350ubatpart of days", -2.4423470353692043),
+                                    ("\350ubatmorning", -2.4423470353692043),
+                                    ("monthhour", -2.03688192726104),
+                                    ("<day-of-month> (non ordinal) <named-month>morning",
+                                     -2.4423470353692043),
+                                    ("Pazartesimorning", -2.4423470353692043)],
+                               n = 4}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -4.060443010546419,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.4039939382192916),
+                                    ("hh:mm", -1.55814461804655),
+                                    ("about|exactly <time-of-day>", -2.9444389791664407),
+                                    ("hour", -1.4039939382192916), ("minute", -1.4039939382192916)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8690378470236094),
+                                    ("about|exactly <time-of-day>", -2.740840023925201),
+                                    ("hour", -0.7949298748698876)],
+                               n = 13}}),
+       ("the ides of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mart", -1.252762968495368), ("month", -0.8472978603872037),
+                                    ("\350ubat", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("g\252n (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -1.3217558399823195, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("Ekim",
+        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}}),
+       ("yaz",
+        Classifier{okData =
+                     ClassData{prior = 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> + '\"",
+        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}}),
+       ("Cuma",
+        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}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -0.6931471805599453),
+                                    ("ordinals (first..31st)\231eyrek y\305l (grain)",
+                                     -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Emek ve Dayan\305\351ma G\252n\252",
+        Classifier{okData =
+                     ClassData{prior = 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.5031035776720805, unseen = -5.69035945432406,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)Cuma",
+                                     -4.993828175779875),
+                                    ("Cuma<named-month> <day-of-month> (non ordinal)",
+                                     -4.993828175779875),
+                                    ("Cumartesiat <time-of-day>", -4.58836306767171),
+                                    ("dayhour", -3.4897507790036),
+                                    ("<day-of-month> (non ordinal) <named-month>Cuma",
+                                     -4.58836306767171),
+                                    ("monthday", -3.3843902633457743),
+                                    ("monthyear", -4.58836306767171),
+                                    ("yearhour", -4.993828175779875),
+                                    ("intersectCuma", -3.7410652072845063),
+                                    ("Ekimintersect", -3.895215887111765),
+                                    ("Per\351embe<datetime> - <datetime> (interval)",
+                                     -4.993828175779875),
+                                    ("Per\351embe<time-of-day> - <time-of-day> (interval)",
+                                     -4.300680995219929),
+                                    ("year<day-of-month> (ordinal)", -4.993828175779875),
+                                    ("intersectat <time-of-day>", -3.895215887111765),
+                                    ("yearintersect", -4.58836306767171),
+                                    ("next <cycle>at <time-of-day>", -4.993828175779875),
+                                    ("intersectSal\305", -4.58836306767171),
+                                    ("Cumaat <time-of-day>", -4.58836306767171),
+                                    ("<day-of-month> (non ordinal) <named-month>Cumartesi",
+                                     -4.993828175779875),
+                                    ("<named-month> <day-of-month> (non ordinal)Pazartesi",
+                                     -4.993828175779875),
+                                    ("Cumartesi<part-of-day> of <time>", -4.58836306767171),
+                                    ("<day-of-month> (non ordinal) <named-month>Pazartesi",
+                                     -4.993828175779875),
+                                    ("yearKurban Bayram\305", -4.07753744390572),
+                                    ("dayday", -2.5959329029815037),
+                                    ("<time> <part-of-day>at <time-of-day>", -4.58836306767171),
+                                    ("last <cycle>Pazar", -4.993828175779875),
+                                    ("hourhour", -4.58836306767171),
+                                    ("yearRamazan Bayram\305", -3.607533814659984),
+                                    ("dayyear", -3.3843902633457743),
+                                    ("<day-of-month> (non ordinal) <named-month>intersect",
+                                     -3.7410652072845063),
+                                    ("EOM|End of dayat <time-of-day>", -4.993828175779875),
+                                    ("<day-of-month> (non ordinal) <named-month>Sal\305",
+                                     -4.993828175779875),
+                                    ("<day-of-month> (ordinal)\199ar\351amba", -4.993828175779875),
+                                    ("before yesterdayat <time-of-day>", -4.993828175779875),
+                                    ("Pazar<day-of-month> (non ordinal) <named-month>",
+                                     -4.993828175779875),
+                                    ("Y\305lba\351\305at <time-of-day>", -4.993828175779875),
+                                    ("at <time-of-day><day-of-month> (non ordinal) <named-month>",
+                                     -4.993828175779875),
+                                    ("hh:mm<day-of-month> (non ordinal) <named-month>",
+                                     -4.993828175779875),
+                                    ("hh:mmintersect", -4.300680995219929),
+                                    ("Ekim<day-of-month> (ordinal)", -4.58836306767171),
+                                    ("at <time-of-day>intersect", -4.300680995219929),
+                                    ("dayminute", -2.7425363771733795),
+                                    ("intersectyear", -4.58836306767171),
+                                    ("minuteday", -2.9789251552376097),
+                                    ("yearCuma", -4.58836306767171),
+                                    ("Ekimyear", -4.58836306767171),
+                                    ("<day-of-month> (ordinal)Sal\305", -4.58836306767171),
+                                    ("intersect<day-of-month> (ordinal)", -4.993828175779875),
+                                    ("intersectintersect", -4.07753744390572),
+                                    ("weekday", -4.58836306767171),
+                                    ("yearday", -2.9143866341000386),
+                                    ("Ramazan Bayram\305year", -4.993828175779875),
+                                    ("next <cycle>\199ar\351amba", -4.993828175779875),
+                                    ("tomorrowat <time-of-day>", -4.993828175779875),
+                                    ("<duration> henceat <time-of-day>", -4.993828175779875),
+                                    ("Per\351embehh:mm", -4.993828175779875),
+                                    ("intersect\199ar\351amba", -4.300680995219929),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -4.300680995219929),
+                                    ("minuteyear", -4.58836306767171),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -3.895215887111765),
+                                    ("yearminute", -4.993828175779875)],
+                               n = 104},
+                   koData =
+                     ClassData{prior = -0.9279867716373464,
+                               unseen = -5.4116460518550396,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Cumartesiat <time-of-day>", -4.7140245909001735),
+                                    ("dayhour", -2.188295946591918),
+                                    ("daymonth", -4.7140245909001735),
+                                    ("monthday", -3.009276498661748),
+                                    ("monthyear", -3.615412302232064),
+                                    ("yearhour", -4.7140245909001735),
+                                    ("intersectCuma", -4.308559482792009),
+                                    ("Per\351embe<datetime> - <datetime> (interval)",
+                                     -4.308559482792009),
+                                    ("Cumaintersect", -4.7140245909001735),
+                                    ("intersectat <time-of-day>", -2.76811444184486),
+                                    ("yearintersect", -4.7140245909001735),
+                                    ("<day-of-month> (ordinal)year", -4.7140245909001735),
+                                    ("Cumaat <time-of-day>", -4.308559482792009),
+                                    ("Martyear", -4.308559482792009),
+                                    ("monthhour", -3.615412302232064),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -4.7140245909001735),
+                                    ("dayday", -3.615412302232064),
+                                    ("\350ubatPazartesi", -4.7140245909001735),
+                                    ("<day-of-month> (ordinal)intersect", -4.7140245909001735),
+                                    ("Temmuz<day-of-month> (ordinal)", -4.7140245909001735),
+                                    ("dayyear", -4.308559482792009),
+                                    ("<day-of-month> (non ordinal) <named-month>intersect",
+                                     -3.7977338590260183),
+                                    ("EOM|End of dayat <time-of-day>", -4.7140245909001735),
+                                    ("monthminute", -3.615412302232064),
+                                    ("Per\351embe<day-of-month> (ordinal)", -4.7140245909001735),
+                                    ("after <time-of-day>at <time-of-day>", -4.7140245909001735),
+                                    ("Temmuzyear", -4.308559482792009),
+                                    ("Nisanyear", -4.7140245909001735),
+                                    ("CumaTemmuz", -4.7140245909001735),
+                                    ("TemmuzCuma", -4.7140245909001735),
+                                    ("last <cycle>at <time-of-day>", -4.7140245909001735),
+                                    ("\350ubatSal\305", -4.7140245909001735),
+                                    ("<day-of-month> (ordinal)hh:mm", -4.020877410340228),
+                                    ("dayminute", -3.2099471941238993),
+                                    ("intersectyear", -4.7140245909001735),
+                                    ("Eyl\252lCuma", -4.7140245909001735),
+                                    ("minuteday", -4.308559482792009),
+                                    ("Eyl\252lintersect", -3.7977338590260183),
+                                    ("intersect<day-of-month> (ordinal)", -4.7140245909001735),
+                                    ("intersectintersect", -4.020877410340228),
+                                    ("Temmuzintersect", -3.4612616224048054),
+                                    ("Eyl\252lCumartesi", -4.7140245909001735),
+                                    ("Per\351embeat <time-of-day>", -4.7140245909001735),
+                                    ("tomorrowat <time-of-day>", -4.7140245909001735),
+                                    ("<datetime> - <datetime> (interval)<day-of-month> (ordinal)",
+                                     -4.308559482792009),
+                                    ("tomorrownoon", -4.7140245909001735)],
+                               n = 68}}),
+       ("y\305l (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}}),
+       ("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 <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.1431008436406733,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("g\252n (grain)", -2.890371757896165),
+                                    ("y\305l (grain)", -2.890371757896165),
+                                    ("hafta (grain)", -1.791759469228055),
+                                    ("day", -2.890371757896165), ("quarter", -2.890371757896165),
+                                    ("year", -2.890371757896165),
+                                    ("\231eyrek y\305l (grain)", -2.890371757896165),
+                                    ("ay (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -2.0149030205422647, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("g\252n (grain)", -1.540445040947149),
+                                    ("day", -1.540445040947149)],
+                               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}}),
+       ("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}}),
+       ("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}}),
+       ("hafta (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.16034265007517937,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
+                   koData =
+                     ClassData{prior = -1.9095425048844386, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("Pazartesi",
+        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}}),
+       ("Nisan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectordinals (first..31st)\199ar\351amba",
+                                     -2.1972245773362196),
+                                    ("<day-of-month> (ordinal)ordinal (digits)year",
+                                     -2.1972245773362196),
+                                    ("monthday", -1.5040773967762742),
+                                    ("dayyear", -2.1972245773362196),
+                                    ("Ekimordinals (first..31st)Sal\305", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)ordinal (digits)time-of-day (latent)",
+                                     -1.791759469228055),
+                                    ("dayhour", -1.791759469228055),
+                                    ("dayyear", -2.1972245773362196),
+                                    ("yearordinals (first..31st)\199ar\351amba",
+                                     -2.1972245773362196),
+                                    ("Per\351embeordinal (digits)year (latent)",
+                                     -2.1972245773362196),
+                                    ("yearday", -2.1972245773362196)],
+                               n = 4}}),
+       ("saniye (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}}),
+       ("Cumartesi",
+        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}}),
+       ("ordinals (first..31st)",
+        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}}),
+       ("Temmuz",
+        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}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.2237754316221157),
+                                    ("hourminute", -1.7346010553881064),
+                                    ("part of daysat <time-of-day>", -1.4469189829363254),
+                                    ("morningat <time-of-day>", -1.7346010553881064),
+                                    ("eveningat <time-of-day>", -2.1400661634962708)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.0986122886681098),
+                                    ("part of daysat <time-of-day>", -1.5040773967762742),
+                                    ("eveningat <time-of-day>", -1.5040773967762742)],
+                               n = 2}}),
+       ("EOY|End of year",
+        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}}),
+       ("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}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8472978603872037), ("evening", -1.252762968495368),
+                                    ("part of days", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> hence",
+        Classifier{okData =
+                     ClassData{prior = -0.2411620568168881,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7578579175523736), ("day", -1.7578579175523736),
+                                    ("year", -2.268683541318364),
+                                    ("<integer> <unit-of-duration>", -0.9694005571881036),
+                                    ("month", -2.6741486494265287),
+                                    ("fortnight", -2.6741486494265287)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.540445040947149, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8718021769015913), ("year", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
+                                    ("minute", -1.8718021769015913)],
+                               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.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("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}}),
+       ("Zafer Bayram\305",
+        Classifier{okData =
+                     ClassData{prior = 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 = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sal\305", -2.0541237336955462), ("Cuma", -2.9704144655697013),
+                                    ("day", -1.8718021769015913),
+                                    ("time-of-day (latent)", -1.466337068793427),
+                                    ("Mart", -2.277267285009756), ("hour", -1.466337068793427),
+                                    ("month", -2.277267285009756)],
+                               n = 16}}),
+       ("Per\351embe",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.3862943611198906),
+                                    ("EOM|End of month", -1.3862943611198906),
+                                    ("month", -1.3862943611198906),
+                                    ("EOM|End of day", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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 = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708), ("second", -1.7346010553881064),
+                                    ("year", -2.1400661634962708),
+                                    ("<integer> <unit-of-duration>", -0.8873031950009028),
+                                    ("hour", -1.7346010553881064)],
+                               n = 6}}),
+       ("quarter",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("y\305l (grain)", -1.791759469228055),
+                                    ("hafta (grain)", -1.791759469228055),
+                                    ("quarter", -1.791759469228055), ("year", -1.791759469228055),
+                                    ("\231eyrek y\305l (grain)", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("hafta (grain)", -1.3862943611198906)],
+                               n = 1}}),
+       ("dakika (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 (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.8232003088081431, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.10536051565782628),
+                                    ("integer (0..9)", -2.3025850929940455)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -0.578077850775158, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2744368457017603),
+                                    ("integer (0..9)", -1.4271163556401458)],
+                               n = 23}}),
+       ("A\287ustos",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 2}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -4.543294782270004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2300144001592104),
+                                    ("integer (numeric)hafta (grain)", -2.740840023925201),
+                                    ("integer (numeric)saniye (grain)", -3.4339872044851463),
+                                    ("integer (0..9)saniye (grain)", -3.4339872044851463),
+                                    ("second", -2.9231615807191553),
+                                    ("integer (numeric)g\252n (grain)", -2.45315795147342),
+                                    ("integer (0..9)g\252n (grain)", -3.8394523125933104),
+                                    ("integer (numeric)y\305l (grain)", -3.8394523125933104),
+                                    ("day", -2.3353749158170367),
+                                    ("integer (0..9)ay (grain)", -3.4339872044851463),
+                                    ("year", -2.740840023925201),
+                                    ("integer (0..9)y\305l (grain)", -2.9231615807191553),
+                                    ("hour", -3.8394523125933104), ("month", -3.4339872044851463),
+                                    ("integer (numeric)dakika (grain)", -2.740840023925201),
+                                    ("integer (0..9)saat (grain)", -3.8394523125933104),
+                                    ("integer (0..9)hafta (grain)", -2.9231615807191553),
+                                    ("minute", -2.45315795147342),
+                                    ("integer (0..9)dakika (grain)", -3.4339872044851463)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -4.248495242049359,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2881963555419462),
+                                    ("integer (numeric)saniye (grain)", -3.1354942159291497),
+                                    ("integer (0..9)saniye (grain)", -3.1354942159291497),
+                                    ("second", -2.624668592163159),
+                                    ("integer (numeric)g\252n (grain)", -3.5409593240373143),
+                                    ("integer (numeric)ay (grain)", -3.5409593240373143),
+                                    ("integer (0..9)g\252n (grain)", -3.5409593240373143),
+                                    ("integer (numeric)y\305l (grain)", -3.1354942159291497),
+                                    ("day", -3.1354942159291497),
+                                    ("integer (0..9)ay (grain)", -3.5409593240373143),
+                                    ("year", -2.624668592163159),
+                                    ("integer (0..9)y\305l (grain)", -3.1354942159291497),
+                                    ("hour", -2.624668592163159), ("month", -3.1354942159291497),
+                                    ("integer (numeric)dakika (grain)", -3.5409593240373143),
+                                    ("integer (0..9)saat (grain)", -3.1354942159291497),
+                                    ("integer (0..9)hafta (grain)", -2.2881963555419462),
+                                    ("minute", -3.1354942159291497),
+                                    ("integer (numeric)saat (grain)", -3.1354942159291497),
+                                    ("integer (0..9)dakika (grain)", -3.5409593240373143)],
+                               n = 24}}),
+       ("Aral\305k",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\199ar\351amba",
+        Classifier{okData =
+                     ClassData{prior = 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 = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -1.2039728043259361),
+                                    ("hourminute", -1.6094379124341003),
+                                    ("at <time-of-day><integer> <unit-of-duration>",
+                                     -1.6094379124341003),
+                                    ("Y\305lba\351\305<integer> <unit-of-duration>",
+                                     -1.2039728043259361)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (10..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}}),
+       ("Kurban Bayram\305",
+        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}}),
+       ("\231eyrek y\305l (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}}),
+       ("hh:mm",
+        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}}),
+       ("ay (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}}),
+       ("Mart",
+        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|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7346010553881064),
+                                    ("hh:mm", -1.4469189829363254), ("minute", -1.041453874828161)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.8718021769015913),
+                                    ("day", -1.8718021769015913),
+                                    ("time-of-day (latent)", -1.8718021769015913),
+                                    ("<day-of-month> (ordinal)", -1.8718021769015913),
+                                    ("hour", -1.466337068793427)],
+                               n = 3}}),
+       ("k\305\351",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7047480922384253), ("day", -1.7047480922384253),
+                                    ("year", -2.3978952727983707),
+                                    ("<integer> <unit-of-duration>", -1.0116009116784799),
+                                    ("month", -2.3978952727983707),
+                                    ("fortnight", -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("<integer> <unit-of-duration>", -1.3862943611198906)],
+                               n = 1}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sal\305", -2.0794415416798357), ("day", -1.1631508098056809),
+                                    ("k\305\351", -1.6739764335716716),
+                                    ("hour", -2.0794415416798357), ("Pazar", -2.0794415416798357),
+                                    ("week-end", -2.0794415416798357)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("EOM|End of month",
+        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}}),
+       ("saat (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}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -2.6026896854443837,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)", -0.40546510810816444),
+                                    ("ordinal (digits)", -1.0986122886681098)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -7.696104113612832e-2,
+                               unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)", -2.8526314299133175),
+                                    ("ordinal (digits)", -5.9423420470800764e-2)],
+                               n = 50}}),
+       ("Atat\252rk\8217\252 Anma, Gen\231lik ve Spor Bayram\305",
+        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 = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("evening",
+        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.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sal\305", -1.466337068793427), ("Cuma", -2.5649493574615367),
+                                    ("day", -1.1786549963416462), ("Mart", -1.8718021769015913),
+                                    ("month", -1.8718021769015913),
+                                    ("ilkbahar", -2.5649493574615367)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eyl\252l",
+        Classifier{okData =
+                     ClassData{prior = 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 <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5686159179138452),
+                                    ("y\305l (grain)", -2.4849066497880004),
+                                    ("hafta (grain)", -1.5686159179138452),
+                                    ("year", -2.4849066497880004),
+                                    ("ay (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.2992829841302609, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135),
+                                    ("g\252n (grain)", -1.540445040947149),
+                                    ("hafta (grain)", -1.9459101490553135),
+                                    ("day", -1.540445040947149)],
+                               n = 3}}),
+       ("Pazar",
+        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}}),
+       ("Cumhuriyet Bayram\305",
+        Classifier{okData =
+                     ClassData{prior = 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.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1972245773362196),
+                                    ("integer (numeric)saniye (grain)", -2.6026896854443837),
+                                    ("integer (0..9)saniye (grain)", -2.6026896854443837),
+                                    ("second", -2.1972245773362196),
+                                    ("integer (numeric)y\305l (grain)", -2.6026896854443837),
+                                    ("year", -2.1972245773362196),
+                                    ("integer (0..9)y\305l (grain)", -2.6026896854443837),
+                                    ("hour", -2.1972245773362196),
+                                    ("integer (0..9)saat (grain)", -2.6026896854443837),
+                                    ("integer (0..9)hafta (grain)", -2.1972245773362196),
+                                    ("integer (numeric)saat (grain)", -2.6026896854443837)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.4277482359480516), ("second", -1.916922612182061),
+                                    ("day", -2.833213344056216),
+                                    ("<integer> <unit-of-duration>", -0.8183103235139514),
+                                    ("hour", -2.833213344056216), ("minute", -1.580450375560848)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -2.70805020110221),
+                                    ("at <time-of-day>hh:mm", -2.70805020110221),
+                                    ("minuteminute", -1.6094379124341003),
+                                    ("hh:mmhh:mm", -2.0149030205422647),
+                                    ("dayday", -2.70805020110221),
+                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
+                                     -2.70805020110221)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.3364722366212129, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.4849066497880004),
+                                    ("monthday", -3.1780538303479458),
+                                    ("hh:mm<day-of-month> (ordinal)", -2.2617630984737906),
+                                    ("year<day-of-month> (ordinal)", -2.772588722239781),
+                                    ("dayday", -3.1780538303479458),
+                                    ("nth <time> of <time><day-of-month> (ordinal)",
+                                     -3.1780538303479458),
+                                    ("nth <time> of <time>hh:mm", -3.1780538303479458),
+                                    ("at <time-of-day><day-of-month> (ordinal)",
+                                     -2.2617630984737906),
+                                    ("dayminute", -3.1780538303479458),
+                                    ("minuteday", -1.791759469228055),
+                                    ("intersect<day-of-month> (ordinal)", -2.772588722239781),
+                                    ("yearday", -2.772588722239781),
+                                    ("A\287ustos<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458)],
+                               n = 15}}),
+       ("fortnight",
+        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}}),
+       ("\350ubat",
+        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> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.9095425048844386),
+                                    ("at <time-of-day>hh:mm", -2.6026896854443837),
+                                    ("minuteminute", -1.6863989535702288),
+                                    ("hh:mmhh:mm", -1.9095425048844386),
+                                    ("hourhour", -2.1972245773362196),
+                                    ("minutehour", -1.6863989535702288),
+                                    ("at <time-of-day>time-of-day (latent)", -1.9095425048844386)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.7047480922384253),
+                                    ("minutehour", -1.2992829841302609),
+                                    ("at <time-of-day>time-of-day (latent)", -1.7047480922384253)],
+                               n = 2}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.772588722239781),
+                                    ("integer (numeric)saniye (grain)", -3.1780538303479458),
+                                    ("integer (0..9)saniye (grain)", -3.1780538303479458),
+                                    ("second", -2.772588722239781),
+                                    ("integer (numeric)g\252n (grain)", -3.1780538303479458),
+                                    ("integer (numeric)ay (grain)", -3.1780538303479458),
+                                    ("integer (0..9)g\252n (grain)", -3.1780538303479458),
+                                    ("integer (numeric)y\305l (grain)", -3.1780538303479458),
+                                    ("day", -2.772588722239781),
+                                    ("integer (0..9)ay (grain)", -3.1780538303479458),
+                                    ("year", -2.772588722239781),
+                                    ("integer (0..9)y\305l (grain)", -3.1780538303479458),
+                                    ("hour", -2.772588722239781), ("month", -2.772588722239781),
+                                    ("integer (numeric)dakika (grain)", -3.1780538303479458),
+                                    ("integer (0..9)saat (grain)", -3.1780538303479458),
+                                    ("integer (0..9)hafta (grain)", -2.772588722239781),
+                                    ("minute", -2.772588722239781),
+                                    ("integer (numeric)saat (grain)", -3.1780538303479458),
+                                    ("integer (0..9)dakika (grain)", -3.1780538303479458)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\350ubatinteger (numeric)", -2.5257286443082556),
+                                    ("A\287ustosinteger (numeric)", -2.120263536200091),
+                                    ("Martinteger (numeric)", -2.5257286443082556),
+                                    ("Martinteger (0..9)", -2.120263536200091),
+                                    ("Nisaninteger (numeric)", -2.5257286443082556),
+                                    ("Temmuzinteger (numeric)", -2.120263536200091),
+                                    ("month", -0.916290731874155)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ilkbahar",
+        Classifier{okData =
+                     ClassData{prior = 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> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)\350ubat", -2.151762203259462),
+                                    ("integer (numeric)Nisan", -3.068052935133617),
+                                    ("integer (numeric)A\287ustos", -2.662587827025453),
+                                    ("integer (numeric)Mart", -2.662587827025453),
+                                    ("integer (numeric)Eyl\252l", -2.662587827025453),
+                                    ("integer (0..9)Mart", -3.068052935133617),
+                                    ("integer (numeric)Temmuz", -2.374905754573672),
+                                    ("month", -0.8708283577973976),
+                                    ("integer (numeric)Aral\305k", -2.662587827025453)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sal\305", -1.252762968495368), ("Cuma", -1.9459101490553135),
+                                    ("Pazartesi", -1.9459101490553135),
+                                    ("day", -0.8472978603872037)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -3.5115454388310208,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -3.0305349495328922e-2,
+                               unseen = -4.204692619390966,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 65}}),
+       ("integer (0..9)",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 34},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("morning",
+        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}}),
+       ("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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sal\305", -1.7227665977411035), ("Cuma", -2.639057329615259),
+                                    ("intersect", -2.639057329615259), ("day", -1.3862943611198906),
+                                    ("Mart", -1.9459101490553135), ("hour", -2.639057329615259),
+                                    ("month", -1.9459101490553135),
+                                    ("EOM|End of day", -2.639057329615259)],
+                               n = 10}}),
+       ("Y\305lba\351\305",
+        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 11..99",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (10..90)integer (0..9)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("for <duration> from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.9808292530117262),
+                                    ("<day-of-month> (non ordinal) <named-month><integer> <unit-of-duration>",
+                                     -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -0.9808292530117262),
+                                    ("Aral\305k<integer> <unit-of-duration>", -0.9808292530117262)],
+                               n = 2}}),
+       ("part of days",
+        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}}),
+       ("Ulusal Egemenlik ve \199ocuk Bayram\305",
+        Classifier{okData =
+                     ClassData{prior = 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 = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer 11..99", -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
+                                   [("at <time-of-day>integer (10..90)", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("EOM|End of day",
+        Classifier{okData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yaz", -2.0149030205422647),
+                                    ("Pazartesi", -2.0149030205422647),
+                                    ("day", -1.3217558399823195),
+                                    ("k\305\351", -2.0149030205422647),
+                                    ("hour", -2.0149030205422647),
+                                    ("week-end", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sal\305", -1.5040773967762742), ("day", -1.5040773967762742)],
+                               n = 1}}),
+       ("before yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/UK_XX.hs b/Duckling/Ranking/Classifiers/UK_XX.hs
--- a/Duckling/Ranking/Classifiers/UK_XX.hs
+++ b/Duckling/Ranking/Classifiers/UK_XX.hs
@@ -19,4 +19,1337 @@
 import Duckling.Ranking.Types
 
 classifiers :: Classifiers
-classifiers = HashMap.fromList []
+classifiers
+  = HashMap.fromList
+      [("\1050\1074\1110\1090\1077\1085\1100",
+        Classifier{okData =
+                     ClassData{prior = 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 = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7693745459478296, unseen = -4.634728988229636,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 101},
+                   koData =
+                     ClassData{prior = -0.6223211279913329, unseen = -4.77912349311153,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 117}}),
+       ("integer (3..19)",
+        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}}),
+       ("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.13976194237515874,
+                               unseen = -4.709530201312334,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clockmorning", -3.6018680771243066),
+                                    ("until <time-of-day>afternoon", -4.007333185232471),
+                                    ("dayhour", -2.503255788456197),
+                                    ("at <time-of-day>evening", -4.007333185232471),
+                                    ("\1074\1095\1086\1088\1072evening", -4.007333185232471),
+                                    ("intersect by ','evening", -3.6018680771243066),
+                                    ("\1089\1100\1086\1075\1086\1076\1085\1110afternoon",
+                                     -4.007333185232471),
+                                    ("intersectevening", -2.2155737160044158),
+                                    ("hourhour", -1.3331845358059422),
+                                    ("\1079\1072\1074\1090\1088\1072lunch", -4.007333185232471),
+                                    ("at <time-of-day>afternoon", -3.6018680771243066),
+                                    ("\1055\1086\1085\1077\1076\1110\1083\1086\1082morning",
+                                     -4.007333185232471),
+                                    ("<time-of-day>  o'clockafternoon", -3.0910424533583156),
+                                    ("until <time-of-day>morning", -4.007333185232471),
+                                    ("minutehour", -3.0910424533583156),
+                                    ("\1089\1100\1086\1075\1086\1076\1085\1110evening",
+                                     -4.007333185232471),
+                                    ("time-of-day (latent)morning", -4.007333185232471),
+                                    ("hh:mmmorning", -4.007333185232471),
+                                    ("time-of-day (latent)evening", -4.007333185232471),
+                                    ("\1079\1072\1074\1090\1088\1072evening", -4.007333185232471),
+                                    ("<time-of-day>  o'clockevening", -3.6018680771243066),
+                                    ("hh:mmnight", -4.007333185232471),
+                                    ("hh:mmafternoon", -4.007333185232471),
+                                    ("on <date>morning", -4.007333185232471),
+                                    ("at <time-of-day>morning", -4.007333185232471),
+                                    ("\1063\1077\1090\1074\1077\1088morning", -4.007333185232471)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.639057329615259),
+                                    ("intersectevening", -2.3513752571634776),
+                                    ("hourhour", -2.128231705849268),
+                                    ("year (latent)afternoon", -3.044522437723423),
+                                    ("year (latent)night", -3.044522437723423),
+                                    ("time-of-day (latent)afternoon", -3.044522437723423)],
+                               n = 6}}),
+       ("numbers prefix with -, minus",
+        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),
+                                    ("decimal number", -1.0216512475319814)],
+                               n = 23}}),
+       ("\1087\1110\1089\1083\1103\1079\1072\1074\1090\1088\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1074\1095\1086\1088\1072",
+        Classifier{okData =
+                     ClassData{prior = 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 = -0.8754687373538999,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -0.5389965007326869, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("\1057\1091\1073\1086\1090\1072",
+        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.1431008436406733, unseen = -4.060443010546419,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.845826690498331),
+                                    ("time-of-day (latent)", -1.3350010667323402),
+                                    ("hh:mm", -2.4336133554004498), ("hour", -0.9075570519054005),
+                                    ("minute", -2.4336133554004498)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -2.0149030205422647, 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.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1057\1091\1073\1086\1090\1072", -2.3978952727983707),
+                                    ("\1057\1077\1088\1077\1076\1072", -2.3978952727983707),
+                                    ("\1053\1077\1076\1110\1083\1103", -2.3978952727983707),
+                                    ("day", -0.8938178760220964),
+                                    ("\1055'\1103\1090\1085\1080\1094\1103", -1.7047480922384253),
+                                    ("\1055\1086\1085\1077\1076\1110\1083\1086\1082",
+                                     -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.639057329615259),
+                                    ("\1057\1091\1073\1086\1090\1072", -2.639057329615259),
+                                    ("\1063\1077\1090\1074\1077\1088", -2.639057329615259),
+                                    ("intersect", -1.540445040947149), ("day", -1.9459101490553135),
+                                    ("hour", -1.7227665977411035),
+                                    ("\1055\1086\1085\1077\1076\1110\1083\1086\1082",
+                                     -2.639057329615259),
+                                    ("minute", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.7047480922384253, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.9459101490553135),
+                                    ("\1041\1077\1088\1077\1079\1077\1085\1100",
+                                     -1.9459101490553135),
+                                    ("month", -1.540445040947149)],
+                               n = 2}}),
+       ("\1074\1077\1089\1085\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6739764335716716),
+                                    ("minuteminute", -1.6739764335716716),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.0794415416798357),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("hourhour", -2.0794415416798357),
+                                    ("minutehour", -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1063\1077\1090\1074\1077\1088",
+        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.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day>  o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.14518200984449783,
+                               unseen = -4.248495242049359,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.03688192726104),
+                                    ("time-of-day (latent)", -1.289667525430819),
+                                    ("until <time-of-day>", -2.847812143477369),
+                                    ("hour", -0.7375989431307791),
+                                    ("after <time-of-day>", -2.847812143477369)],
+                               n = 32},
+                   koData =
+                     ClassData{prior = -2.001480000210124, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 5}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.4350845252893227,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.2719337154836418, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("\1057\1077\1088\1077\1076\1072",
+        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}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.2411620568168881, unseen = -5.817111159963204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1055\1086\1085\1077\1076\1110\1083\1086\1082this <cycle>",
+                                     -5.120983351265121),
+                                    ("hourday", -4.204692619390966),
+                                    ("<datetime> - <datetime> (interval)year", -5.120983351265121),
+                                    ("hh:mm<part-of-day> of <time>", -4.204692619390966),
+                                    ("dayhour", -2.287770007208905),
+                                    ("daymonth", -3.868220382769753),
+                                    ("monthyear", -3.5115454388310208),
+                                    ("yearhour", -5.120983351265121),
+                                    ("intersect<time-of-day>  o'clock", -4.204692619390966),
+                                    ("absorption of , after named daymm/dd/yyyy",
+                                     -5.120983351265121),
+                                    ("<day-of-month> (ordinal)\1041\1077\1088\1077\1079\1077\1085\1100",
+                                     -5.120983351265121),
+                                    ("\1046\1086\1074\1090\1077\1085\1100year", -4.022371062597012),
+                                    ("intersect<time> <part-of-day>", -4.204692619390966),
+                                    ("\1051\1080\1089\1090\1086\1087\1072\1076year",
+                                     -5.120983351265121),
+                                    ("\1057\1077\1088\1077\1076\1072\1046\1086\1074\1090\1077\1085\1100",
+                                     -4.715518243156957),
+                                    ("intersect\1046\1086\1074\1090\1077\1085\1100",
+                                     -5.120983351265121),
+                                    ("intersect by ','year", -4.715518243156957),
+                                    ("\1063\1077\1090\1074\1077\1088hh:mm", -5.120983351265121),
+                                    ("on <date><time-of-day>  o'clock", -5.120983351265121),
+                                    ("\1041\1077\1088\1077\1079\1077\1085\1100year",
+                                     -5.120983351265121),
+                                    ("\1057\1091\1073\1086\1090\1072<time-of-day>  o'clock",
+                                     -5.120983351265121),
+                                    ("mm/dd<time-of-day>  o'clock", -5.120983351265121),
+                                    ("\1057\1077\1088\1077\1076\1072next <cycle>",
+                                     -5.120983351265121),
+                                    ("last <day-of-week> of <time>year", -5.120983351265121),
+                                    ("\1042\1077\1088\1077\1089\1077\1085\1100year",
+                                     -4.715518243156957),
+                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("on <date>at <time-of-day>", -4.715518243156957),
+                                    ("\1063\1077\1090\1074\1077\1088between <time-of-day> and <time-of-day> (interval)",
+                                     -4.204692619390966),
+                                    ("dayday", -2.9809171877688505),
+                                    ("at <time-of-day>\1079\1072\1074\1090\1088\1072",
+                                     -5.120983351265121),
+                                    ("\1057\1091\1073\1086\1090\1072at <time-of-day>",
+                                     -4.715518243156957),
+                                    ("mm/ddat <time-of-day>", -4.715518243156957),
+                                    ("<time> <part-of-day>between <time-of-day> and <time-of-day> (interval)",
+                                     -5.120983351265121),
+                                    ("<day-of-month> (ordinal)intersect", -4.427836170705175),
+                                    ("hourhour", -5.120983351265121),
+                                    ("hh:mmintersect by ','", -5.120983351265121),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -4.715518243156957),
+                                    ("dayyear", -2.869691552658626),
+                                    ("<day-of-month> (ordinal)\1042\1110\1074\1090\1086\1088\1086\1082",
+                                     -5.120983351265121),
+                                    ("<day-of-month> (non ordinal) <named-month>intersect",
+                                     -5.120983351265121),
+                                    ("\1089\1100\1086\1075\1086\1076\1085\1110<time-of-day>  o'clock",
+                                     -5.120983351265121),
+                                    ("minutehour", -3.868220382769753),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -3.7346889901452305),
+                                    ("\1063\1077\1090\1074\1077\1088<part-of-day> of <time>",
+                                     -5.120983351265121),
+                                    ("at <time-of-day><day-of-month> (non ordinal) <named-month>",
+                                     -5.120983351265121),
+                                    ("\1063\1077\1090\1074\1077\1088<datetime> - <datetime> (interval)",
+                                     -5.120983351265121),
+                                    ("hh:mm<day-of-month> (non ordinal) <named-month>",
+                                     -5.120983351265121),
+                                    ("\1063\1077\1090\1074\1077\1088<time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("hh:mmintersect", -5.120983351265121),
+                                    ("intersect by ','intersect", -5.120983351265121),
+                                    ("\1042\1110\1074\1090\1086\1088\1086\1082this <cycle>",
+                                     -5.120983351265121),
+                                    ("dayminute", -3.175073202209808),
+                                    ("<time> <part-of-day>intersect", -5.120983351265121),
+                                    ("intersectyear", -4.022371062597012),
+                                    ("<ordinal> <cycle> of <time>year", -5.120983351265121),
+                                    ("minuteday", -3.616905954488847),
+                                    ("absorption of , after named dayintersect",
+                                     -4.204692619390966),
+                                    ("\1079\1072\1074\1090\1088\1072<time-of-day>  o'clock",
+                                     -5.120983351265121),
+                                    ("year<time-of-day>  o'clock", -5.120983351265121),
+                                    ("<time-of-day>  o'clock\1079\1072\1074\1090\1088\1072",
+                                     -4.715518243156957),
+                                    ("intersect by ','<time> <part-of-day>", -5.120983351265121),
+                                    ("<time> <part-of-day>intersect by ','", -5.120983351265121),
+                                    ("<day-of-month> (ordinal)\1057\1077\1088\1077\1076\1072",
+                                     -5.120983351265121),
+                                    ("mm/ddyear", -4.715518243156957),
+                                    ("intersect by ','<time-of-day>  o'clock", -5.120983351265121),
+                                    ("<time> <part-of-day>\1057\1091\1073\1086\1090\1072",
+                                     -5.120983351265121),
+                                    ("absorption of , after named daymm/dd", -5.120983351265121),
+                                    ("<time> <part-of-day>absorption of , after named day",
+                                     -5.120983351265121),
+                                    ("intersectintersect", -4.715518243156957),
+                                    ("<part-of-day> of <time><day-of-month> (non ordinal) <named-month>",
+                                     -5.120983351265121),
+                                    ("dayweek", -4.204692619390966),
+                                    ("\1079\1072\1074\1090\1088\1072at <time-of-day>",
+                                     -4.715518243156957),
+                                    ("\1057\1077\1088\1077\1076\1072intersect", -5.120983351265121),
+                                    ("weekyear", -4.715518243156957),
+                                    ("\1063\1077\1090\1074\1077\1088<time> timezone",
+                                     -4.715518243156957),
+                                    ("\1089\1100\1086\1075\1086\1076\1085\1110at <time-of-day>",
+                                     -4.204692619390966),
+                                    ("\1089\1100\1086\1075\1086\1076\1085\1110<time> <part-of-day>",
+                                     -5.120983351265121),
+                                    ("\1050\1072\1090\1086\1083\1080\1094\1100\1082\1077 \1056\1110\1079\1076\1074\1086year",
+                                     -5.120983351265121),
+                                    ("\1057\1077\1088\1077\1076\1072this <cycle>",
+                                     -5.120983351265121),
+                                    ("last <cycle> of <time>year", -4.715518243156957),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -4.022371062597012)],
+                               n = 121},
+                   koData =
+                     ClassData{prior = -1.540445040947149, unseen = -5.075173815233827,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -4.375757021660286),
+                                    ("daymonth", -3.2771447329921766),
+                                    ("monthyear", -3.122994053164918),
+                                    ("yearhour", -4.375757021660286),
+                                    ("intersect<time-of-day>  o'clock", -4.375757021660286),
+                                    ("intersect<time> <part-of-day>", -4.375757021660286),
+                                    ("absorption of , after named dayhh:mm", -4.375757021660286),
+                                    ("intersect\1046\1086\1074\1090\1077\1085\1100",
+                                     -4.375757021660286),
+                                    ("\1063\1077\1090\1074\1077\1088hh:mm", -3.970291913552122),
+                                    ("\1041\1077\1088\1077\1079\1077\1085\1100year",
+                                     -3.970291913552122),
+                                    ("\1051\1080\1087\1077\1085\1100intersect", -4.375757021660286),
+                                    ("monthhour", -3.6826098411003407),
+                                    ("dayday", -3.2771447329921766),
+                                    ("\1042\1110\1074\1090\1086\1088\1086\1082after <time-of-day>",
+                                     -4.375757021660286),
+                                    ("<day-of-month> (ordinal)intersect", -4.375757021660286),
+                                    ("dayyear", -2.7663191092261856),
+                                    ("<day-of-month> (ordinal)\1042\1110\1074\1090\1086\1088\1086\1082",
+                                     -3.970291913552122),
+                                    ("\1051\1080\1087\1077\1085\1100year", -3.970291913552122),
+                                    ("dayminute", -3.6826098411003407),
+                                    ("intersectyear", -3.970291913552122),
+                                    ("<day-of-month> (ordinal)\1057\1077\1088\1077\1076\1072",
+                                     -4.375757021660286),
+                                    ("year<time> <part-of-day>", -4.375757021660286),
+                                    ("mm/ddyear", -3.2771447329921766),
+                                    ("on <date>year", -4.375757021660286),
+                                    ("\1057\1077\1088\1077\1076\1072intersect", -4.375757021660286),
+                                    ("\1053\1077\1076\1110\1083\1103intersect", -4.375757021660286),
+                                    ("\1050\1074\1110\1090\1077\1085\1100year", -4.375757021660286),
+                                    ("\1089\1100\1086\1075\1086\1076\1085\1110at <time-of-day>",
+                                     -4.375757021660286),
+                                    ("after <time-of-day>year", -4.375757021660286),
+                                    ("\1056\1110\1079\1076\1074\1086 \1061\1088\1080\1089\1090\1086\1074\1077year",
+                                     -4.375757021660286),
+                                    ("\1053\1077\1076\1110\1083\1103on <date>",
+                                     -3.970291913552122)],
+                               n = 33}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7047480922384253),
+                                    ("ordinals (first..19th)day (grain)\1046\1086\1074\1090\1077\1085\1100",
+                                     -1.7047480922384253),
+                                    ("ordinals (first..19th)week (grain)\1046\1086\1074\1090\1077\1085\1100",
+                                     -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.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   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)", -2.3978952727983707),
+                                    ("year (grain)", -1.9924301646902063),
+                                    ("week (grain)", -1.7047480922384253),
+                                    ("quarter", -2.3978952727983707), ("year", -1.9924301646902063),
+                                    ("month", -2.3978952727983707),
+                                    ("quarter (grain)", -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               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}}),
+       ("mm/dd/yyyy",
+        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}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarteryear", -0.6931471805599453),
+                                    ("ordinals (first..19th)quarter (grain)year",
+                                     -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1051\1080\1087\1077\1085\1100",
+        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}}),
+       ("\1050\1110\1085\1077\1094\1100 \1084\1110\1089\1103\1094\1103",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1079\1080\1084\1072",
+        Classifier{okData =
+                     ClassData{prior = 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.40546510810816444,
+                               unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("dayyear", -1.8971199848858813),
+                                    ("ordinals (first..19th)\1042\1110\1074\1090\1086\1088\1086\1082\1046\1086\1074\1090\1077\1085\1100",
+                                     -2.3025850929940455),
+                                    ("ordinals (first..19th)\1042\1110\1074\1090\1086\1088\1086\1082intersect",
+                                     -2.3025850929940455),
+                                    ("ordinals (first..19th)\1057\1077\1088\1077\1076\1072intersect",
+                                     -1.8971199848858813),
+                                    ("ordinals (first..19th)intersectyear", -1.8971199848858813)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.252762968495368),
+                                    ("ordinals (first..19th)\1057\1077\1088\1077\1076\1072\1046\1086\1074\1090\1077\1085\1100",
+                                     -1.540445040947149),
+                                    ("ordinals (first..19th)\1042\1110\1074\1090\1086\1088\1086\1082\1042\1077\1088\1077\1089\1077\1085\1100",
+                                     -1.9459101490553135)],
+                               n = 3}}),
+       ("\1053\1077\1076\1110\1083\1103",
+        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}}),
+       ("week (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}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -1.2039728043259361),
+                                    ("morning<day-of-month> (non ordinal) <named-month>",
+                                     -2.3025850929940455),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("morningbetween <time-of-day> and <time-of-day> (interval)",
+                                     -2.3025850929940455),
+                                    ("night\1057\1091\1073\1086\1090\1072", -2.3025850929940455),
+                                    ("nightabsorption of , after named day", -2.3025850929940455),
+                                    ("nightintersect by ','", -2.3025850929940455),
+                                    ("nightintersect", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)\1041\1077\1088\1077\1079\1077\1085\1100",
+                                     -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1089\1100\1086\1075\1086\1076\1085\1110",
+        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> after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1057\1077\1088\1077\1076\1072", -1.252762968495368),
+                                    ("day", -0.8472978603872037),
+                                    ("\1055'\1103\1090\1085\1080\1094\1103", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer 2",
+        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.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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2809338454620642),
+                                    ("year (grain)", -2.1972245773362196),
+                                    ("week (grain)", -1.2809338454620642),
+                                    ("quarter", -2.1972245773362196), ("year", -2.1972245773362196),
+                                    ("quarter (grain)", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1053\1086\1074\1080\1081 \1088\1110\1082",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1079\1072\1074\1090\1088\1072",
+        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 (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.35020242943311486,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.237332013101517e-2),
+                                    ("integer (3..19)", -2.833213344056216)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -1.2192402764567243, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3746934494414107),
+                                    ("integer (3..19)", -1.6739764335716716),
+                                    ("integer 2", -2.0794415416798357)],
+                               n = 13}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.19105523676270922,
+                               unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -1.749199854809259, 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),
+                                    ("\1055\1086\1085\1077\1076\1110\1083\1086\1082\1041\1077\1088\1077\1079\1077\1085\1100",
+                                     -1.6094379124341003),
+                                    ("\1053\1077\1076\1110\1083\1103\1041\1077\1088\1077\1079\1077\1085\1100",
+                                     -1.6094379124341003),
+                                    ("\1053\1077\1076\1110\1083\1103intersect",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -1.114360645636249, unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304),
+                                    ("integer 2week (grain)", -3.5553480614894135),
+                                    ("integer (numeric)day (grain)", -2.8622008809294686),
+                                    ("second", -3.5553480614894135),
+                                    ("integer 2hour (grain)", -3.5553480614894135),
+                                    ("integer (numeric)second (grain)", -3.5553480614894135),
+                                    ("integer (numeric)year (grain)", -3.1498829533812494),
+                                    ("day", -2.8622008809294686), ("year", -2.8622008809294686),
+                                    ("integer (3..19)week (grain)", -3.5553480614894135),
+                                    ("integer (numeric)week (grain)", -2.8622008809294686),
+                                    ("hour", -2.8622008809294686), ("month", -3.5553480614894135),
+                                    ("integer (numeric)minute (grain)", -2.456735772821304),
+                                    ("integer (3..19)month (grain)", -3.5553480614894135),
+                                    ("minute", -2.456735772821304),
+                                    ("integer (numeric)hour (grain)", -3.1498829533812494),
+                                    ("integer 2year (grain)", -3.5553480614894135)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.39768296766610944, unseen = -4.74493212836325,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.126760535960395),
+                                    ("integer 2week (grain)", -4.04305126783455),
+                                    ("integer (numeric)day (grain)", -3.349904087274605),
+                                    ("integer (3..19)day (grain)", -4.04305126783455),
+                                    ("integer 2minute (grain)", -4.04305126783455),
+                                    ("second", -3.126760535960395),
+                                    ("integer 2month (grain)", -4.04305126783455),
+                                    ("integer (3..19)second (grain)", -4.04305126783455),
+                                    ("integer (numeric)second (grain)", -3.6375861597263857),
+                                    ("integer (numeric)year (grain)", -3.6375861597263857),
+                                    ("integer (3..19)year (grain)", -4.04305126783455),
+                                    ("day", -2.9444389791664407), ("year", -3.126760535960395),
+                                    ("integer (3..19)week (grain)", -4.04305126783455),
+                                    ("integer 2day (grain)", -4.04305126783455),
+                                    ("integer (numeric)week (grain)", -3.6375861597263857),
+                                    ("integer (3..19)minute (grain)", -4.04305126783455),
+                                    ("hour", -1.791759469228055), ("month", -3.126760535960395),
+                                    ("integer (numeric)minute (grain)", -3.6375861597263857),
+                                    ("integer (3..19)month (grain)", -4.04305126783455),
+                                    ("integer (numeric)month (grain)", -3.6375861597263857),
+                                    ("integer (3..19)hour (grain)", -4.04305126783455),
+                                    ("integer 2second (grain)", -4.04305126783455),
+                                    ("minute", -3.126760535960395),
+                                    ("integer (numeric)hour (grain)", -1.845826690498331),
+                                    ("integer 2year (grain)", -4.04305126783455)],
+                               n = 43}}),
+       ("ordinals (first..19th)",
+        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}}),
+       ("\1042\1077\1088\1077\1089\1077\1085\1100",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearday", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>\1056\1110\1079\1076\1074\1086 \1061\1088\1080\1089\1090\1086\1074\1077",
+                                     -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1041\1077\1088\1077\1079\1077\1085\1100",
+        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}}),
+       ("\1051\1102\1090\1080\1081",
+        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.)? - dd.mm.(yy[yy]?)? (interval)",
+        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}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.5389965007326869,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
+                   koData =
+                     ClassData{prior = -0.8754687373538999,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20}}),
+       ("intersect by ','",
+        Classifier{okData =
+                     ClassData{prior = -6.0624621816434854e-2,
+                               unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1780538303479458),
+                                    ("dayhour", -2.772588722239781),
+                                    ("\1055'\1103\1090\1085\1080\1094\1103mm/dd",
+                                     -3.1780538303479458),
+                                    ("\1055'\1103\1090\1085\1080\1094\1103intersect",
+                                     -2.2617630984737906),
+                                    ("dayday", -1.3862943611198906),
+                                    ("\1057\1077\1088\1077\1076\1072<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -2.772588722239781),
+                                    ("\1055\1086\1085\1077\1076\1110\1083\1086\1082<day-of-month> (non ordinal) <named-month>",
+                                     -2.772588722239781),
+                                    ("\1057\1091\1073\1086\1090\1072<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("minuteday", -2.772588722239781),
+                                    ("\1055'\1103\1090\1085\1080\1094\1103mm/dd/yyyy",
+                                     -3.1780538303479458),
+                                    ("<part-of-day> of <time><day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("\1053\1077\1076\1110\1083\1103<day-of-month> (non ordinal) <named-month>",
+                                     -3.1780538303479458),
+                                    ("\1055'\1103\1090\1085\1080\1094\1103<day-of-month> (non ordinal) <named-month>",
+                                     -2.772588722239781)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -2.833213344056216, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1055'\1103\1090\1085\1080\1094\1103hh:mm",
+                                     -2.1972245773362196),
+                                    ("dayminute", -2.1972245773362196)],
+                               n = 1}}),
+       ("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.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayweek", -0.6931471805599453),
+                                    ("\1053\1077\1076\1110\1083\1103last <cycle>",
+                                     -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.55814461804655), ("day", -1.845826690498331),
+                                    ("year", -2.2512917986064953),
+                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
+                                    ("month", -2.2512917986064953)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1051\1080\1089\1090\1086\1087\1072\1076",
+        Classifier{okData =
+                     ClassData{prior = 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.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1053\1077\1076\1110\1083\1103", -1.0986122886681098),
+                                    ("day", -0.8109302162163288),
+                                    ("\1042\1110\1074\1090\1086\1088\1086\1082",
+                                     -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -1.2039728043259361,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("ordinals (first..19th)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("ordinals (first..19th)", 0.0)],
+                               n = 7}}),
+       ("\1055'\1103\1090\1085\1080\1094\1103",
+        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}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.268683541318364),
+                                    ("<time-of-day>  o'clock", -1.9810014688665833),
+                                    ("\1050\1110\1085\1077\1094\1100 \1084\1110\1089\1103\1094\1103",
+                                     -2.6741486494265287),
+                                    ("time-of-day (latent)", -1.9810014688665833),
+                                    ("hour", -1.0647107369924282), ("month", -2.6741486494265287),
+                                    ("midnight|EOD|end of day", -2.6741486494265287)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm", -1.466337068793427), ("minute", -1.466337068793427)],
+                               n = 2}}),
+       ("\1046\1086\1074\1090\1077\1085\1100",
+        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}}),
+       ("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}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.6109179126442243,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 35}}),
+       ("\1055\1086\1085\1077\1076\1110\1083\1086\1082",
+        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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -2.0794415416798357),
+                                    ("year (grain)", -2.0794415416798357),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.0794415416798357), ("month", -2.0794415416798357)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.793208009442517),
+                                    ("integer (numeric)day (grain)", -3.1986731175506815),
+                                    ("integer (3..19)day (grain)", -3.1986731175506815),
+                                    ("second", -2.793208009442517),
+                                    ("integer (3..19)second (grain)", -3.1986731175506815),
+                                    ("integer (numeric)second (grain)", -3.1986731175506815),
+                                    ("integer (numeric)year (grain)", -3.1986731175506815),
+                                    ("integer (3..19)year (grain)", -3.1986731175506815),
+                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
+                                    ("integer (3..19)week (grain)", -3.1986731175506815),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("integer (3..19)minute (grain)", -3.1986731175506815),
+                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
+                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
+                                    ("integer (3..19)month (grain)", -3.1986731175506815),
+                                    ("integer (numeric)month (grain)", -3.1986731175506815),
+                                    ("integer (3..19)hour (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}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.740840023925201), ("second", -2.740840023925201),
+                                    ("day", -2.740840023925201), ("year", -2.740840023925201),
+                                    ("<integer> <unit-of-duration>", -0.8690378470236094),
+                                    ("hour", -2.0476928433652555), ("minute", -1.6422277352570913)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -2.740840023925201),
+                                    ("minuteminute", -1.6422277352570913),
+                                    ("hh:mmhh:mm", -1.824549292051046),
+                                    ("dayday", -1.824549292051046),
+                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
+                                     -2.3353749158170367),
+                                    ("mm/ddmm/dd", -2.3353749158170367)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -2.120263536200091),
+                                    ("mm/ddmm/dd/yyyy", -2.5257286443082556),
+                                    ("mm/ddhh:mm", -2.120263536200091),
+                                    ("dayday", -2.120263536200091),
+                                    ("mm/ddintersect", -2.5257286443082556),
+                                    ("dayminute", -2.120263536200091),
+                                    ("\1057\1077\1088\1087\1077\1085\1100<day-of-month> (non ordinal) <named-month>",
+                                     -2.5257286443082556),
+                                    ("\1051\1080\1087\1077\1085\1100<day-of-month> (non ordinal) <named-month>",
+                                     -2.5257286443082556)],
+                               n = 6}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.7047480922384253),
+                                    ("minuteminute", -1.2992829841302609),
+                                    ("hh:mmhh:mm", -1.2992829841302609),
+                                    ("minutehour", -1.7047480922384253)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.791759469228055),
+                                    ("hourminute", -1.3862943611198906),
+                                    ("minutehour", -1.791759469228055),
+                                    ("time-of-day (latent)hh:mm", -1.3862943611198906)],
+                               n = 3}}),
+       ("\1057\1077\1088\1087\1077\1085\1100",
+        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 n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.639057329615259),
+                                    ("integer 2week (grain)", -3.044522437723423),
+                                    ("integer (numeric)day (grain)", -3.044522437723423),
+                                    ("integer 2minute (grain)", -3.044522437723423),
+                                    ("second", -2.639057329615259),
+                                    ("integer 2month (grain)", -3.044522437723423),
+                                    ("integer (numeric)second (grain)", -3.044522437723423),
+                                    ("integer (numeric)year (grain)", -3.044522437723423),
+                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
+                                    ("integer 2day (grain)", -3.044522437723423),
+                                    ("integer (numeric)week (grain)", -3.044522437723423),
+                                    ("month", -2.639057329615259),
+                                    ("integer (numeric)minute (grain)", -3.044522437723423),
+                                    ("integer (numeric)month (grain)", -3.044522437723423),
+                                    ("integer 2second (grain)", -3.044522437723423),
+                                    ("minute", -2.639057329615259),
+                                    ("integer 2year (grain)", -3.044522437723423)],
+                               n = 12},
+                   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)\1042\1110\1074\1090\1086\1088\1086\1082intersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..19th)\1042\1110\1074\1090\1086\1088\1086\1082\1050\1072\1090\1086\1083\1080\1094\1100\1082\1077 \1056\1110\1079\1076\1074\1086",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("\1056\1110\1079\1076\1074\1086 \1061\1088\1080\1089\1090\1086\1074\1077",
+        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}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)\1051\1080\1087\1077\1085\1100",
+                                     -2.3608540011180215),
+                                    ("integer (numeric)\1050\1074\1110\1090\1077\1085\1100",
+                                     -3.2771447329921766),
+                                    ("integer (numeric)\1041\1077\1088\1077\1079\1077\1085\1100",
+                                     -2.3608540011180215),
+                                    ("integer (numeric)\1051\1102\1090\1080\1081",
+                                     -1.7730673362159024),
+                                    ("integer (numeric)\1057\1077\1088\1087\1077\1085\1100",
+                                     -2.3608540011180215),
+                                    ("month", -0.7922380832041762),
+                                    ("integer (numeric)\1042\1077\1088\1077\1089\1077\1085\1100",
+                                     -2.871679624884012)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)\1051\1080\1087\1077\1085\1100",
+                                     -1.2992829841302609),
+                                    ("month", -1.2992829841302609)],
+                               n = 2}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1057\1077\1088\1077\1076\1072", -1.6094379124341003),
+                                    ("day", -0.916290731874155),
+                                    ("\1055\1086\1085\1077\1076\1110\1083\1086\1082",
+                                     -1.6094379124341003),
+                                    ("\1042\1110\1074\1090\1086\1088\1086\1082",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.540445040947149),
+                                    ("day (grain)intersect", -1.9459101490553135),
+                                    ("day (grain)\1046\1086\1074\1090\1077\1085\1100",
+                                     -1.9459101490553135),
+                                    ("weekmonth", -1.540445040947149),
+                                    ("week (grain)intersect", -1.9459101490553135),
+                                    ("week (grain)\1042\1077\1088\1077\1089\1077\1085\1100",
+                                     -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               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}}),
+       ("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}}),
+       ("\1042\1110\1074\1090\1086\1088\1086\1082",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.55814461804655),
+                                    ("time-of-day (latent)", -1.55814461804655),
+                                    ("hour", -0.9985288301111273)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.8718021769015913),
+                                    ("day", -1.1786549963416462),
+                                    ("\1056\1110\1079\1076\1074\1086 \1061\1088\1080\1089\1090\1086\1074\1077",
+                                     -1.8718021769015913),
+                                    ("\1050\1072\1090\1086\1083\1080\1094\1100\1082\1077 \1056\1110\1079\1076\1074\1086",
+                                     -1.8718021769015913)],
+                               n = 3}}),
+       ("day (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}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1051\1080\1087\1077\1085\1100", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1083\1110\1090\1086",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1087\1086\1079\1072\1074\1095\1086\1088\1072",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1050\1072\1090\1086\1083\1080\1094\1100\1082\1077 \1056\1110\1079\1076\1074\1086",
+        Classifier{okData =
+                     ClassData{prior = 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.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1074\1077\1089\1085\1072", -1.9459101490553135),
+                                    ("\1079\1080\1084\1072", -1.9459101490553135),
+                                    ("day", -1.252762968495368), ("hour", -1.9459101490553135),
+                                    ("week-end", -1.9459101490553135),
+                                    ("\1083\1110\1090\1086", -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.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/VI_XX.hs b/Duckling/Ranking/Classifiers/VI_XX.hs
--- a/Duckling/Ranking/Classifiers/VI_XX.hs
+++ b/Duckling/Ranking/Classifiers/VI_XX.hs
@@ -41,11 +41,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.4986303506721723, unseen = -4.61512051684126,
+                     ClassData{prior = -0.5108256237659907, 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}}),
+                     ClassData{prior = -0.916290731874155, unseen = -4.219507705176107,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 66}}),
        ("exactly <time-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
@@ -77,8 +77,8 @@
                                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},
+                     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}}),
@@ -93,34 +93,31 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
        ("<part-of-day> <time>",
         Classifier{okData =
-                     ClassData{prior = -0.7884573603642702,
-                               unseen = -3.5553480614894135,
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4657359027997265,
                                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)],
+                                   [("hourday", -1.0360919316867756),
+                                    ("noonh\244m nay", -2.740840023925201),
+                                    ("lunchng\224y mai", -2.3353749158170367),
+                                    ("noonng\224y h\244m qua", -2.3353749158170367),
+                                    ("morningSunday", -2.740840023925201),
+                                    ("noonng\224y mai", -2.3353749158170367),
+                                    ("afternoonng\224y dd/mm", -2.740840023925201),
+                                    ("afternoonng\224y mai", -2.740840023925201)],
                                n = 10},
                    koData =
-                     ClassData{prior = -0.6061358035703156,
-                               unseen = -3.6635616461296463,
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.0910424533583156,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourday", -1.072636802264849),
+                                   [("hourday", -1.252762968495368),
                                     ("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}}),
+                                     -1.9459101490553135),
+                                    ("afternoonng\224y dd/mm/yyyy", -2.3513752571634776),
+                                    ("afternoonng\224y dd/mm", -2.3513752571634776),
+                                    ("afternoonintersect", -2.3513752571634776)],
+                               n = 5}}),
        ("tonight",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -178,11 +175,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("gi\225ng sinh",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
                    koData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("hour (grain)",
         Classifier{okData =
                      ClassData{prior = -1.791759469228055, unseen = -1.791759469228055,
@@ -193,95 +190,85 @@
                                likelihoods = HashMap.fromList [("", 0.0)], n = 20}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.5070449009260846, unseen = -5.049856007249537,
+                     ClassData{prior = -0.24921579162398486,
+                               unseen = -5.017279836814924,
                                likelihoods =
                                  HashMap.fromList
                                    [("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm",
-                                     -3.657130755799356),
-                                    ("hourday", -3.657130755799356),
-                                    ("dayhour", -4.350277936359301),
+                                     -3.624340932976365),
+                                    ("hourday", -3.624340932976365), ("dayhour", -4.31748811353631),
                                     ("h\244m nay<time-of-day> s\225ng|chi\7873u|t\7889i",
-                                     -4.350277936359301),
-                                    ("monthyear", -3.4339872044851463),
-                                    ("Wednesdaynext <cycle>", -4.350277936359301),
+                                     -4.31748811353631),
+                                    ("monthyear", -3.4011973816621555),
+                                    ("Wednesdaynext <cycle>", -4.31748811353631),
                                     ("Tuesday<day-of-month> (numeric with day symbol) <named-month>",
-                                     -4.350277936359301),
-                                    ("time-of-day gi\7901<part-of-day> <time>", -4.350277936359301),
+                                     -4.31748811353631),
+                                    ("time-of-day gi\7901<part-of-day> <time>", -4.31748811353631),
                                     ("Sunday<day-of-month> (numeric with day symbol) <named-month>",
-                                     -3.9448128282511368),
-                                    ("time-of-day gi\7901<time> n\224y", -4.350277936359301),
+                                     -3.912023005428146),
+                                    ("time-of-day gi\7901<time> n\224y", -4.31748811353631),
                                     ("month (numeric with month symbol)year (numeric with year symbol)",
-                                     -3.657130755799356),
-                                    ("dayday", -2.645529844120876),
-                                    ("hourhour", -3.4339872044851463),
+                                     -3.624340932976365),
+                                    ("dayday", -2.6127400212978853),
+                                    ("hourhour", -3.4011973816621555),
                                     ("intersectyear (numeric with year symbol)",
-                                     -3.657130755799356),
-                                    ("dayyear", -2.4784757594577096),
+                                     -3.624340932976365),
+                                    ("dayyear", -2.445685936634719),
                                     ("<ordinal> <cycle> of <time>year (numeric with year symbol)",
-                                     -4.350277936359301),
-                                    ("minutehour", -3.9448128282511368),
+                                     -4.31748811353631),
+                                    ("minutehour", -3.912023005428146),
                                     ("<time-of-day> s\225ng|chi\7873u|t\7889iintersect",
-                                     -3.9448128282511368),
-                                    ("Thursdaynext <cycle>", -3.9448128282511368),
-                                    ("Octoberyear (numeric with year symbol)", -4.350277936359301),
+                                     -3.912023005428146),
+                                    ("Thursdaynext <cycle>", -3.912023005428146),
+                                    ("Octoberyear (numeric with year symbol)", -4.31748811353631),
                                     ("time-of-day gi\7901<part-of-day> (h\244m )?nay",
-                                     -4.350277936359301),
+                                     -4.31748811353631),
                                     ("<day-of-month> (numeric with day symbol) <named-month>year (numeric with year symbol)",
-                                     -3.2516656476911914),
+                                     -3.2188758248682006),
                                     ("<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),
+                                     -3.4011973816621555),
+                                    ("time-of-day gi\7901tonight", -4.31748811353631),
+                                    ("minuteday", -2.8134107167600364),
+                                    ("hh:mm<part-of-day> <time>", -4.31748811353631),
                                     ("<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),
+                                     -3.2188758248682006),
+                                    ("Fridaythis <cycle>", -3.912023005428146),
+                                    ("Thursdaythis <cycle>", -4.31748811353631),
+                                    ("at hh:mm<part-of-day> <time>", -4.31748811353631),
+                                    ("dayweek", -3.0647251450409425),
+                                    ("weekyear", -4.31748811353631),
                                     ("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm/yyyy",
-                                     -4.350277936359301),
+                                     -4.31748811353631),
                                     ("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y mai",
-                                     -4.350277936359301),
-                                    ("Tuesdayintersect", -4.350277936359301),
+                                     -4.31748811353631),
+                                    ("Tuesdayintersect", -4.31748811353631),
                                     ("Monday<day-of-month> (numeric with day symbol) <named-month>",
-                                     -3.0975149678639333),
-                                    ("seasonthis <cycle>", -4.350277936359301),
-                                    ("minuteyear", -3.9448128282511368)],
+                                     -3.0647251450409425),
+                                    ("seasonthis <cycle>", -4.31748811353631),
+                                    ("minuteyear", -3.912023005428146)],
                                n = 53},
                    koData =
-                     ClassData{prior = -0.9219887529887928, unseen = -4.787491742782046,
+                     ClassData{prior = -1.5114575040738967, unseen = -4.31748811353631,
                                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),
+                                     -3.6109179126442243),
+                                    ("hourday", -2.3581549441488563),
+                                    ("dayhour", -3.6109179126442243),
+                                    ("monthyear", -2.3581549441488563),
+                                    ("noonh\244m nay", -3.6109179126442243),
+                                    ("houryear", -3.6109179126442243),
                                     ("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),
+                                     -2.3581549441488563),
+                                    ("dayyear", -3.6109179126442243),
+                                    ("h\244m naytime-of-day gi\7901", -3.6109179126442243),
                                     ("<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),
+                                     -3.6109179126442243),
+                                    ("noonng\224y h\244m qua", -3.20545280453606),
+                                    ("noonng\224y mai", -3.20545280453606),
                                     ("<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}}),
+                                     -3.6109179126442243)],
+                               n = 15}}),
        ("time-of-day gi\7901",
         Classifier{okData =
                      ClassData{prior = -6.453852113757118e-2,
@@ -438,23 +425,14 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<time> tr\432\7899c",
         Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.3025850929940455,
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -1.5040773967762742), ("Tuesday", -1.5040773967762742)],
+                                   [("day", -0.6931471805599453), ("Tuesday", -0.6931471805599453)],
                                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}}),
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("ng\224y dd/mm/yyyy",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -507,26 +485,23 @@
                                n = 13}}),
        ("<time> t\7899i",
         Classifier{okData =
-                     ClassData{prior = -0.4700036292457356,
-                               unseen = -3.0910424533583156,
+                     ClassData{prior = -0.3364722366212129, unseen = -3.044522437723423,
                                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)],
+                                   [("Monday", -1.8971199848858813),
+                                    ("month (numeric with month symbol)", -2.3025850929940455),
+                                    ("Friday", -2.3025850929940455), ("day", -1.3862943611198906),
+                                    ("month", -2.3025850929940455),
+                                    ("Tuesday", -2.3025850929940455)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.9808292530117262, unseen = -2.890371757896165,
+                     ClassData{prior = -1.252762968495368, unseen = -2.70805020110221,
                                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 gi\7901", -1.9459101490553135),
+                                    ("<hour-of-day> <integer>", -1.9459101490553135),
+                                    ("hour", -1.9459101490553135), ("minute", -1.9459101490553135)],
+                               n = 2}}),
        ("<time-of-day> s\225ng|chi\7873u|t\7889i",
         Classifier{okData =
                      ClassData{prior = -5.129329438755058e-2,
@@ -613,8 +588,8 @@
                      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}}),
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
        ("Sunday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
@@ -678,20 +653,20 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("time-of-day (latent)",
         Classifier{okData =
-                     ClassData{prior = -0.6567795363890705,
-                               unseen = -3.4339872044851463,
+                     ClassData{prior = -0.579818495252942, 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,
+                     ClassData{prior = -0.8209805520698302,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -0.4989911661189879),
-                                    ("integer (0..19)", -0.9343092373768334)],
-                               n = 26}}),
+                                   [("integer (numeric)", -0.3448404862917295),
+                                    ("integer (0..19)", -1.2321436812926323)],
+                               n = 22}}),
        ("at hh:mm",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
diff --git a/Duckling/Ranking/Classifiers/ZH_CN.hs b/Duckling/Ranking/Classifiers/ZH_CN.hs
--- a/Duckling/Ranking/Classifiers/ZH_CN.hs
+++ b/Duckling/Ranking/Classifiers/ZH_CN.hs
@@ -21,928 +21,1555 @@
 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}}),
-       ("\22269\38469\28040\36153\32773\26435\30410\26085",
-        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}}),
-       ("\24314\20891\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -1.0076405104623831,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -0.45425527227759643,
-                               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}}),
-       ("number suffix: \21313",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               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}}),
-       ("\20803\26086",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -3.367295829986474),
-                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.7578579175523736),
-                                    ("dayday", -1.6094379124341003),
-                                    ("hourhour", -3.367295829986474),
-                                    ("hourminute", -3.367295829986474),
-                                    ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.6094379124341003),
-                                    ("dayminute", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.367295829986474),
-                                    ("yearday", -1.7578579175523736)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -2.065455299705096),
-                                    ("dayhour", -2.653241964607215),
-                                    ("daymonth", -2.1832383353614793),
-                                    ("year (numeric with year symbol)February", -3.164067588373206),
-                                    ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.164067588373206),
-                                    ("hourhour", -3.164067588373206),
-                                    ("year (numeric with year symbol)March", -2.653241964607215),
-                                    ("hourminute", -2.653241964607215),
-                                    ("yearmonth", -2.316769727986002),
-                                    ("dayminute", -2.653241964607215),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -2.653241964607215),
-                                    ("absorption of , after named dayFebruary",
-                                     -2.1832383353614793)],
-                               n = 27}}),
-       ("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}}),
-       ("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.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.4170660197866443, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3350010667323402),
-                                    ("integer (0..10)", -0.3794896217049037)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.2776317365982795,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -2.3608540011180215),
-                                    ("integer (0..10)", -0.28141245943818544),
-                                    ("<number>\20010/\20491", -1.890850371872286)],
-                               n = 50}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
-                                    ("monthday", -0.7308875085427924),
-                                    ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.0986122886681098)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = -0.10763066419236544,
-                               unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1631508098056809),
-                                    ("number suffix: \21313", -2.2617630984737906),
-                                    ("integer (0..10)", -0.5753641449035618)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -2.2823823856765264,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
-                               n = 5}}),
-       ("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}}),
-       ("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}}),
-       ("\24858\20154\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 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 = -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}}),
-       ("\28595\38376\22238\24402\32426\24565\26085",
-        Classifier{okData =
-                     ClassData{prior = 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 <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}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("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 = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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 = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7487170317147561),
-                                    ("national dayevening|night", -3.20545280453606),
-                                    ("<named-month> <day-of-month>morning", -1.2595426554807467),
-                                    ("\24773\20154\33410evening|night", -3.20545280453606),
-                                    ("\20799\31461\33410afternoon", -3.20545280453606),
-                                    ("Mondaymorning", -2.10684051586795)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<part-of-day> <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
-                                    ("hourhour", -1.3523928094442093),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.6625477377480489),
-                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
-                                    ("hourminute", -1.575536360758419),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -2.6741486494265287),
-                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -0.7841189587656721,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -1.4271163556401458),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.5141277326297755),
-                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
-                                    ("hourminute", -1.5141277326297755),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -1.9661128563728327)],
-                               n = 21}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.905361848054571,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6837575085331653),
-                                    ("integer (0..10)month (grain)", -2.535337503414892),
-                                    ("integer (0..10)hour (grain)", -3.06941998934515),
-                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
-                                    ("second", -3.2635760037861075),
-                                    ("integer (0..10)day (grain)", -3.06941998934515),
-                                    ("number suffix: \21313month (grain)", -4.293195420967266),
-                                    ("integer (0..10)year (grain)", -3.6000482404073204),
-                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
-                                    ("integer (numeric)year (grain)", -3.1945831322991562),
-                                    ("integer (0..10)second (grain)", -3.2635760037861075),
-                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
-                                    ("integer (0..10)minute (grain)", -3.06941998934515),
-                                    ("hour", -2.8581108956779433),
-                                    ("integer (0..10)week (grain)", -3.1945831322991562),
-                                    ("month", -1.7754989483562746),
-                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
-                                    ("integer (numeric)month (grain)", -3.1945831322991562),
-                                    ("minute", -3.06941998934515)],
-                               n = 173}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
-                               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}}),
-       ("number suffix: \19975",
-        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}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
-                                     -0.7801585575495751),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)number suffix: \21313",
-                                     -1.3862943611198906),
-                                    ("<integer> (latent time-of-day)integer (0..10)",
-                                     -1.3862943611198906),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
-                                    ("dayday", -0.7270487322356266)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("SundayFebruary", -0.8109302162163288)],
-                               n = 7}}),
-       ("integer with consecutive unit modifiers",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
-                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               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}}),
-       ("\22307\35806\33410",
-        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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2286654169163076,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
-                                    ("Tuesday", -1.6422277352570913)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("month (numeric with month symbol)", -2.5649493574615367),
-                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
-                               n = 29}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               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}}),
-       ("\22919\22899\33410",
-        Classifier{okData =
-                     ClassData{prior = 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 = -1.6486586255873816, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.21357410029805904,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -2.1000608288825715),
-                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
-                                    ("month (numeric with month symbol)", -3.1986731175506815),
-                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
-                                    ("month", -3.1986731175506815)],
-                               n = 21}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4079456086518722),
-                                    ("integer (0..10)hour (grain)", -2.659260036932778),
-                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
-                                    ("second", -2.8134107167600364),
-                                    ("integer (0..10)day (grain)", -2.5257286443082556),
-                                    ("integer (0..10)year (grain)", -3.2188758248682006),
-                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
-                                    ("integer (0..10)second (grain)", -2.8134107167600364),
-                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
-                                    ("integer (0..10)minute (grain)", -2.659260036932778),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.8134107167600364),
-                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
-                                    ("minute", -2.659260036932778)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\19975\22307\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\20799\31461\33410",
-        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}}),
-       ("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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -5.231108616854587,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Marchinteger (0..10)", -3.4339872044851463),
-                                    ("Marchinteger (numeric)", -4.127134385045092),
-                                    ("month (numeric with month symbol)integer (numeric)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger (0..10)", -3.146305132033365),
-                                    ("month (numeric with month symbol)number suffix: \21313",
-                                     -3.146305132033365),
-                                    ("month", -0.7371103039810614),
-                                    ("month (numeric with month symbol)integer (0..10)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
-                               n = 88},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\21171\21160\33410",
-        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..10)",
-        Classifier{okData =
-                     ClassData{prior = -0.4090429294560484, unseen = -5.236441962829949,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
-                   koData =
-                     ClassData{prior = -1.0914948208992459, unseen = -4.564348191467836,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 94}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9856819377004897),
-                                    ("integer (0..10)month (grain)", -3.4965075614664802),
-                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
-                                    ("second", -2.649209701079277),
-                                    ("integer (0..10)day (grain)", -2.9856819377004897),
-                                    ("integer (0..10)year (grain)", -3.4965075614664802),
-                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
-                                    ("integer (0..10)second (grain)", -2.649209701079277),
-                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
-                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
-                                    ("hour", -2.3978952727983707),
-                                    ("integer (0..10)week (grain)", -2.9856819377004897),
-                                    ("month", -2.1972245773362196),
-                                    ("minute", -2.3978952727983707)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
-                               n = 4}}),
-       ("n <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4159137783010487),
-                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (0..10)day (grain)", -2.4159137783010487),
-                                    ("integer (0..10)year (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
-                                    ("integer (0..10)second (grain)", -2.9267394020670396),
-                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
-                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
-                                    ("hour", -2.4159137783010487),
-                                    ("integer (0..10)week (grain)", -2.9267394020670396),
-                                    ("month", -2.9267394020670396),
-                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
-                                    ("minute", -2.9267394020670396)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               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}}),
-       ("<number>\20010/\20491",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\24773\20154\33410",
-        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 <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}})]
+      [("\25490\28783\33410",
+        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}}),
+       ("\19996\27491\25945\26837\26525\20027\26085",
+        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}}),
+       ("number of 5 minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8979415932059586),
+                                    ("hour", -0.7308875085427924),
+                                    ("<integer> (latent time-of-day)<number>\20010/\20491",
+                                     -2.1972245773362196)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8109302162163288),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("\21360\24230\20016\25910\33410\31532\22235\22825",
+        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> 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.4700036292457356,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67}}),
+       ("\21355\22622\33410",
+        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 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}}),
+       ("\22269\38469\28040\36153\32773\26435\30410\26085",
+        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}}),
+       ("\24314\20891\33410",
+        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}}),
+       ("\29369\22826\26032\24180",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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.963437510299857, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -0.48058573857627246,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -1.466337068793427, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.262364264467491, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 30}}),
+       ("national day",
+        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}}),
+       ("integer (20,30,40)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\21360\24230\20016\25910\33410\31532\19977\22825",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("\22307\20250\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20803\26086",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("\32654\22269\29420\31435\26085",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -5.694137640013845e-2,
+                               unseen = -6.329720905522696,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -4.718498871295094),
+                                    ("year (numeric with year symbol)\20809\26126\33410",
+                                     -4.248495242049359),
+                                    ("xxxx year<named-month> <day-of-month>", -4.941642422609305),
+                                    ("daymonth", -4.248495242049359),
+                                    ("monthday", -1.9459101490553135),
+                                    ("next yearSeptember", -5.2293244950610855),
+                                    ("year (numeric with year symbol)\25995\26376",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)\20061\22812\33410",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)February", -4.718498871295094),
+                                    ("xxxx yearintersect", -4.941642422609305),
+                                    ("March<time> <day-of-month>", -3.7629874262676584),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -3.494723439672979),
+                                    ("monthhour", -3.7629874262676584),
+                                    ("year (numeric with year symbol)\22320\29699\19968\23567\26102",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)April", -5.2293244950610855),
+                                    ("dayday", -2.284885515894645),
+                                    ("hourhour", -4.718498871295094),
+                                    ("xxxx yearFebruary", -5.634789603169249),
+                                    ("year (numeric with year symbol)March", -4.1307122063929755),
+                                    ("February<dim time> <part-of-day>", -3.7629874262676584),
+                                    ("hourminute", -4.718498871295094),
+                                    ("April<time> <day-of-month>", -5.2293244950610855),
+                                    ("February<time> <day-of-month>", -2.614364717024887),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -3.619886582626985),
+                                    ("year (numeric with year symbol)\22823\25995\26399",
+                                     -4.941642422609305),
+                                    ("this <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("year (numeric with year symbol)\22235\26092\33410",
+                                     -5.2293244950610855),
+                                    ("yearmonth", -3.332204510175204),
+                                    ("year (numeric with year symbol)\20303\26842\33410",
+                                     -5.2293244950610855),
+                                    ("dayminute", -4.718498871295094),
+                                    ("next <cycle>September", -5.634789603169249),
+                                    ("intersect by \",\"<time> <day-of-month>", -3.619886582626985),
+                                    ("xxxx yearMarch", -5.634789603169249),
+                                    ("absorption of , after named dayintersect",
+                                     -3.619886582626985),
+                                    ("intersect<time> <day-of-month>", -2.8015762591130335),
+                                    ("next <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("tonight<time-of-day> o'clock", -4.718498871295094),
+                                    ("year (numeric with year symbol)intersect",
+                                     -3.494723439672979),
+                                    ("yearday", -2.0794415416798357),
+                                    ("absorption of , after named dayFebruary", -4.248495242049359),
+                                    ("year (numeric with year symbol)\19971\19971\33410",
+                                     -4.248495242049359),
+                                    ("year (numeric with year symbol)\36926\36234\33410",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)\29369\22826\26032\24180",
+                                     -5.2293244950610855),
+                                    ("yearminute", -5.2293244950610855),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -4.718498871295094)],
+                               n = 256},
+                   koData =
+                     ClassData{prior = -2.894068619777491, unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -2.159484249353372),
+                                    ("dayhour", -2.7472709142554916),
+                                    ("year (numeric with year symbol)Sunday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day><time-of-day> o'clock",
+                                     -3.258096538021482),
+                                    ("hourhour", -3.258096538021482),
+                                    ("hourminute", -2.7472709142554916),
+                                    ("dayminute", -2.7472709142554916),
+                                    ("yearday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.7472709142554916)],
+                               n = 15}}),
+       ("half after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20399\20029\33410",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.625967214385311, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.21905356606268464,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("Saturday",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.570544858467613, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -1.5198257537444133),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.367123614131617), ("month", -1.5198257537444133)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.832909122935104, 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}}),
+       ("\22307\27583\34987\27585\26085",
+        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 <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}}),
+       ("\35199\36203\25176\25289\33410",
+        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}}),
+       ("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}}),
+       ("\20811\21704\29305\26222\36838\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21313\32988\33410",
+        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}}),
+       ("evening|night",
+        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}}),
+       ("\20303\26842\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\19977\19968\20027\26085",
+        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}}),
+       ("\30331\38660\33410",
+        Classifier{okData =
+                     ClassData{prior = 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.15415067982725836,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("\19971\19971\33410",
+        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.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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3564413979702095),
+                                    ("integer (20,30,40)", -3.0910424533583156),
+                                    ("integer with consecutive unit modifiers", -1.245215762859985),
+                                    ("integer (0..10)", -1.4170660197866443),
+                                    ("number suffix: \21313|\25342", -2.1102132003465894),
+                                    ("compose by multiplication", -3.0910424533583156)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.5105920777974677,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)", -0.3629054936893685),
+                                    ("number suffix: \21313|\25342", -2.03688192726104)],
+                               n = 17}}),
+       ("\19996\27491\25945\22797\27963\33410",
+        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}}),
+       ("hh:mm (time-of-day)",
+        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}}),
+       ("relative (1-9) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2754119798599665,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.174751721484161),
+                                    ("integer (0..10)", -0.1466034741918754)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -1.4240346891027378, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("one point 2", -1.1631508098056809)],
+                               n = 13}}),
+       ("\36926\36234\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -0.6931471805599453),
+                                    ("monthday", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22235\26092\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19996\27491\25945\22307\21608\20845",
+        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}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20016\25910\33410",
+        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}}),
+       ("\20809\26126\33410",
+        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 (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}}),
+       ("relative (10-59) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)compose by multiplication",
+                                     -2.164963715117998),
+                                    ("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.9753796482441617),
+                                    ("hour", -0.7435780341868373)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)number suffix: \21313|\25342",
+                                     -1.413693335308005),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.413693335308005),
+                                    ("hour", -0.7777045685880083)],
+                               n = 16}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 47},
+                   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}}),
+       ("\22823\25995\26399",
+        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}}),
+       ("\24858\20154\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\29369\22826\26893\26641\33410",
+        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}}),
+       ("\19996\27491\25945\22797\27963\33410\26143\26399\19968",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\28789\33410\24198\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 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 = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("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}}),
+       ("\22522\30563\22307\20307\33410",
+        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}}),
+       ("\28595\38376\22238\24402\32426\24565\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20804\22969\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 <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}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   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}}),
+       ("\36174\32618\26085",
+        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}}),
+       ("February",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8909729238898653,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1526795099383855),
+                                    ("month (grain)", -2.2512917986064953),
+                                    ("year (grain)", -2.538973871058276),
+                                    ("week (grain)", -1.1526795099383855),
+                                    ("year", -2.538973871058276), ("month", -2.2512917986064953)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.5280674302004967, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7731898882334817),
+                                    ("week (grain)", -0.7731898882334817)],
+                               n = 23}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4462871026284195, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.0216512475319814,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("xxxx year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)integer (0..10)integer (0..10)",
+                                     0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -7.696104113612832e-2,
+                               unseen = -4.6913478822291435,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.750305594399894),
+                                    ("national dayevening|night", -3.58351893845611),
+                                    ("<named-month> <day-of-month>morning", -2.117181869662683),
+                                    ("\24773\20154\33410evening|night", -3.58351893845611),
+                                    ("\20799\31461\33410afternoon", -3.58351893845611),
+                                    ("intersectmorning", -2.117181869662683),
+                                    ("<time> <day-of-month>morning", -2.117181869662683),
+                                    ("Mondaymorning", -2.4849066497880004)],
+                               n = 50},
+                   koData =
+                     ClassData{prior = -2.6026896854443837, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1631508098056809),
+                                    ("<time> <day-of-month>morning", -1.1631508098056809)],
+                               n = 4}}),
+       ("<part-of-day> <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7935659283069926,
+                               unseen = -5.0369526024136295,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -3.4210000089583352),
+                                    ("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -1.6631420914059614),
+                                    ("hourhour", -2.322387720290225),
+                                    ("afternoon<time-of-day> o'clock", -3.644143560272545),
+                                    ("hourminute", -0.9699949108460162),
+                                    ("afternoon<integer> (latent time-of-day)", -3.644143560272545),
+                                    ("afternoonrelative (1-9) minutes after|past <integer> (hour-of-day)",
+                                     -2.72785282839839),
+                                    ("afternoonhh:mm (time-of-day)", -3.644143560272545),
+                                    ("tonight<time-of-day> o'clock", -3.4210000089583352),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -2.4654885639308985),
+                                    ("afternoonhalf after|past <integer> (hour-of-day)",
+                                     -3.2386784521643803)],
+                               n = 71},
+                   koData =
+                     ClassData{prior = -0.6018985090948004, unseen = -5.214935757608986,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.3762728087852047),
+                                    ("hourhour", -0.9899784476653142),
+                                    ("afternoon<time-of-day> o'clock", -1.7754989483562746),
+                                    ("hourminute", -2.21375387928743),
+                                    ("afternoon<integer> (latent time-of-day)", -1.571899993115035),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -3.82319179172153)],
+                               n = 86}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -6.244166900663736,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342month (grain)",
+                                     -4.632785353021065),
+                                    ("week", -3.0233474405869645),
+                                    ("integer (0..10)month (grain)", -2.745715703988685),
+                                    ("integer (0..10)hour (grain)", -3.1067290495260154),
+                                    ("<number>\20010/\20491week (grain)", -3.8443279926567944),
+                                    ("compose by multiplicationminute (grain)", -4.45046379622711),
+                                    ("second", -3.6031659358399066),
+                                    ("integer (0..10)day (grain)", -3.1067290495260154),
+                                    ("integer (0..10)year (grain)", -3.7573166156671647),
+                                    ("<number>\20010/\20491month (grain)", -3.469634543215384),
+                                    ("integer (numeric)year (grain)", -2.3710222545472743),
+                                    ("integer (0..10)second (grain)", -3.6031659358399066),
+                                    ("day", -3.1067290495260154), ("year", -2.1646858215494458),
+                                    ("integer (0..10)minute (grain)", -2.984126727433683),
+                                    ("number suffix: \21313|\25342minute (grain)",
+                                     -4.855928904335275),
+                                    ("hour", -3.1067290495260154),
+                                    ("integer (0..10)week (grain)", -3.534173064352955),
+                                    ("month", -2.008116760857906),
+                                    ("integer (numeric)month (grain)", -3.3518515075590005),
+                                    ("integer with consecutive unit modifiersminute (grain)",
+                                     -4.296313116399852),
+                                    ("minute", -2.553343811341229)],
+                               n = 246}}),
+       ("\32769\26495\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\31709\28779\33410",
+        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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4353180712578455, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -0.9555114450274363),
+                                    ("<integer> (latent time-of-day)", -2.159484249353372),
+                                    ("hour", -2.159484249353372), ("minute", -0.9555114450274363)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.041453874828161, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.8266785731844679),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6}}),
+       ("one point 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.9650808960435872),
+                                    ("integer (0..10)number suffix: \21313|\25342",
+                                     -1.9459101490553135),
+                                    ("integer (0..10)integer with consecutive unit modifiers",
+                                     -1.3397743454849977),
+                                    ("integer (0..10)<number>\20010/\20491", -2.639057329615259),
+                                    ("integer (0..10)compose by multiplication",
+                                     -2.639057329615259),
+                                    ("integer (0..10)half", -2.639057329615259)],
+                               n = 36}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2380465718564744),
+                                    ("Sunday<named-month> <day-of-month>", -1.6094379124341003),
+                                    ("SundayFebruary", -2.2380465718564744),
+                                    ("dayday", -0.9501922835498364),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\26837\26525\20027\26085",
+        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}}),
+       ("\38463\33298\25289\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.2876820724517809)],
+                               n = 2}}),
+       ("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}}),
+       ("\19996\27491\25945\32822\31267\21463\38590\26085",
+        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}}),
+       ("\25289\25746\36335\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = 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> 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}}),
+       ("\22307\35806\33410",
+        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 <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7308875085427924), ("Sunday", -1.2163953243244932),
+                                    ("Tuesday", -1.5040773967762742)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20234\26031\20848\26032\24180",
+        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}}),
+       ("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}}),
+       ("\24320\25995\33410",
+        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 after tomorrow",
+        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}}),
+       ("\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("\22919\22899\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20840\29699\38738\24180\26381\21153\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\27431\21335\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20061\22812\33410",
+        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 = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7731898882334817), ("Tuesday", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -0.7731898882334817),
+                                    ("day", -0.7731898882334817)],
+                               n = 5}}),
+       ("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}}),
+       ("\20197\33394\21015\29420\31435\26085",
+        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 n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.9856819377004897),
+                                    ("second", -2.803360380906535),
+                                    ("integer (0..10)day (grain)", -2.515678308454754),
+                                    ("integer (0..10)year (grain)", -3.2088254890146994),
+                                    ("<number>\20010/\20491month (grain)", -2.803360380906535),
+                                    ("integer (0..10)second (grain)", -2.803360380906535),
+                                    ("day", -2.515678308454754), ("year", -3.2088254890146994),
+                                    ("integer (0..10)minute (grain)", -2.649209701079277),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.803360380906535), ("minute", -2.649209701079277)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19975\22307\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21476\23572\37030\33410",
+        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}}),
+       ("number of five minutes",
+        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 (0..10)", 0.0)],
+                               n = 2}}),
+       ("\20799\31461\33410",
+        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}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = -3.922071315328127e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -3.258096538021482, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\26149\33410",
+        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.number minutes",
+        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 (0..10)integer with consecutive unit modifiersminute (grain)",
+                                     -1.0986122886681098),
+                                    ("integer (0..10)compose by multiplicationminute (grain)",
+                                     -1.6094379124341003),
+                                    ("minute", -0.7621400520468967)],
+                               n = 6}}),
+       ("\32822\31267\21463\38590\26085",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.762173934797756,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (0..10)", -2.5563656137701454),
+                                    ("Marchinteger (numeric)", -3.144152278672264),
+                                    ("Aprilinteger (numeric)", -3.654977902438255),
+                                    ("Februaryinteger (0..10)", -2.6741486494265287),
+                                    ("Februarynumber suffix: \21313|\25342", -2.6741486494265287),
+                                    ("month", -0.7462570058738938),
+                                    ("Februaryinteger (numeric)", -2.5563656137701454),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -1.8091512119399242)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21171\21160\33410",
+        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}}),
+       ("\22797\27963\33410\26143\26399\19968",
+        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}}),
+       ("number suffix: \19975|\33836",
+        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}}),
+       ("\22823\25995\39318\26085",
+        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}}),
+       ("half",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("two days 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}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.5907987153721106, unseen = -5.407171771460119,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 221},
+                   koData =
+                     ClassData{prior = -0.8071778665977783, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2823823856765264), ("second", -2.505525936990736),
+                                    ("day", -2.793208009442517),
+                                    ("<integer> <unit-of-duration>", -0.8007778447523107),
+                                    ("hour", -2.2823823856765264), ("month", -2.2823823856765264),
+                                    ("minute", -2.2823823856765264)],
+                               n = 21}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -8.701137698962981e-2)],
+                               n = 10}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.908720896564361),
+                                    ("second", -2.908720896564361),
+                                    ("integer (0..10)day (grain)", -2.3978952727983707),
+                                    ("integer (0..10)year (grain)", -2.908720896564361),
+                                    ("<number>\20010/\20491month (grain)", -2.908720896564361),
+                                    ("integer (0..10)second (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("year", -2.908720896564361),
+                                    ("integer (0..10)minute (grain)", -2.908720896564361),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.908720896564361),
+                                    ("month", -2.908720896564361), ("minute", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\24527\24724\33410",
+        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}}),
+       ("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}}),
+       ("number suffix: \21313|\25342",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874,
+                               unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("\22320\29699\19968\23567\26102",
+        Classifier{okData =
+                     ClassData{prior = 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.38299225225610584,
+                               unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -1.1451323043030026,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("\22307\32426\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22797\27963\33410",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -3.509131981127006e-2)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2", -0.9808292530117262),
+                                    ("integer (0..10)", -0.4700036292457356)],
+                               n = 6}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)number suffix: \21313|\25342",
+                                     -0.15415067982725836)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2number suffix: \21313|\25342",
+                                     -0.2876820724517809)],
+                               n = 2}}),
+       ("\24773\20154\33410",
+        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}}),
+       ("\20116\26092\33410",
+        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}}),
+       ("\31070\22307\26143\26399\22235",
+        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}}),
+       ("\25995\26376",
+        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}}),
+       ("\27861\20196\20043\22812",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9810014688665833),
+                                    ("Monday", -1.9810014688665833), ("day", -0.8415671856782186),
+                                    ("hour", -2.9618307218783095), ("Tuesday", -1.6625477377480489),
+                                    ("week-end", -2.9618307218783095)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_HK.hs b/Duckling/Ranking/Classifiers/ZH_HK.hs
--- a/Duckling/Ranking/Classifiers/ZH_HK.hs
+++ b/Duckling/Ranking/Classifiers/ZH_HK.hs
@@ -21,928 +21,1555 @@
 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}}),
-       ("\22269\38469\28040\36153\32773\26435\30410\26085",
-        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}}),
-       ("\24314\20891\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -1.0076405104623831,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -0.45425527227759643,
-                               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}}),
-       ("number suffix: \21313",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               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}}),
-       ("\20803\26086",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -3.367295829986474),
-                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.7578579175523736),
-                                    ("dayday", -1.6094379124341003),
-                                    ("hourhour", -3.367295829986474),
-                                    ("hourminute", -3.367295829986474),
-                                    ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.6094379124341003),
-                                    ("dayminute", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.367295829986474),
-                                    ("yearday", -1.7578579175523736)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -2.065455299705096),
-                                    ("dayhour", -2.653241964607215),
-                                    ("daymonth", -2.1832383353614793),
-                                    ("year (numeric with year symbol)February", -3.164067588373206),
-                                    ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.164067588373206),
-                                    ("hourhour", -3.164067588373206),
-                                    ("year (numeric with year symbol)March", -2.653241964607215),
-                                    ("hourminute", -2.653241964607215),
-                                    ("yearmonth", -2.316769727986002),
-                                    ("dayminute", -2.653241964607215),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -2.653241964607215),
-                                    ("absorption of , after named dayFebruary",
-                                     -2.1832383353614793)],
-                               n = 27}}),
-       ("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}}),
-       ("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.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.4170660197866443, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3350010667323402),
-                                    ("integer (0..10)", -0.3794896217049037)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.2776317365982795,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -2.3608540011180215),
-                                    ("integer (0..10)", -0.28141245943818544),
-                                    ("<number>\20010/\20491", -1.890850371872286)],
-                               n = 50}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
-                                    ("monthday", -0.7308875085427924),
-                                    ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.0986122886681098)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = -0.10763066419236544,
-                               unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1631508098056809),
-                                    ("number suffix: \21313", -2.2617630984737906),
-                                    ("integer (0..10)", -0.5753641449035618)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -2.2823823856765264,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
-                               n = 5}}),
-       ("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}}),
-       ("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}}),
-       ("\24858\20154\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 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 = -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}}),
-       ("\28595\38376\22238\24402\32426\24565\26085",
-        Classifier{okData =
-                     ClassData{prior = 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 <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}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("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 = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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 = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7487170317147561),
-                                    ("national dayevening|night", -3.20545280453606),
-                                    ("<named-month> <day-of-month>morning", -1.2595426554807467),
-                                    ("\24773\20154\33410evening|night", -3.20545280453606),
-                                    ("\20799\31461\33410afternoon", -3.20545280453606),
-                                    ("Mondaymorning", -2.10684051586795)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<part-of-day> <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
-                                    ("hourhour", -1.3523928094442093),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.6625477377480489),
-                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
-                                    ("hourminute", -1.575536360758419),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -2.6741486494265287),
-                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -0.7841189587656721,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -1.4271163556401458),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.5141277326297755),
-                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
-                                    ("hourminute", -1.5141277326297755),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -1.9661128563728327)],
-                               n = 21}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.905361848054571,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6837575085331653),
-                                    ("integer (0..10)month (grain)", -2.535337503414892),
-                                    ("integer (0..10)hour (grain)", -3.06941998934515),
-                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
-                                    ("second", -3.2635760037861075),
-                                    ("integer (0..10)day (grain)", -3.06941998934515),
-                                    ("number suffix: \21313month (grain)", -4.293195420967266),
-                                    ("integer (0..10)year (grain)", -3.6000482404073204),
-                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
-                                    ("integer (numeric)year (grain)", -3.1945831322991562),
-                                    ("integer (0..10)second (grain)", -3.2635760037861075),
-                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
-                                    ("integer (0..10)minute (grain)", -3.06941998934515),
-                                    ("hour", -2.8581108956779433),
-                                    ("integer (0..10)week (grain)", -3.1945831322991562),
-                                    ("month", -1.7754989483562746),
-                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
-                                    ("integer (numeric)month (grain)", -3.1945831322991562),
-                                    ("minute", -3.06941998934515)],
-                               n = 173}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
-                               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}}),
-       ("number suffix: \19975",
-        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}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
-                                     -0.7801585575495751),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)number suffix: \21313",
-                                     -1.3862943611198906),
-                                    ("<integer> (latent time-of-day)integer (0..10)",
-                                     -1.3862943611198906),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
-                                    ("dayday", -0.7270487322356266)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("SundayFebruary", -0.8109302162163288)],
-                               n = 7}}),
-       ("integer with consecutive unit modifiers",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
-                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               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}}),
-       ("\22307\35806\33410",
-        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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2286654169163076,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
-                                    ("Tuesday", -1.6422277352570913)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("month (numeric with month symbol)", -2.5649493574615367),
-                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
-                               n = 29}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               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}}),
-       ("\22919\22899\33410",
-        Classifier{okData =
-                     ClassData{prior = 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 = -1.6486586255873816, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.21357410029805904,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -2.1000608288825715),
-                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
-                                    ("month (numeric with month symbol)", -3.1986731175506815),
-                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
-                                    ("month", -3.1986731175506815)],
-                               n = 21}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4079456086518722),
-                                    ("integer (0..10)hour (grain)", -2.659260036932778),
-                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
-                                    ("second", -2.8134107167600364),
-                                    ("integer (0..10)day (grain)", -2.5257286443082556),
-                                    ("integer (0..10)year (grain)", -3.2188758248682006),
-                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
-                                    ("integer (0..10)second (grain)", -2.8134107167600364),
-                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
-                                    ("integer (0..10)minute (grain)", -2.659260036932778),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.8134107167600364),
-                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
-                                    ("minute", -2.659260036932778)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\19975\22307\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\20799\31461\33410",
-        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}}),
-       ("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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -5.231108616854587,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Marchinteger (0..10)", -3.4339872044851463),
-                                    ("Marchinteger (numeric)", -4.127134385045092),
-                                    ("month (numeric with month symbol)integer (numeric)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger (0..10)", -3.146305132033365),
-                                    ("month (numeric with month symbol)number suffix: \21313",
-                                     -3.146305132033365),
-                                    ("month", -0.7371103039810614),
-                                    ("month (numeric with month symbol)integer (0..10)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
-                               n = 88},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\21171\21160\33410",
-        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..10)",
-        Classifier{okData =
-                     ClassData{prior = -0.4090429294560484, unseen = -5.236441962829949,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
-                   koData =
-                     ClassData{prior = -1.0914948208992459, unseen = -4.564348191467836,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 94}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9856819377004897),
-                                    ("integer (0..10)month (grain)", -3.4965075614664802),
-                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
-                                    ("second", -2.649209701079277),
-                                    ("integer (0..10)day (grain)", -2.9856819377004897),
-                                    ("integer (0..10)year (grain)", -3.4965075614664802),
-                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
-                                    ("integer (0..10)second (grain)", -2.649209701079277),
-                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
-                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
-                                    ("hour", -2.3978952727983707),
-                                    ("integer (0..10)week (grain)", -2.9856819377004897),
-                                    ("month", -2.1972245773362196),
-                                    ("minute", -2.3978952727983707)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
-                               n = 4}}),
-       ("n <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4159137783010487),
-                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (0..10)day (grain)", -2.4159137783010487),
-                                    ("integer (0..10)year (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
-                                    ("integer (0..10)second (grain)", -2.9267394020670396),
-                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
-                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
-                                    ("hour", -2.4159137783010487),
-                                    ("integer (0..10)week (grain)", -2.9267394020670396),
-                                    ("month", -2.9267394020670396),
-                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
-                                    ("minute", -2.9267394020670396)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               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}}),
-       ("<number>\20010/\20491",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\24773\20154\33410",
-        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 <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}})]
+      [("\25490\28783\33410",
+        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}}),
+       ("\19996\27491\25945\26837\26525\20027\26085",
+        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}}),
+       ("number of 5 minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8979415932059586),
+                                    ("hour", -0.7308875085427924),
+                                    ("<integer> (latent time-of-day)<number>\20010/\20491",
+                                     -2.1972245773362196)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8109302162163288),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("\21360\24230\20016\25910\33410\31532\22235\22825",
+        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> 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.4700036292457356,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67}}),
+       ("\21355\22622\33410",
+        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 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}}),
+       ("\22269\38469\28040\36153\32773\26435\30410\26085",
+        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}}),
+       ("\24314\20891\33410",
+        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}}),
+       ("\29369\22826\26032\24180",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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.963437510299857, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -0.48058573857627246,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -1.466337068793427, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.262364264467491, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 30}}),
+       ("national day",
+        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}}),
+       ("integer (20,30,40)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\21360\24230\20016\25910\33410\31532\19977\22825",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("\22307\20250\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20803\26086",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("\32654\22269\29420\31435\26085",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -5.694137640013845e-2,
+                               unseen = -6.329720905522696,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -4.718498871295094),
+                                    ("year (numeric with year symbol)\20809\26126\33410",
+                                     -4.248495242049359),
+                                    ("xxxx year<named-month> <day-of-month>", -4.941642422609305),
+                                    ("daymonth", -4.248495242049359),
+                                    ("monthday", -1.9459101490553135),
+                                    ("next yearSeptember", -5.2293244950610855),
+                                    ("year (numeric with year symbol)\25995\26376",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)\20061\22812\33410",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)February", -4.718498871295094),
+                                    ("xxxx yearintersect", -4.941642422609305),
+                                    ("March<time> <day-of-month>", -3.7629874262676584),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -3.494723439672979),
+                                    ("monthhour", -3.7629874262676584),
+                                    ("year (numeric with year symbol)\22320\29699\19968\23567\26102",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)April", -5.2293244950610855),
+                                    ("dayday", -2.284885515894645),
+                                    ("hourhour", -4.718498871295094),
+                                    ("xxxx yearFebruary", -5.634789603169249),
+                                    ("year (numeric with year symbol)March", -4.1307122063929755),
+                                    ("February<dim time> <part-of-day>", -3.7629874262676584),
+                                    ("hourminute", -4.718498871295094),
+                                    ("April<time> <day-of-month>", -5.2293244950610855),
+                                    ("February<time> <day-of-month>", -2.614364717024887),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -3.619886582626985),
+                                    ("year (numeric with year symbol)\22823\25995\26399",
+                                     -4.941642422609305),
+                                    ("this <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("year (numeric with year symbol)\22235\26092\33410",
+                                     -5.2293244950610855),
+                                    ("yearmonth", -3.332204510175204),
+                                    ("year (numeric with year symbol)\20303\26842\33410",
+                                     -5.2293244950610855),
+                                    ("dayminute", -4.718498871295094),
+                                    ("next <cycle>September", -5.634789603169249),
+                                    ("intersect by \",\"<time> <day-of-month>", -3.619886582626985),
+                                    ("xxxx yearMarch", -5.634789603169249),
+                                    ("absorption of , after named dayintersect",
+                                     -3.619886582626985),
+                                    ("intersect<time> <day-of-month>", -2.8015762591130335),
+                                    ("next <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("tonight<time-of-day> o'clock", -4.718498871295094),
+                                    ("year (numeric with year symbol)intersect",
+                                     -3.494723439672979),
+                                    ("yearday", -2.0794415416798357),
+                                    ("absorption of , after named dayFebruary", -4.248495242049359),
+                                    ("year (numeric with year symbol)\19971\19971\33410",
+                                     -4.248495242049359),
+                                    ("year (numeric with year symbol)\36926\36234\33410",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)\29369\22826\26032\24180",
+                                     -5.2293244950610855),
+                                    ("yearminute", -5.2293244950610855),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -4.718498871295094)],
+                               n = 256},
+                   koData =
+                     ClassData{prior = -2.894068619777491, unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -2.159484249353372),
+                                    ("dayhour", -2.7472709142554916),
+                                    ("year (numeric with year symbol)Sunday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day><time-of-day> o'clock",
+                                     -3.258096538021482),
+                                    ("hourhour", -3.258096538021482),
+                                    ("hourminute", -2.7472709142554916),
+                                    ("dayminute", -2.7472709142554916),
+                                    ("yearday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.7472709142554916)],
+                               n = 15}}),
+       ("half after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20399\20029\33410",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.625967214385311, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.21905356606268464,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("Saturday",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.570544858467613, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -1.5198257537444133),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.367123614131617), ("month", -1.5198257537444133)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.832909122935104, 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}}),
+       ("\22307\27583\34987\27585\26085",
+        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 <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}}),
+       ("\35199\36203\25176\25289\33410",
+        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}}),
+       ("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}}),
+       ("\20811\21704\29305\26222\36838\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21313\32988\33410",
+        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}}),
+       ("evening|night",
+        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}}),
+       ("\20303\26842\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\19977\19968\20027\26085",
+        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}}),
+       ("\30331\38660\33410",
+        Classifier{okData =
+                     ClassData{prior = 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.15415067982725836,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("\19971\19971\33410",
+        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.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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3564413979702095),
+                                    ("integer (20,30,40)", -3.0910424533583156),
+                                    ("integer with consecutive unit modifiers", -1.245215762859985),
+                                    ("integer (0..10)", -1.4170660197866443),
+                                    ("number suffix: \21313|\25342", -2.1102132003465894),
+                                    ("compose by multiplication", -3.0910424533583156)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.5105920777974677,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)", -0.3629054936893685),
+                                    ("number suffix: \21313|\25342", -2.03688192726104)],
+                               n = 17}}),
+       ("\19996\27491\25945\22797\27963\33410",
+        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}}),
+       ("hh:mm (time-of-day)",
+        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}}),
+       ("relative (1-9) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2754119798599665,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.174751721484161),
+                                    ("integer (0..10)", -0.1466034741918754)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -1.4240346891027378, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("one point 2", -1.1631508098056809)],
+                               n = 13}}),
+       ("\36926\36234\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -0.6931471805599453),
+                                    ("monthday", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22235\26092\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19996\27491\25945\22307\21608\20845",
+        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}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20016\25910\33410",
+        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}}),
+       ("\20809\26126\33410",
+        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 (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}}),
+       ("relative (10-59) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)compose by multiplication",
+                                     -2.164963715117998),
+                                    ("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.9753796482441617),
+                                    ("hour", -0.7435780341868373)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)number suffix: \21313|\25342",
+                                     -1.413693335308005),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.413693335308005),
+                                    ("hour", -0.7777045685880083)],
+                               n = 16}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 47},
+                   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}}),
+       ("\22823\25995\26399",
+        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}}),
+       ("\24858\20154\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\29369\22826\26893\26641\33410",
+        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}}),
+       ("\19996\27491\25945\22797\27963\33410\26143\26399\19968",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\28789\33410\24198\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 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 = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("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}}),
+       ("\22522\30563\22307\20307\33410",
+        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}}),
+       ("\28595\38376\22238\24402\32426\24565\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20804\22969\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 <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}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   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}}),
+       ("\36174\32618\26085",
+        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}}),
+       ("February",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8909729238898653,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1526795099383855),
+                                    ("month (grain)", -2.2512917986064953),
+                                    ("year (grain)", -2.538973871058276),
+                                    ("week (grain)", -1.1526795099383855),
+                                    ("year", -2.538973871058276), ("month", -2.2512917986064953)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.5280674302004967, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7731898882334817),
+                                    ("week (grain)", -0.7731898882334817)],
+                               n = 23}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4462871026284195, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.0216512475319814,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("xxxx year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)integer (0..10)integer (0..10)",
+                                     0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -7.696104113612832e-2,
+                               unseen = -4.6913478822291435,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.750305594399894),
+                                    ("national dayevening|night", -3.58351893845611),
+                                    ("<named-month> <day-of-month>morning", -2.117181869662683),
+                                    ("\24773\20154\33410evening|night", -3.58351893845611),
+                                    ("\20799\31461\33410afternoon", -3.58351893845611),
+                                    ("intersectmorning", -2.117181869662683),
+                                    ("<time> <day-of-month>morning", -2.117181869662683),
+                                    ("Mondaymorning", -2.4849066497880004)],
+                               n = 50},
+                   koData =
+                     ClassData{prior = -2.6026896854443837, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1631508098056809),
+                                    ("<time> <day-of-month>morning", -1.1631508098056809)],
+                               n = 4}}),
+       ("<part-of-day> <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7935659283069926,
+                               unseen = -5.0369526024136295,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -3.4210000089583352),
+                                    ("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -1.6631420914059614),
+                                    ("hourhour", -2.322387720290225),
+                                    ("afternoon<time-of-day> o'clock", -3.644143560272545),
+                                    ("hourminute", -0.9699949108460162),
+                                    ("afternoon<integer> (latent time-of-day)", -3.644143560272545),
+                                    ("afternoonrelative (1-9) minutes after|past <integer> (hour-of-day)",
+                                     -2.72785282839839),
+                                    ("afternoonhh:mm (time-of-day)", -3.644143560272545),
+                                    ("tonight<time-of-day> o'clock", -3.4210000089583352),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -2.4654885639308985),
+                                    ("afternoonhalf after|past <integer> (hour-of-day)",
+                                     -3.2386784521643803)],
+                               n = 71},
+                   koData =
+                     ClassData{prior = -0.6018985090948004, unseen = -5.214935757608986,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.3762728087852047),
+                                    ("hourhour", -0.9899784476653142),
+                                    ("afternoon<time-of-day> o'clock", -1.7754989483562746),
+                                    ("hourminute", -2.21375387928743),
+                                    ("afternoon<integer> (latent time-of-day)", -1.571899993115035),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -3.82319179172153)],
+                               n = 86}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -6.244166900663736,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342month (grain)",
+                                     -4.632785353021065),
+                                    ("week", -3.0233474405869645),
+                                    ("integer (0..10)month (grain)", -2.745715703988685),
+                                    ("integer (0..10)hour (grain)", -3.1067290495260154),
+                                    ("<number>\20010/\20491week (grain)", -3.8443279926567944),
+                                    ("compose by multiplicationminute (grain)", -4.45046379622711),
+                                    ("second", -3.6031659358399066),
+                                    ("integer (0..10)day (grain)", -3.1067290495260154),
+                                    ("integer (0..10)year (grain)", -3.7573166156671647),
+                                    ("<number>\20010/\20491month (grain)", -3.469634543215384),
+                                    ("integer (numeric)year (grain)", -2.3710222545472743),
+                                    ("integer (0..10)second (grain)", -3.6031659358399066),
+                                    ("day", -3.1067290495260154), ("year", -2.1646858215494458),
+                                    ("integer (0..10)minute (grain)", -2.984126727433683),
+                                    ("number suffix: \21313|\25342minute (grain)",
+                                     -4.855928904335275),
+                                    ("hour", -3.1067290495260154),
+                                    ("integer (0..10)week (grain)", -3.534173064352955),
+                                    ("month", -2.008116760857906),
+                                    ("integer (numeric)month (grain)", -3.3518515075590005),
+                                    ("integer with consecutive unit modifiersminute (grain)",
+                                     -4.296313116399852),
+                                    ("minute", -2.553343811341229)],
+                               n = 246}}),
+       ("\32769\26495\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\31709\28779\33410",
+        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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4353180712578455, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -0.9555114450274363),
+                                    ("<integer> (latent time-of-day)", -2.159484249353372),
+                                    ("hour", -2.159484249353372), ("minute", -0.9555114450274363)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.041453874828161, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.8266785731844679),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6}}),
+       ("one point 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.9650808960435872),
+                                    ("integer (0..10)number suffix: \21313|\25342",
+                                     -1.9459101490553135),
+                                    ("integer (0..10)integer with consecutive unit modifiers",
+                                     -1.3397743454849977),
+                                    ("integer (0..10)<number>\20010/\20491", -2.639057329615259),
+                                    ("integer (0..10)compose by multiplication",
+                                     -2.639057329615259),
+                                    ("integer (0..10)half", -2.639057329615259)],
+                               n = 36}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2380465718564744),
+                                    ("Sunday<named-month> <day-of-month>", -1.6094379124341003),
+                                    ("SundayFebruary", -2.2380465718564744),
+                                    ("dayday", -0.9501922835498364),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\26837\26525\20027\26085",
+        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}}),
+       ("\38463\33298\25289\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.2876820724517809)],
+                               n = 2}}),
+       ("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}}),
+       ("\19996\27491\25945\32822\31267\21463\38590\26085",
+        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}}),
+       ("\25289\25746\36335\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = 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> 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}}),
+       ("\22307\35806\33410",
+        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 <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7308875085427924), ("Sunday", -1.2163953243244932),
+                                    ("Tuesday", -1.5040773967762742)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20234\26031\20848\26032\24180",
+        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}}),
+       ("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}}),
+       ("\24320\25995\33410",
+        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 after tomorrow",
+        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}}),
+       ("\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("\22919\22899\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20840\29699\38738\24180\26381\21153\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\27431\21335\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20061\22812\33410",
+        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 = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7731898882334817), ("Tuesday", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -0.7731898882334817),
+                                    ("day", -0.7731898882334817)],
+                               n = 5}}),
+       ("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}}),
+       ("\20197\33394\21015\29420\31435\26085",
+        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 n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.9856819377004897),
+                                    ("second", -2.803360380906535),
+                                    ("integer (0..10)day (grain)", -2.515678308454754),
+                                    ("integer (0..10)year (grain)", -3.2088254890146994),
+                                    ("<number>\20010/\20491month (grain)", -2.803360380906535),
+                                    ("integer (0..10)second (grain)", -2.803360380906535),
+                                    ("day", -2.515678308454754), ("year", -3.2088254890146994),
+                                    ("integer (0..10)minute (grain)", -2.649209701079277),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.803360380906535), ("minute", -2.649209701079277)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19975\22307\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21476\23572\37030\33410",
+        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}}),
+       ("number of five minutes",
+        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 (0..10)", 0.0)],
+                               n = 2}}),
+       ("\20799\31461\33410",
+        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}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = -3.922071315328127e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -3.258096538021482, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\26149\33410",
+        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.number minutes",
+        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 (0..10)integer with consecutive unit modifiersminute (grain)",
+                                     -1.0986122886681098),
+                                    ("integer (0..10)compose by multiplicationminute (grain)",
+                                     -1.6094379124341003),
+                                    ("minute", -0.7621400520468967)],
+                               n = 6}}),
+       ("\32822\31267\21463\38590\26085",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.762173934797756,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (0..10)", -2.5563656137701454),
+                                    ("Marchinteger (numeric)", -3.144152278672264),
+                                    ("Aprilinteger (numeric)", -3.654977902438255),
+                                    ("Februaryinteger (0..10)", -2.6741486494265287),
+                                    ("Februarynumber suffix: \21313|\25342", -2.6741486494265287),
+                                    ("month", -0.7462570058738938),
+                                    ("Februaryinteger (numeric)", -2.5563656137701454),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -1.8091512119399242)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21171\21160\33410",
+        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}}),
+       ("\22797\27963\33410\26143\26399\19968",
+        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}}),
+       ("number suffix: \19975|\33836",
+        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}}),
+       ("\22823\25995\39318\26085",
+        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}}),
+       ("half",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("two days 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}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.5907987153721106, unseen = -5.407171771460119,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 221},
+                   koData =
+                     ClassData{prior = -0.8071778665977783, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2823823856765264), ("second", -2.505525936990736),
+                                    ("day", -2.793208009442517),
+                                    ("<integer> <unit-of-duration>", -0.8007778447523107),
+                                    ("hour", -2.2823823856765264), ("month", -2.2823823856765264),
+                                    ("minute", -2.2823823856765264)],
+                               n = 21}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -8.701137698962981e-2)],
+                               n = 10}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.908720896564361),
+                                    ("second", -2.908720896564361),
+                                    ("integer (0..10)day (grain)", -2.3978952727983707),
+                                    ("integer (0..10)year (grain)", -2.908720896564361),
+                                    ("<number>\20010/\20491month (grain)", -2.908720896564361),
+                                    ("integer (0..10)second (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("year", -2.908720896564361),
+                                    ("integer (0..10)minute (grain)", -2.908720896564361),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.908720896564361),
+                                    ("month", -2.908720896564361), ("minute", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\24527\24724\33410",
+        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}}),
+       ("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}}),
+       ("number suffix: \21313|\25342",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874,
+                               unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("\22320\29699\19968\23567\26102",
+        Classifier{okData =
+                     ClassData{prior = 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.38299225225610584,
+                               unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -1.1451323043030026,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("\22307\32426\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22797\27963\33410",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -3.509131981127006e-2)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2", -0.9808292530117262),
+                                    ("integer (0..10)", -0.4700036292457356)],
+                               n = 6}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)number suffix: \21313|\25342",
+                                     -0.15415067982725836)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2number suffix: \21313|\25342",
+                                     -0.2876820724517809)],
+                               n = 2}}),
+       ("\24773\20154\33410",
+        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}}),
+       ("\20116\26092\33410",
+        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}}),
+       ("\31070\22307\26143\26399\22235",
+        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}}),
+       ("\25995\26376",
+        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}}),
+       ("\27861\20196\20043\22812",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9810014688665833),
+                                    ("Monday", -1.9810014688665833), ("day", -0.8415671856782186),
+                                    ("hour", -2.9618307218783095), ("Tuesday", -1.6625477377480489),
+                                    ("week-end", -2.9618307218783095)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_MO.hs b/Duckling/Ranking/Classifiers/ZH_MO.hs
--- a/Duckling/Ranking/Classifiers/ZH_MO.hs
+++ b/Duckling/Ranking/Classifiers/ZH_MO.hs
@@ -21,928 +21,1555 @@
 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}}),
-       ("\22269\38469\28040\36153\32773\26435\30410\26085",
-        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}}),
-       ("\24314\20891\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -1.0076405104623831,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -0.45425527227759643,
-                               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}}),
-       ("number suffix: \21313",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               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}}),
-       ("\20803\26086",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -3.367295829986474),
-                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.7578579175523736),
-                                    ("dayday", -1.6094379124341003),
-                                    ("hourhour", -3.367295829986474),
-                                    ("hourminute", -3.367295829986474),
-                                    ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.6094379124341003),
-                                    ("dayminute", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.367295829986474),
-                                    ("yearday", -1.7578579175523736)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -2.065455299705096),
-                                    ("dayhour", -2.653241964607215),
-                                    ("daymonth", -2.1832383353614793),
-                                    ("year (numeric with year symbol)February", -3.164067588373206),
-                                    ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.164067588373206),
-                                    ("hourhour", -3.164067588373206),
-                                    ("year (numeric with year symbol)March", -2.653241964607215),
-                                    ("hourminute", -2.653241964607215),
-                                    ("yearmonth", -2.316769727986002),
-                                    ("dayminute", -2.653241964607215),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -2.653241964607215),
-                                    ("absorption of , after named dayFebruary",
-                                     -2.1832383353614793)],
-                               n = 27}}),
-       ("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}}),
-       ("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.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.4170660197866443, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3350010667323402),
-                                    ("integer (0..10)", -0.3794896217049037)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.2776317365982795,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -2.3608540011180215),
-                                    ("integer (0..10)", -0.28141245943818544),
-                                    ("<number>\20010/\20491", -1.890850371872286)],
-                               n = 50}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
-                                    ("monthday", -0.7308875085427924),
-                                    ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.0986122886681098)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = -0.10763066419236544,
-                               unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1631508098056809),
-                                    ("number suffix: \21313", -2.2617630984737906),
-                                    ("integer (0..10)", -0.5753641449035618)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -2.2823823856765264,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
-                               n = 5}}),
-       ("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}}),
-       ("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}}),
-       ("\24858\20154\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 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 = -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}}),
-       ("\28595\38376\22238\24402\32426\24565\26085",
-        Classifier{okData =
-                     ClassData{prior = 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 <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}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("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 = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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 = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7487170317147561),
-                                    ("national dayevening|night", -3.20545280453606),
-                                    ("<named-month> <day-of-month>morning", -1.2595426554807467),
-                                    ("\24773\20154\33410evening|night", -3.20545280453606),
-                                    ("\20799\31461\33410afternoon", -3.20545280453606),
-                                    ("Mondaymorning", -2.10684051586795)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<part-of-day> <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
-                                    ("hourhour", -1.3523928094442093),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.6625477377480489),
-                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
-                                    ("hourminute", -1.575536360758419),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -2.6741486494265287),
-                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -0.7841189587656721,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -1.4271163556401458),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.5141277326297755),
-                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
-                                    ("hourminute", -1.5141277326297755),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -1.9661128563728327)],
-                               n = 21}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.905361848054571,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6837575085331653),
-                                    ("integer (0..10)month (grain)", -2.535337503414892),
-                                    ("integer (0..10)hour (grain)", -3.06941998934515),
-                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
-                                    ("second", -3.2635760037861075),
-                                    ("integer (0..10)day (grain)", -3.06941998934515),
-                                    ("number suffix: \21313month (grain)", -4.293195420967266),
-                                    ("integer (0..10)year (grain)", -3.6000482404073204),
-                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
-                                    ("integer (numeric)year (grain)", -3.1945831322991562),
-                                    ("integer (0..10)second (grain)", -3.2635760037861075),
-                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
-                                    ("integer (0..10)minute (grain)", -3.06941998934515),
-                                    ("hour", -2.8581108956779433),
-                                    ("integer (0..10)week (grain)", -3.1945831322991562),
-                                    ("month", -1.7754989483562746),
-                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
-                                    ("integer (numeric)month (grain)", -3.1945831322991562),
-                                    ("minute", -3.06941998934515)],
-                               n = 173}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
-                               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}}),
-       ("number suffix: \19975",
-        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}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
-                                     -0.7801585575495751),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)number suffix: \21313",
-                                     -1.3862943611198906),
-                                    ("<integer> (latent time-of-day)integer (0..10)",
-                                     -1.3862943611198906),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
-                                    ("dayday", -0.7270487322356266)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("SundayFebruary", -0.8109302162163288)],
-                               n = 7}}),
-       ("integer with consecutive unit modifiers",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
-                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               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}}),
-       ("\22307\35806\33410",
-        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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2286654169163076,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
-                                    ("Tuesday", -1.6422277352570913)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("month (numeric with month symbol)", -2.5649493574615367),
-                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
-                               n = 29}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               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}}),
-       ("\22919\22899\33410",
-        Classifier{okData =
-                     ClassData{prior = 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 = -1.6486586255873816, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.21357410029805904,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -2.1000608288825715),
-                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
-                                    ("month (numeric with month symbol)", -3.1986731175506815),
-                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
-                                    ("month", -3.1986731175506815)],
-                               n = 21}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4079456086518722),
-                                    ("integer (0..10)hour (grain)", -2.659260036932778),
-                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
-                                    ("second", -2.8134107167600364),
-                                    ("integer (0..10)day (grain)", -2.5257286443082556),
-                                    ("integer (0..10)year (grain)", -3.2188758248682006),
-                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
-                                    ("integer (0..10)second (grain)", -2.8134107167600364),
-                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
-                                    ("integer (0..10)minute (grain)", -2.659260036932778),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.8134107167600364),
-                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
-                                    ("minute", -2.659260036932778)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\19975\22307\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\20799\31461\33410",
-        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}}),
-       ("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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -5.231108616854587,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Marchinteger (0..10)", -3.4339872044851463),
-                                    ("Marchinteger (numeric)", -4.127134385045092),
-                                    ("month (numeric with month symbol)integer (numeric)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger (0..10)", -3.146305132033365),
-                                    ("month (numeric with month symbol)number suffix: \21313",
-                                     -3.146305132033365),
-                                    ("month", -0.7371103039810614),
-                                    ("month (numeric with month symbol)integer (0..10)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
-                               n = 88},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\21171\21160\33410",
-        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..10)",
-        Classifier{okData =
-                     ClassData{prior = -0.4090429294560484, unseen = -5.236441962829949,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
-                   koData =
-                     ClassData{prior = -1.0914948208992459, unseen = -4.564348191467836,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 94}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9856819377004897),
-                                    ("integer (0..10)month (grain)", -3.4965075614664802),
-                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
-                                    ("second", -2.649209701079277),
-                                    ("integer (0..10)day (grain)", -2.9856819377004897),
-                                    ("integer (0..10)year (grain)", -3.4965075614664802),
-                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
-                                    ("integer (0..10)second (grain)", -2.649209701079277),
-                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
-                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
-                                    ("hour", -2.3978952727983707),
-                                    ("integer (0..10)week (grain)", -2.9856819377004897),
-                                    ("month", -2.1972245773362196),
-                                    ("minute", -2.3978952727983707)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
-                               n = 4}}),
-       ("n <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4159137783010487),
-                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (0..10)day (grain)", -2.4159137783010487),
-                                    ("integer (0..10)year (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
-                                    ("integer (0..10)second (grain)", -2.9267394020670396),
-                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
-                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
-                                    ("hour", -2.4159137783010487),
-                                    ("integer (0..10)week (grain)", -2.9267394020670396),
-                                    ("month", -2.9267394020670396),
-                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
-                                    ("minute", -2.9267394020670396)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               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}}),
-       ("<number>\20010/\20491",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\24773\20154\33410",
-        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 <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}})]
+      [("\25490\28783\33410",
+        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}}),
+       ("\19996\27491\25945\26837\26525\20027\26085",
+        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}}),
+       ("number of 5 minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8979415932059586),
+                                    ("hour", -0.7308875085427924),
+                                    ("<integer> (latent time-of-day)<number>\20010/\20491",
+                                     -2.1972245773362196)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8109302162163288),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("\21360\24230\20016\25910\33410\31532\22235\22825",
+        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> 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.4700036292457356,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67}}),
+       ("\21355\22622\33410",
+        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 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}}),
+       ("\22269\38469\28040\36153\32773\26435\30410\26085",
+        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}}),
+       ("\24314\20891\33410",
+        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}}),
+       ("\29369\22826\26032\24180",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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.963437510299857, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -0.48058573857627246,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -1.466337068793427, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.262364264467491, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 30}}),
+       ("national day",
+        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}}),
+       ("integer (20,30,40)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\21360\24230\20016\25910\33410\31532\19977\22825",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("\22307\20250\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20803\26086",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("\32654\22269\29420\31435\26085",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -5.694137640013845e-2,
+                               unseen = -6.329720905522696,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -4.718498871295094),
+                                    ("year (numeric with year symbol)\20809\26126\33410",
+                                     -4.248495242049359),
+                                    ("xxxx year<named-month> <day-of-month>", -4.941642422609305),
+                                    ("daymonth", -4.248495242049359),
+                                    ("monthday", -1.9459101490553135),
+                                    ("next yearSeptember", -5.2293244950610855),
+                                    ("year (numeric with year symbol)\25995\26376",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)\20061\22812\33410",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)February", -4.718498871295094),
+                                    ("xxxx yearintersect", -4.941642422609305),
+                                    ("March<time> <day-of-month>", -3.7629874262676584),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -3.494723439672979),
+                                    ("monthhour", -3.7629874262676584),
+                                    ("year (numeric with year symbol)\22320\29699\19968\23567\26102",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)April", -5.2293244950610855),
+                                    ("dayday", -2.284885515894645),
+                                    ("hourhour", -4.718498871295094),
+                                    ("xxxx yearFebruary", -5.634789603169249),
+                                    ("year (numeric with year symbol)March", -4.1307122063929755),
+                                    ("February<dim time> <part-of-day>", -3.7629874262676584),
+                                    ("hourminute", -4.718498871295094),
+                                    ("April<time> <day-of-month>", -5.2293244950610855),
+                                    ("February<time> <day-of-month>", -2.614364717024887),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -3.619886582626985),
+                                    ("year (numeric with year symbol)\22823\25995\26399",
+                                     -4.941642422609305),
+                                    ("this <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("year (numeric with year symbol)\22235\26092\33410",
+                                     -5.2293244950610855),
+                                    ("yearmonth", -3.332204510175204),
+                                    ("year (numeric with year symbol)\20303\26842\33410",
+                                     -5.2293244950610855),
+                                    ("dayminute", -4.718498871295094),
+                                    ("next <cycle>September", -5.634789603169249),
+                                    ("intersect by \",\"<time> <day-of-month>", -3.619886582626985),
+                                    ("xxxx yearMarch", -5.634789603169249),
+                                    ("absorption of , after named dayintersect",
+                                     -3.619886582626985),
+                                    ("intersect<time> <day-of-month>", -2.8015762591130335),
+                                    ("next <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("tonight<time-of-day> o'clock", -4.718498871295094),
+                                    ("year (numeric with year symbol)intersect",
+                                     -3.494723439672979),
+                                    ("yearday", -2.0794415416798357),
+                                    ("absorption of , after named dayFebruary", -4.248495242049359),
+                                    ("year (numeric with year symbol)\19971\19971\33410",
+                                     -4.248495242049359),
+                                    ("year (numeric with year symbol)\36926\36234\33410",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)\29369\22826\26032\24180",
+                                     -5.2293244950610855),
+                                    ("yearminute", -5.2293244950610855),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -4.718498871295094)],
+                               n = 256},
+                   koData =
+                     ClassData{prior = -2.894068619777491, unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -2.159484249353372),
+                                    ("dayhour", -2.7472709142554916),
+                                    ("year (numeric with year symbol)Sunday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day><time-of-day> o'clock",
+                                     -3.258096538021482),
+                                    ("hourhour", -3.258096538021482),
+                                    ("hourminute", -2.7472709142554916),
+                                    ("dayminute", -2.7472709142554916),
+                                    ("yearday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.7472709142554916)],
+                               n = 15}}),
+       ("half after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20399\20029\33410",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.625967214385311, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.21905356606268464,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("Saturday",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.570544858467613, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -1.5198257537444133),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.367123614131617), ("month", -1.5198257537444133)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.832909122935104, 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}}),
+       ("\22307\27583\34987\27585\26085",
+        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 <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}}),
+       ("\35199\36203\25176\25289\33410",
+        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}}),
+       ("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}}),
+       ("\20811\21704\29305\26222\36838\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21313\32988\33410",
+        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}}),
+       ("evening|night",
+        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}}),
+       ("\20303\26842\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\19977\19968\20027\26085",
+        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}}),
+       ("\30331\38660\33410",
+        Classifier{okData =
+                     ClassData{prior = 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.15415067982725836,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("\19971\19971\33410",
+        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.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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3564413979702095),
+                                    ("integer (20,30,40)", -3.0910424533583156),
+                                    ("integer with consecutive unit modifiers", -1.245215762859985),
+                                    ("integer (0..10)", -1.4170660197866443),
+                                    ("number suffix: \21313|\25342", -2.1102132003465894),
+                                    ("compose by multiplication", -3.0910424533583156)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.5105920777974677,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)", -0.3629054936893685),
+                                    ("number suffix: \21313|\25342", -2.03688192726104)],
+                               n = 17}}),
+       ("\19996\27491\25945\22797\27963\33410",
+        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}}),
+       ("hh:mm (time-of-day)",
+        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}}),
+       ("relative (1-9) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2754119798599665,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.174751721484161),
+                                    ("integer (0..10)", -0.1466034741918754)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -1.4240346891027378, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("one point 2", -1.1631508098056809)],
+                               n = 13}}),
+       ("\36926\36234\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -0.6931471805599453),
+                                    ("monthday", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22235\26092\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19996\27491\25945\22307\21608\20845",
+        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}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20016\25910\33410",
+        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}}),
+       ("\20809\26126\33410",
+        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 (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}}),
+       ("relative (10-59) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)compose by multiplication",
+                                     -2.164963715117998),
+                                    ("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.9753796482441617),
+                                    ("hour", -0.7435780341868373)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)number suffix: \21313|\25342",
+                                     -1.413693335308005),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.413693335308005),
+                                    ("hour", -0.7777045685880083)],
+                               n = 16}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 47},
+                   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}}),
+       ("\22823\25995\26399",
+        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}}),
+       ("\24858\20154\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\29369\22826\26893\26641\33410",
+        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}}),
+       ("\19996\27491\25945\22797\27963\33410\26143\26399\19968",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\28789\33410\24198\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 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 = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("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}}),
+       ("\22522\30563\22307\20307\33410",
+        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}}),
+       ("\28595\38376\22238\24402\32426\24565\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20804\22969\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 <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}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   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}}),
+       ("\36174\32618\26085",
+        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}}),
+       ("February",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8909729238898653,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1526795099383855),
+                                    ("month (grain)", -2.2512917986064953),
+                                    ("year (grain)", -2.538973871058276),
+                                    ("week (grain)", -1.1526795099383855),
+                                    ("year", -2.538973871058276), ("month", -2.2512917986064953)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.5280674302004967, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7731898882334817),
+                                    ("week (grain)", -0.7731898882334817)],
+                               n = 23}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4462871026284195, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.0216512475319814,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("xxxx year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)integer (0..10)integer (0..10)",
+                                     0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -7.696104113612832e-2,
+                               unseen = -4.6913478822291435,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.750305594399894),
+                                    ("national dayevening|night", -3.58351893845611),
+                                    ("<named-month> <day-of-month>morning", -2.117181869662683),
+                                    ("\24773\20154\33410evening|night", -3.58351893845611),
+                                    ("\20799\31461\33410afternoon", -3.58351893845611),
+                                    ("intersectmorning", -2.117181869662683),
+                                    ("<time> <day-of-month>morning", -2.117181869662683),
+                                    ("Mondaymorning", -2.4849066497880004)],
+                               n = 50},
+                   koData =
+                     ClassData{prior = -2.6026896854443837, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1631508098056809),
+                                    ("<time> <day-of-month>morning", -1.1631508098056809)],
+                               n = 4}}),
+       ("<part-of-day> <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7935659283069926,
+                               unseen = -5.0369526024136295,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -3.4210000089583352),
+                                    ("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -1.6631420914059614),
+                                    ("hourhour", -2.322387720290225),
+                                    ("afternoon<time-of-day> o'clock", -3.644143560272545),
+                                    ("hourminute", -0.9699949108460162),
+                                    ("afternoon<integer> (latent time-of-day)", -3.644143560272545),
+                                    ("afternoonrelative (1-9) minutes after|past <integer> (hour-of-day)",
+                                     -2.72785282839839),
+                                    ("afternoonhh:mm (time-of-day)", -3.644143560272545),
+                                    ("tonight<time-of-day> o'clock", -3.4210000089583352),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -2.4654885639308985),
+                                    ("afternoonhalf after|past <integer> (hour-of-day)",
+                                     -3.2386784521643803)],
+                               n = 71},
+                   koData =
+                     ClassData{prior = -0.6018985090948004, unseen = -5.214935757608986,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.3762728087852047),
+                                    ("hourhour", -0.9899784476653142),
+                                    ("afternoon<time-of-day> o'clock", -1.7754989483562746),
+                                    ("hourminute", -2.21375387928743),
+                                    ("afternoon<integer> (latent time-of-day)", -1.571899993115035),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -3.82319179172153)],
+                               n = 86}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -6.244166900663736,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342month (grain)",
+                                     -4.632785353021065),
+                                    ("week", -3.0233474405869645),
+                                    ("integer (0..10)month (grain)", -2.745715703988685),
+                                    ("integer (0..10)hour (grain)", -3.1067290495260154),
+                                    ("<number>\20010/\20491week (grain)", -3.8443279926567944),
+                                    ("compose by multiplicationminute (grain)", -4.45046379622711),
+                                    ("second", -3.6031659358399066),
+                                    ("integer (0..10)day (grain)", -3.1067290495260154),
+                                    ("integer (0..10)year (grain)", -3.7573166156671647),
+                                    ("<number>\20010/\20491month (grain)", -3.469634543215384),
+                                    ("integer (numeric)year (grain)", -2.3710222545472743),
+                                    ("integer (0..10)second (grain)", -3.6031659358399066),
+                                    ("day", -3.1067290495260154), ("year", -2.1646858215494458),
+                                    ("integer (0..10)minute (grain)", -2.984126727433683),
+                                    ("number suffix: \21313|\25342minute (grain)",
+                                     -4.855928904335275),
+                                    ("hour", -3.1067290495260154),
+                                    ("integer (0..10)week (grain)", -3.534173064352955),
+                                    ("month", -2.008116760857906),
+                                    ("integer (numeric)month (grain)", -3.3518515075590005),
+                                    ("integer with consecutive unit modifiersminute (grain)",
+                                     -4.296313116399852),
+                                    ("minute", -2.553343811341229)],
+                               n = 246}}),
+       ("\32769\26495\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\31709\28779\33410",
+        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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4353180712578455, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -0.9555114450274363),
+                                    ("<integer> (latent time-of-day)", -2.159484249353372),
+                                    ("hour", -2.159484249353372), ("minute", -0.9555114450274363)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.041453874828161, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.8266785731844679),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6}}),
+       ("one point 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.9650808960435872),
+                                    ("integer (0..10)number suffix: \21313|\25342",
+                                     -1.9459101490553135),
+                                    ("integer (0..10)integer with consecutive unit modifiers",
+                                     -1.3397743454849977),
+                                    ("integer (0..10)<number>\20010/\20491", -2.639057329615259),
+                                    ("integer (0..10)compose by multiplication",
+                                     -2.639057329615259),
+                                    ("integer (0..10)half", -2.639057329615259)],
+                               n = 36}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2380465718564744),
+                                    ("Sunday<named-month> <day-of-month>", -1.6094379124341003),
+                                    ("SundayFebruary", -2.2380465718564744),
+                                    ("dayday", -0.9501922835498364),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\26837\26525\20027\26085",
+        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}}),
+       ("\38463\33298\25289\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.2876820724517809)],
+                               n = 2}}),
+       ("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}}),
+       ("\19996\27491\25945\32822\31267\21463\38590\26085",
+        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}}),
+       ("\25289\25746\36335\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = 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> 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}}),
+       ("\22307\35806\33410",
+        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 <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7308875085427924), ("Sunday", -1.2163953243244932),
+                                    ("Tuesday", -1.5040773967762742)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20234\26031\20848\26032\24180",
+        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}}),
+       ("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}}),
+       ("\24320\25995\33410",
+        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 after tomorrow",
+        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}}),
+       ("\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("\22919\22899\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20840\29699\38738\24180\26381\21153\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\27431\21335\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20061\22812\33410",
+        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 = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7731898882334817), ("Tuesday", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -0.7731898882334817),
+                                    ("day", -0.7731898882334817)],
+                               n = 5}}),
+       ("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}}),
+       ("\20197\33394\21015\29420\31435\26085",
+        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 n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.9856819377004897),
+                                    ("second", -2.803360380906535),
+                                    ("integer (0..10)day (grain)", -2.515678308454754),
+                                    ("integer (0..10)year (grain)", -3.2088254890146994),
+                                    ("<number>\20010/\20491month (grain)", -2.803360380906535),
+                                    ("integer (0..10)second (grain)", -2.803360380906535),
+                                    ("day", -2.515678308454754), ("year", -3.2088254890146994),
+                                    ("integer (0..10)minute (grain)", -2.649209701079277),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.803360380906535), ("minute", -2.649209701079277)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19975\22307\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21476\23572\37030\33410",
+        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}}),
+       ("number of five minutes",
+        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 (0..10)", 0.0)],
+                               n = 2}}),
+       ("\20799\31461\33410",
+        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}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = -3.922071315328127e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -3.258096538021482, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\26149\33410",
+        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.number minutes",
+        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 (0..10)integer with consecutive unit modifiersminute (grain)",
+                                     -1.0986122886681098),
+                                    ("integer (0..10)compose by multiplicationminute (grain)",
+                                     -1.6094379124341003),
+                                    ("minute", -0.7621400520468967)],
+                               n = 6}}),
+       ("\32822\31267\21463\38590\26085",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.762173934797756,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (0..10)", -2.5563656137701454),
+                                    ("Marchinteger (numeric)", -3.144152278672264),
+                                    ("Aprilinteger (numeric)", -3.654977902438255),
+                                    ("Februaryinteger (0..10)", -2.6741486494265287),
+                                    ("Februarynumber suffix: \21313|\25342", -2.6741486494265287),
+                                    ("month", -0.7462570058738938),
+                                    ("Februaryinteger (numeric)", -2.5563656137701454),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -1.8091512119399242)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21171\21160\33410",
+        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}}),
+       ("\22797\27963\33410\26143\26399\19968",
+        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}}),
+       ("number suffix: \19975|\33836",
+        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}}),
+       ("\22823\25995\39318\26085",
+        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}}),
+       ("half",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("two days 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}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.5907987153721106, unseen = -5.407171771460119,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 221},
+                   koData =
+                     ClassData{prior = -0.8071778665977783, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2823823856765264), ("second", -2.505525936990736),
+                                    ("day", -2.793208009442517),
+                                    ("<integer> <unit-of-duration>", -0.8007778447523107),
+                                    ("hour", -2.2823823856765264), ("month", -2.2823823856765264),
+                                    ("minute", -2.2823823856765264)],
+                               n = 21}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -8.701137698962981e-2)],
+                               n = 10}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.908720896564361),
+                                    ("second", -2.908720896564361),
+                                    ("integer (0..10)day (grain)", -2.3978952727983707),
+                                    ("integer (0..10)year (grain)", -2.908720896564361),
+                                    ("<number>\20010/\20491month (grain)", -2.908720896564361),
+                                    ("integer (0..10)second (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("year", -2.908720896564361),
+                                    ("integer (0..10)minute (grain)", -2.908720896564361),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.908720896564361),
+                                    ("month", -2.908720896564361), ("minute", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\24527\24724\33410",
+        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}}),
+       ("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}}),
+       ("number suffix: \21313|\25342",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874,
+                               unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("\22320\29699\19968\23567\26102",
+        Classifier{okData =
+                     ClassData{prior = 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.38299225225610584,
+                               unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -1.1451323043030026,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("\22307\32426\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22797\27963\33410",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -3.509131981127006e-2)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2", -0.9808292530117262),
+                                    ("integer (0..10)", -0.4700036292457356)],
+                               n = 6}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)number suffix: \21313|\25342",
+                                     -0.15415067982725836)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2number suffix: \21313|\25342",
+                                     -0.2876820724517809)],
+                               n = 2}}),
+       ("\24773\20154\33410",
+        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}}),
+       ("\20116\26092\33410",
+        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}}),
+       ("\31070\22307\26143\26399\22235",
+        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}}),
+       ("\25995\26376",
+        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}}),
+       ("\27861\20196\20043\22812",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9810014688665833),
+                                    ("Monday", -1.9810014688665833), ("day", -0.8415671856782186),
+                                    ("hour", -2.9618307218783095), ("Tuesday", -1.6625477377480489),
+                                    ("week-end", -2.9618307218783095)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_TW.hs b/Duckling/Ranking/Classifiers/ZH_TW.hs
--- a/Duckling/Ranking/Classifiers/ZH_TW.hs
+++ b/Duckling/Ranking/Classifiers/ZH_TW.hs
@@ -21,928 +21,1555 @@
 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}}),
-       ("\22269\38469\28040\36153\32773\26435\30410\26085",
-        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}}),
-       ("\24314\20891\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -1.0076405104623831,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -0.45425527227759643,
-                               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}}),
-       ("number suffix: \21313",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               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}}),
-       ("\20803\26086",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -3.367295829986474),
-                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.7578579175523736),
-                                    ("dayday", -1.6094379124341003),
-                                    ("hourhour", -3.367295829986474),
-                                    ("hourminute", -3.367295829986474),
-                                    ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.6094379124341003),
-                                    ("dayminute", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.367295829986474),
-                                    ("yearday", -1.7578579175523736)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -2.065455299705096),
-                                    ("dayhour", -2.653241964607215),
-                                    ("daymonth", -2.1832383353614793),
-                                    ("year (numeric with year symbol)February", -3.164067588373206),
-                                    ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.164067588373206),
-                                    ("hourhour", -3.164067588373206),
-                                    ("year (numeric with year symbol)March", -2.653241964607215),
-                                    ("hourminute", -2.653241964607215),
-                                    ("yearmonth", -2.316769727986002),
-                                    ("dayminute", -2.653241964607215),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -2.653241964607215),
-                                    ("absorption of , after named dayFebruary",
-                                     -2.1832383353614793)],
-                               n = 27}}),
-       ("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}}),
-       ("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.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.4170660197866443, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3350010667323402),
-                                    ("integer (0..10)", -0.3794896217049037)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.2776317365982795,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -2.3608540011180215),
-                                    ("integer (0..10)", -0.28141245943818544),
-                                    ("<number>\20010/\20491", -1.890850371872286)],
-                               n = 50}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
-                                    ("monthday", -0.7308875085427924),
-                                    ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.0986122886681098)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = -0.10763066419236544,
-                               unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1631508098056809),
-                                    ("number suffix: \21313", -2.2617630984737906),
-                                    ("integer (0..10)", -0.5753641449035618)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -2.2823823856765264,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
-                               n = 5}}),
-       ("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}}),
-       ("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}}),
-       ("\24858\20154\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 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 = -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}}),
-       ("\28595\38376\22238\24402\32426\24565\26085",
-        Classifier{okData =
-                     ClassData{prior = 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 <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}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("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 = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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 = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7487170317147561),
-                                    ("national dayevening|night", -3.20545280453606),
-                                    ("<named-month> <day-of-month>morning", -1.2595426554807467),
-                                    ("\24773\20154\33410evening|night", -3.20545280453606),
-                                    ("\20799\31461\33410afternoon", -3.20545280453606),
-                                    ("Mondaymorning", -2.10684051586795)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<part-of-day> <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
-                                    ("hourhour", -1.3523928094442093),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.6625477377480489),
-                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
-                                    ("hourminute", -1.575536360758419),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -2.6741486494265287),
-                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -0.7841189587656721,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -1.4271163556401458),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.5141277326297755),
-                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
-                                    ("hourminute", -1.5141277326297755),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -1.9661128563728327)],
-                               n = 21}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.905361848054571,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6837575085331653),
-                                    ("integer (0..10)month (grain)", -2.535337503414892),
-                                    ("integer (0..10)hour (grain)", -3.06941998934515),
-                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
-                                    ("second", -3.2635760037861075),
-                                    ("integer (0..10)day (grain)", -3.06941998934515),
-                                    ("number suffix: \21313month (grain)", -4.293195420967266),
-                                    ("integer (0..10)year (grain)", -3.6000482404073204),
-                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
-                                    ("integer (numeric)year (grain)", -3.1945831322991562),
-                                    ("integer (0..10)second (grain)", -3.2635760037861075),
-                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
-                                    ("integer (0..10)minute (grain)", -3.06941998934515),
-                                    ("hour", -2.8581108956779433),
-                                    ("integer (0..10)week (grain)", -3.1945831322991562),
-                                    ("month", -1.7754989483562746),
-                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
-                                    ("integer (numeric)month (grain)", -3.1945831322991562),
-                                    ("minute", -3.06941998934515)],
-                               n = 173}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
-                               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}}),
-       ("number suffix: \19975",
-        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}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
-                                     -0.7801585575495751),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)number suffix: \21313",
-                                     -1.3862943611198906),
-                                    ("<integer> (latent time-of-day)integer (0..10)",
-                                     -1.3862943611198906),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
-                                    ("dayday", -0.7270487322356266)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("SundayFebruary", -0.8109302162163288)],
-                               n = 7}}),
-       ("integer with consecutive unit modifiers",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
-                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               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}}),
-       ("\22307\35806\33410",
-        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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2286654169163076,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
-                                    ("Tuesday", -1.6422277352570913)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("month (numeric with month symbol)", -2.5649493574615367),
-                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
-                               n = 29}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               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}}),
-       ("\22919\22899\33410",
-        Classifier{okData =
-                     ClassData{prior = 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 = -1.6486586255873816, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.21357410029805904,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -2.1000608288825715),
-                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
-                                    ("month (numeric with month symbol)", -3.1986731175506815),
-                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
-                                    ("month", -3.1986731175506815)],
-                               n = 21}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4079456086518722),
-                                    ("integer (0..10)hour (grain)", -2.659260036932778),
-                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
-                                    ("second", -2.8134107167600364),
-                                    ("integer (0..10)day (grain)", -2.5257286443082556),
-                                    ("integer (0..10)year (grain)", -3.2188758248682006),
-                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
-                                    ("integer (0..10)second (grain)", -2.8134107167600364),
-                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
-                                    ("integer (0..10)minute (grain)", -2.659260036932778),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.8134107167600364),
-                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
-                                    ("minute", -2.659260036932778)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\19975\22307\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\20799\31461\33410",
-        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}}),
-       ("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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -5.231108616854587,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Marchinteger (0..10)", -3.4339872044851463),
-                                    ("Marchinteger (numeric)", -4.127134385045092),
-                                    ("month (numeric with month symbol)integer (numeric)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger (0..10)", -3.146305132033365),
-                                    ("month (numeric with month symbol)number suffix: \21313",
-                                     -3.146305132033365),
-                                    ("month", -0.7371103039810614),
-                                    ("month (numeric with month symbol)integer (0..10)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
-                               n = 88},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\21171\21160\33410",
-        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..10)",
-        Classifier{okData =
-                     ClassData{prior = -0.4090429294560484, unseen = -5.236441962829949,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
-                   koData =
-                     ClassData{prior = -1.0914948208992459, unseen = -4.564348191467836,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 94}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9856819377004897),
-                                    ("integer (0..10)month (grain)", -3.4965075614664802),
-                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
-                                    ("second", -2.649209701079277),
-                                    ("integer (0..10)day (grain)", -2.9856819377004897),
-                                    ("integer (0..10)year (grain)", -3.4965075614664802),
-                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
-                                    ("integer (0..10)second (grain)", -2.649209701079277),
-                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
-                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
-                                    ("hour", -2.3978952727983707),
-                                    ("integer (0..10)week (grain)", -2.9856819377004897),
-                                    ("month", -2.1972245773362196),
-                                    ("minute", -2.3978952727983707)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
-                               n = 4}}),
-       ("n <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4159137783010487),
-                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (0..10)day (grain)", -2.4159137783010487),
-                                    ("integer (0..10)year (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
-                                    ("integer (0..10)second (grain)", -2.9267394020670396),
-                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
-                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
-                                    ("hour", -2.4159137783010487),
-                                    ("integer (0..10)week (grain)", -2.9267394020670396),
-                                    ("month", -2.9267394020670396),
-                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
-                                    ("minute", -2.9267394020670396)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               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}}),
-       ("<number>\20010/\20491",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\24773\20154\33410",
-        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 <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}})]
+      [("\25490\28783\33410",
+        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}}),
+       ("\19996\27491\25945\26837\26525\20027\26085",
+        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}}),
+       ("number of 5 minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8979415932059586),
+                                    ("hour", -0.7308875085427924),
+                                    ("<integer> (latent time-of-day)<number>\20010/\20491",
+                                     -2.1972245773362196)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8109302162163288),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("\21360\24230\20016\25910\33410\31532\22235\22825",
+        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> 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.4700036292457356,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67}}),
+       ("\21355\22622\33410",
+        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 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}}),
+       ("\22269\38469\28040\36153\32773\26435\30410\26085",
+        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}}),
+       ("\24314\20891\33410",
+        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}}),
+       ("\29369\22826\26032\24180",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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.963437510299857, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -0.48058573857627246,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -1.466337068793427, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.262364264467491, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 30}}),
+       ("national day",
+        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}}),
+       ("integer (20,30,40)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\21360\24230\20016\25910\33410\31532\19977\22825",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("\22307\20250\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20803\26086",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("\32654\22269\29420\31435\26085",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -5.694137640013845e-2,
+                               unseen = -6.329720905522696,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -4.718498871295094),
+                                    ("year (numeric with year symbol)\20809\26126\33410",
+                                     -4.248495242049359),
+                                    ("xxxx year<named-month> <day-of-month>", -4.941642422609305),
+                                    ("daymonth", -4.248495242049359),
+                                    ("monthday", -1.9459101490553135),
+                                    ("next yearSeptember", -5.2293244950610855),
+                                    ("year (numeric with year symbol)\25995\26376",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)\20061\22812\33410",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)February", -4.718498871295094),
+                                    ("xxxx yearintersect", -4.941642422609305),
+                                    ("March<time> <day-of-month>", -3.7629874262676584),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -3.494723439672979),
+                                    ("monthhour", -3.7629874262676584),
+                                    ("year (numeric with year symbol)\22320\29699\19968\23567\26102",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)April", -5.2293244950610855),
+                                    ("dayday", -2.284885515894645),
+                                    ("hourhour", -4.718498871295094),
+                                    ("xxxx yearFebruary", -5.634789603169249),
+                                    ("year (numeric with year symbol)March", -4.1307122063929755),
+                                    ("February<dim time> <part-of-day>", -3.7629874262676584),
+                                    ("hourminute", -4.718498871295094),
+                                    ("April<time> <day-of-month>", -5.2293244950610855),
+                                    ("February<time> <day-of-month>", -2.614364717024887),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -3.619886582626985),
+                                    ("year (numeric with year symbol)\22823\25995\26399",
+                                     -4.941642422609305),
+                                    ("this <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("year (numeric with year symbol)\22235\26092\33410",
+                                     -5.2293244950610855),
+                                    ("yearmonth", -3.332204510175204),
+                                    ("year (numeric with year symbol)\20303\26842\33410",
+                                     -5.2293244950610855),
+                                    ("dayminute", -4.718498871295094),
+                                    ("next <cycle>September", -5.634789603169249),
+                                    ("intersect by \",\"<time> <day-of-month>", -3.619886582626985),
+                                    ("xxxx yearMarch", -5.634789603169249),
+                                    ("absorption of , after named dayintersect",
+                                     -3.619886582626985),
+                                    ("intersect<time> <day-of-month>", -2.8015762591130335),
+                                    ("next <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("tonight<time-of-day> o'clock", -4.718498871295094),
+                                    ("year (numeric with year symbol)intersect",
+                                     -3.494723439672979),
+                                    ("yearday", -2.0794415416798357),
+                                    ("absorption of , after named dayFebruary", -4.248495242049359),
+                                    ("year (numeric with year symbol)\19971\19971\33410",
+                                     -4.248495242049359),
+                                    ("year (numeric with year symbol)\36926\36234\33410",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)\29369\22826\26032\24180",
+                                     -5.2293244950610855),
+                                    ("yearminute", -5.2293244950610855),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -4.718498871295094)],
+                               n = 256},
+                   koData =
+                     ClassData{prior = -2.894068619777491, unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -2.159484249353372),
+                                    ("dayhour", -2.7472709142554916),
+                                    ("year (numeric with year symbol)Sunday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day><time-of-day> o'clock",
+                                     -3.258096538021482),
+                                    ("hourhour", -3.258096538021482),
+                                    ("hourminute", -2.7472709142554916),
+                                    ("dayminute", -2.7472709142554916),
+                                    ("yearday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.7472709142554916)],
+                               n = 15}}),
+       ("half after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20399\20029\33410",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.625967214385311, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.21905356606268464,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("Saturday",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.570544858467613, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -1.5198257537444133),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.367123614131617), ("month", -1.5198257537444133)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.832909122935104, 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}}),
+       ("\22307\27583\34987\27585\26085",
+        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 <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}}),
+       ("\35199\36203\25176\25289\33410",
+        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}}),
+       ("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}}),
+       ("\20811\21704\29305\26222\36838\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21313\32988\33410",
+        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}}),
+       ("evening|night",
+        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}}),
+       ("\20303\26842\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\19977\19968\20027\26085",
+        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}}),
+       ("\30331\38660\33410",
+        Classifier{okData =
+                     ClassData{prior = 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.15415067982725836,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("\19971\19971\33410",
+        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.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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3564413979702095),
+                                    ("integer (20,30,40)", -3.0910424533583156),
+                                    ("integer with consecutive unit modifiers", -1.245215762859985),
+                                    ("integer (0..10)", -1.4170660197866443),
+                                    ("number suffix: \21313|\25342", -2.1102132003465894),
+                                    ("compose by multiplication", -3.0910424533583156)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.5105920777974677,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)", -0.3629054936893685),
+                                    ("number suffix: \21313|\25342", -2.03688192726104)],
+                               n = 17}}),
+       ("\19996\27491\25945\22797\27963\33410",
+        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}}),
+       ("hh:mm (time-of-day)",
+        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}}),
+       ("relative (1-9) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2754119798599665,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.174751721484161),
+                                    ("integer (0..10)", -0.1466034741918754)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -1.4240346891027378, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("one point 2", -1.1631508098056809)],
+                               n = 13}}),
+       ("\36926\36234\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -0.6931471805599453),
+                                    ("monthday", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22235\26092\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19996\27491\25945\22307\21608\20845",
+        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}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20016\25910\33410",
+        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}}),
+       ("\20809\26126\33410",
+        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 (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}}),
+       ("relative (10-59) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)compose by multiplication",
+                                     -2.164963715117998),
+                                    ("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.9753796482441617),
+                                    ("hour", -0.7435780341868373)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)number suffix: \21313|\25342",
+                                     -1.413693335308005),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.413693335308005),
+                                    ("hour", -0.7777045685880083)],
+                               n = 16}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 47},
+                   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}}),
+       ("\22823\25995\26399",
+        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}}),
+       ("\24858\20154\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\29369\22826\26893\26641\33410",
+        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}}),
+       ("\19996\27491\25945\22797\27963\33410\26143\26399\19968",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\28789\33410\24198\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 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 = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("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}}),
+       ("\22522\30563\22307\20307\33410",
+        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}}),
+       ("\28595\38376\22238\24402\32426\24565\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20804\22969\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 <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}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   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}}),
+       ("\36174\32618\26085",
+        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}}),
+       ("February",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8909729238898653,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1526795099383855),
+                                    ("month (grain)", -2.2512917986064953),
+                                    ("year (grain)", -2.538973871058276),
+                                    ("week (grain)", -1.1526795099383855),
+                                    ("year", -2.538973871058276), ("month", -2.2512917986064953)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.5280674302004967, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7731898882334817),
+                                    ("week (grain)", -0.7731898882334817)],
+                               n = 23}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4462871026284195, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.0216512475319814,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("xxxx year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)integer (0..10)integer (0..10)",
+                                     0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -7.696104113612832e-2,
+                               unseen = -4.6913478822291435,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.750305594399894),
+                                    ("national dayevening|night", -3.58351893845611),
+                                    ("<named-month> <day-of-month>morning", -2.117181869662683),
+                                    ("\24773\20154\33410evening|night", -3.58351893845611),
+                                    ("\20799\31461\33410afternoon", -3.58351893845611),
+                                    ("intersectmorning", -2.117181869662683),
+                                    ("<time> <day-of-month>morning", -2.117181869662683),
+                                    ("Mondaymorning", -2.4849066497880004)],
+                               n = 50},
+                   koData =
+                     ClassData{prior = -2.6026896854443837, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1631508098056809),
+                                    ("<time> <day-of-month>morning", -1.1631508098056809)],
+                               n = 4}}),
+       ("<part-of-day> <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7935659283069926,
+                               unseen = -5.0369526024136295,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -3.4210000089583352),
+                                    ("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -1.6631420914059614),
+                                    ("hourhour", -2.322387720290225),
+                                    ("afternoon<time-of-day> o'clock", -3.644143560272545),
+                                    ("hourminute", -0.9699949108460162),
+                                    ("afternoon<integer> (latent time-of-day)", -3.644143560272545),
+                                    ("afternoonrelative (1-9) minutes after|past <integer> (hour-of-day)",
+                                     -2.72785282839839),
+                                    ("afternoonhh:mm (time-of-day)", -3.644143560272545),
+                                    ("tonight<time-of-day> o'clock", -3.4210000089583352),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -2.4654885639308985),
+                                    ("afternoonhalf after|past <integer> (hour-of-day)",
+                                     -3.2386784521643803)],
+                               n = 71},
+                   koData =
+                     ClassData{prior = -0.6018985090948004, unseen = -5.214935757608986,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.3762728087852047),
+                                    ("hourhour", -0.9899784476653142),
+                                    ("afternoon<time-of-day> o'clock", -1.7754989483562746),
+                                    ("hourminute", -2.21375387928743),
+                                    ("afternoon<integer> (latent time-of-day)", -1.571899993115035),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -3.82319179172153)],
+                               n = 86}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -6.244166900663736,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342month (grain)",
+                                     -4.632785353021065),
+                                    ("week", -3.0233474405869645),
+                                    ("integer (0..10)month (grain)", -2.745715703988685),
+                                    ("integer (0..10)hour (grain)", -3.1067290495260154),
+                                    ("<number>\20010/\20491week (grain)", -3.8443279926567944),
+                                    ("compose by multiplicationminute (grain)", -4.45046379622711),
+                                    ("second", -3.6031659358399066),
+                                    ("integer (0..10)day (grain)", -3.1067290495260154),
+                                    ("integer (0..10)year (grain)", -3.7573166156671647),
+                                    ("<number>\20010/\20491month (grain)", -3.469634543215384),
+                                    ("integer (numeric)year (grain)", -2.3710222545472743),
+                                    ("integer (0..10)second (grain)", -3.6031659358399066),
+                                    ("day", -3.1067290495260154), ("year", -2.1646858215494458),
+                                    ("integer (0..10)minute (grain)", -2.984126727433683),
+                                    ("number suffix: \21313|\25342minute (grain)",
+                                     -4.855928904335275),
+                                    ("hour", -3.1067290495260154),
+                                    ("integer (0..10)week (grain)", -3.534173064352955),
+                                    ("month", -2.008116760857906),
+                                    ("integer (numeric)month (grain)", -3.3518515075590005),
+                                    ("integer with consecutive unit modifiersminute (grain)",
+                                     -4.296313116399852),
+                                    ("minute", -2.553343811341229)],
+                               n = 246}}),
+       ("\32769\26495\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\31709\28779\33410",
+        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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4353180712578455, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -0.9555114450274363),
+                                    ("<integer> (latent time-of-day)", -2.159484249353372),
+                                    ("hour", -2.159484249353372), ("minute", -0.9555114450274363)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.041453874828161, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.8266785731844679),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6}}),
+       ("one point 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.9650808960435872),
+                                    ("integer (0..10)number suffix: \21313|\25342",
+                                     -1.9459101490553135),
+                                    ("integer (0..10)integer with consecutive unit modifiers",
+                                     -1.3397743454849977),
+                                    ("integer (0..10)<number>\20010/\20491", -2.639057329615259),
+                                    ("integer (0..10)compose by multiplication",
+                                     -2.639057329615259),
+                                    ("integer (0..10)half", -2.639057329615259)],
+                               n = 36}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2380465718564744),
+                                    ("Sunday<named-month> <day-of-month>", -1.6094379124341003),
+                                    ("SundayFebruary", -2.2380465718564744),
+                                    ("dayday", -0.9501922835498364),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\26837\26525\20027\26085",
+        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}}),
+       ("\38463\33298\25289\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.2876820724517809)],
+                               n = 2}}),
+       ("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}}),
+       ("\19996\27491\25945\32822\31267\21463\38590\26085",
+        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}}),
+       ("\25289\25746\36335\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = 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> 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}}),
+       ("\22307\35806\33410",
+        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 <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7308875085427924), ("Sunday", -1.2163953243244932),
+                                    ("Tuesday", -1.5040773967762742)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20234\26031\20848\26032\24180",
+        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}}),
+       ("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}}),
+       ("\24320\25995\33410",
+        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 after tomorrow",
+        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}}),
+       ("\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("\22919\22899\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20840\29699\38738\24180\26381\21153\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\27431\21335\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20061\22812\33410",
+        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 = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7731898882334817), ("Tuesday", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -0.7731898882334817),
+                                    ("day", -0.7731898882334817)],
+                               n = 5}}),
+       ("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}}),
+       ("\20197\33394\21015\29420\31435\26085",
+        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 n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.9856819377004897),
+                                    ("second", -2.803360380906535),
+                                    ("integer (0..10)day (grain)", -2.515678308454754),
+                                    ("integer (0..10)year (grain)", -3.2088254890146994),
+                                    ("<number>\20010/\20491month (grain)", -2.803360380906535),
+                                    ("integer (0..10)second (grain)", -2.803360380906535),
+                                    ("day", -2.515678308454754), ("year", -3.2088254890146994),
+                                    ("integer (0..10)minute (grain)", -2.649209701079277),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.803360380906535), ("minute", -2.649209701079277)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19975\22307\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21476\23572\37030\33410",
+        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}}),
+       ("number of five minutes",
+        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 (0..10)", 0.0)],
+                               n = 2}}),
+       ("\20799\31461\33410",
+        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}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = -3.922071315328127e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -3.258096538021482, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\26149\33410",
+        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.number minutes",
+        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 (0..10)integer with consecutive unit modifiersminute (grain)",
+                                     -1.0986122886681098),
+                                    ("integer (0..10)compose by multiplicationminute (grain)",
+                                     -1.6094379124341003),
+                                    ("minute", -0.7621400520468967)],
+                               n = 6}}),
+       ("\32822\31267\21463\38590\26085",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.762173934797756,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (0..10)", -2.5563656137701454),
+                                    ("Marchinteger (numeric)", -3.144152278672264),
+                                    ("Aprilinteger (numeric)", -3.654977902438255),
+                                    ("Februaryinteger (0..10)", -2.6741486494265287),
+                                    ("Februarynumber suffix: \21313|\25342", -2.6741486494265287),
+                                    ("month", -0.7462570058738938),
+                                    ("Februaryinteger (numeric)", -2.5563656137701454),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -1.8091512119399242)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21171\21160\33410",
+        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}}),
+       ("\22797\27963\33410\26143\26399\19968",
+        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}}),
+       ("number suffix: \19975|\33836",
+        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}}),
+       ("\22823\25995\39318\26085",
+        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}}),
+       ("half",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("two days 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}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.5907987153721106, unseen = -5.407171771460119,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 221},
+                   koData =
+                     ClassData{prior = -0.8071778665977783, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2823823856765264), ("second", -2.505525936990736),
+                                    ("day", -2.793208009442517),
+                                    ("<integer> <unit-of-duration>", -0.8007778447523107),
+                                    ("hour", -2.2823823856765264), ("month", -2.2823823856765264),
+                                    ("minute", -2.2823823856765264)],
+                               n = 21}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -8.701137698962981e-2)],
+                               n = 10}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.908720896564361),
+                                    ("second", -2.908720896564361),
+                                    ("integer (0..10)day (grain)", -2.3978952727983707),
+                                    ("integer (0..10)year (grain)", -2.908720896564361),
+                                    ("<number>\20010/\20491month (grain)", -2.908720896564361),
+                                    ("integer (0..10)second (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("year", -2.908720896564361),
+                                    ("integer (0..10)minute (grain)", -2.908720896564361),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.908720896564361),
+                                    ("month", -2.908720896564361), ("minute", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\24527\24724\33410",
+        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}}),
+       ("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}}),
+       ("number suffix: \21313|\25342",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874,
+                               unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("\22320\29699\19968\23567\26102",
+        Classifier{okData =
+                     ClassData{prior = 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.38299225225610584,
+                               unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -1.1451323043030026,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("\22307\32426\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22797\27963\33410",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -3.509131981127006e-2)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2", -0.9808292530117262),
+                                    ("integer (0..10)", -0.4700036292457356)],
+                               n = 6}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)number suffix: \21313|\25342",
+                                     -0.15415067982725836)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2number suffix: \21313|\25342",
+                                     -0.2876820724517809)],
+                               n = 2}}),
+       ("\24773\20154\33410",
+        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}}),
+       ("\20116\26092\33410",
+        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}}),
+       ("\31070\22307\26143\26399\22235",
+        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}}),
+       ("\25995\26376",
+        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}}),
+       ("\27861\20196\20043\22812",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9810014688665833),
+                                    ("Monday", -1.9810014688665833), ("day", -0.8415671856782186),
+                                    ("hour", -2.9618307218783095), ("Tuesday", -1.6625477377480489),
+                                    ("week-end", -2.9618307218783095)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_XX.hs b/Duckling/Ranking/Classifiers/ZH_XX.hs
--- a/Duckling/Ranking/Classifiers/ZH_XX.hs
+++ b/Duckling/Ranking/Classifiers/ZH_XX.hs
@@ -21,920 +21,1545 @@
 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}}),
-       ("\22269\38469\28040\36153\32773\26435\30410\26085",
-        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}}),
-       ("\24314\20891\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.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 = -1.0076405104623831,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -0.45425527227759643,
-                               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}}),
-       ("number suffix: \21313",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               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}}),
-       ("\20803\26086",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -3.367295829986474),
-                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.7578579175523736),
-                                    ("dayday", -1.6094379124341003),
-                                    ("hourhour", -3.367295829986474),
-                                    ("hourminute", -3.367295829986474),
-                                    ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.6094379124341003),
-                                    ("dayminute", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.367295829986474),
-                                    ("yearday", -1.7578579175523736)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\20799\31461\33410<part-of-day> <dim time>",
-                                     -2.065455299705096),
-                                    ("dayhour", -2.653241964607215),
-                                    ("daymonth", -2.1832383353614793),
-                                    ("year (numeric with year symbol)February", -3.164067588373206),
-                                    ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.164067588373206),
-                                    ("hourhour", -3.164067588373206),
-                                    ("year (numeric with year symbol)March", -2.653241964607215),
-                                    ("hourminute", -2.653241964607215),
-                                    ("yearmonth", -2.316769727986002),
-                                    ("dayminute", -2.653241964607215),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -2.653241964607215),
-                                    ("absorption of , after named dayFebruary",
-                                     -2.1832383353614793)],
-                               n = 27}}),
-       ("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}}),
-       ("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.4170660197866443, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3350010667323402),
-                                    ("integer (0..10)", -0.3794896217049037)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.2776317365982795,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -2.3608540011180215),
-                                    ("integer (0..10)", -0.28141245943818544),
-                                    ("<number>\20010/\20491", -1.890850371872286)],
-                               n = 50}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
-                                    ("monthday", -0.7308875085427924),
-                                    ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.0986122886681098)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = -0.10763066419236544,
-                               unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1631508098056809),
-                                    ("number suffix: \21313", -2.2617630984737906),
-                                    ("integer (0..10)", -0.5753641449035618)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -2.2823823856765264,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
-                               n = 5}}),
-       ("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}}),
-       ("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}}),
-       ("\24858\20154\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 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 = -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}}),
-       ("\28595\38376\22238\24402\32426\24565\26085",
-        Classifier{okData =
-                     ClassData{prior = 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 <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}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("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 = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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 = -4.248495242049359,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7375989431307791),
-                                    ("<named-month> <day-of-month>morning", -1.1895840668738362),
-                                    ("\24773\20154\33410evening|night", -3.1354942159291497),
-                                    ("\20799\31461\33410afternoon", -3.1354942159291497),
-                                    ("Mondaymorning", -2.03688192726104)],
-                               n = 32},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<part-of-day> <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
-                                    ("hourhour", -1.3523928094442093),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.6625477377480489),
-                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
-                                    ("hourminute", -1.575536360758419),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -2.6741486494265287),
-                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
-                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -0.7841189587656721,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -1.4271163556401458),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.5141277326297755),
-                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
-                                    ("hourminute", -1.5141277326297755),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -1.9661128563728327)],
-                               n = 21}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.905361848054571,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6837575085331653),
-                                    ("integer (0..10)month (grain)", -2.535337503414892),
-                                    ("integer (0..10)hour (grain)", -3.06941998934515),
-                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
-                                    ("second", -3.2635760037861075),
-                                    ("integer (0..10)day (grain)", -3.06941998934515),
-                                    ("number suffix: \21313month (grain)", -4.293195420967266),
-                                    ("integer (0..10)year (grain)", -3.6000482404073204),
-                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
-                                    ("integer (numeric)year (grain)", -3.1945831322991562),
-                                    ("integer (0..10)second (grain)", -3.2635760037861075),
-                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
-                                    ("integer (0..10)minute (grain)", -3.06941998934515),
-                                    ("hour", -2.8581108956779433),
-                                    ("integer (0..10)week (grain)", -3.1945831322991562),
-                                    ("month", -1.7754989483562746),
-                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
-                                    ("integer (numeric)month (grain)", -3.1945831322991562),
-                                    ("minute", -3.06941998934515)],
-                               n = 173}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
-                               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}}),
-       ("number suffix: \19975",
-        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}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
-                                     -0.7801585575495751),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)number suffix: \21313",
-                                     -1.3862943611198906),
-                                    ("<integer> (latent time-of-day)integer (0..10)",
-                                     -1.3862943611198906),
-                                    ("hour", -0.7801585575495751)],
-                               n = 10}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
-                                    ("dayday", -0.7270487322356266)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("SundayFebruary", -0.8109302162163288)],
-                               n = 7}}),
-       ("integer with consecutive unit modifiers",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
-                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               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}}),
-       ("\22307\35806\33410",
-        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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2286654169163076,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
-                                    ("Tuesday", -1.6422277352570913)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("month (numeric with month symbol)", -2.5649493574615367),
-                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
-                               n = 29}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               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}}),
-       ("\22919\22899\33410",
-        Classifier{okData =
-                     ClassData{prior = 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 = -1.6486586255873816, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.21357410029805904,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -2.1000608288825715),
-                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
-                                    ("month (numeric with month symbol)", -3.1986731175506815),
-                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
-                                    ("month", -3.1986731175506815)],
-                               n = 21}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4079456086518722),
-                                    ("integer (0..10)hour (grain)", -2.659260036932778),
-                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
-                                    ("second", -2.8134107167600364),
-                                    ("integer (0..10)day (grain)", -2.5257286443082556),
-                                    ("integer (0..10)year (grain)", -3.2188758248682006),
-                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
-                                    ("integer (0..10)second (grain)", -2.8134107167600364),
-                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
-                                    ("integer (0..10)minute (grain)", -2.659260036932778),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.8134107167600364),
-                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
-                                    ("minute", -2.659260036932778)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\19975\22307\33410",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\20799\31461\33410",
-        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}}),
-       ("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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -5.231108616854587,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Marchinteger (0..10)", -3.4339872044851463),
-                                    ("Marchinteger (numeric)", -4.127134385045092),
-                                    ("month (numeric with month symbol)integer (numeric)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger (0..10)", -3.146305132033365),
-                                    ("month (numeric with month symbol)number suffix: \21313",
-                                     -3.146305132033365),
-                                    ("month", -0.7371103039810614),
-                                    ("month (numeric with month symbol)integer (0..10)",
-                                     -2.517696472610991),
-                                    ("Februaryinteger with consecutive unit modifiers",
-                                     -2.392533329656985),
-                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
-                               n = 88},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\21171\21160\33410",
-        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..10)",
-        Classifier{okData =
-                     ClassData{prior = -0.4090429294560484, unseen = -5.236441962829949,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
-                   koData =
-                     ClassData{prior = -1.0914948208992459, unseen = -4.564348191467836,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 94}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9856819377004897),
-                                    ("integer (0..10)month (grain)", -3.4965075614664802),
-                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
-                                    ("second", -2.649209701079277),
-                                    ("integer (0..10)day (grain)", -2.9856819377004897),
-                                    ("integer (0..10)year (grain)", -3.4965075614664802),
-                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
-                                    ("integer (0..10)second (grain)", -2.649209701079277),
-                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
-                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
-                                    ("hour", -2.3978952727983707),
-                                    ("integer (0..10)week (grain)", -2.9856819377004897),
-                                    ("month", -2.1972245773362196),
-                                    ("minute", -2.3978952727983707)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
-                               n = 4}}),
-       ("n <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4159137783010487),
-                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (0..10)day (grain)", -2.4159137783010487),
-                                    ("integer (0..10)year (grain)", -2.9267394020670396),
-                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
-                                    ("integer (0..10)second (grain)", -2.9267394020670396),
-                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
-                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
-                                    ("hour", -2.4159137783010487),
-                                    ("integer (0..10)week (grain)", -2.9267394020670396),
-                                    ("month", -2.9267394020670396),
-                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
-                                    ("minute", -2.9267394020670396)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               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}}),
-       ("<number>\20010/\20491",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\24773\20154\33410",
-        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 <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}})]
+      [("\25490\28783\33410",
+        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}}),
+       ("\19996\27491\25945\26837\26525\20027\26085",
+        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}}),
+       ("number of 5 minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8979415932059586),
+                                    ("hour", -0.7308875085427924),
+                                    ("<integer> (latent time-of-day)<number>\20010/\20491",
+                                     -2.1972245773362196)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.8109302162163288),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("\21360\24230\20016\25910\33410\31532\22235\22825",
+        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> 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.4700036292457356,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -4.23410650459726,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 67}}),
+       ("\21355\22622\33410",
+        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 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}}),
+       ("\22269\38469\28040\36153\32773\26435\30410\26085",
+        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}}),
+       ("\24314\20891\33410",
+        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}}),
+       ("\29369\22826\26032\24180",
+        Classifier{okData =
+                     ClassData{prior = 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}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   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}}),
+       ("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.963437510299857, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -0.48058573857627246,
+                               unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 47}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -1.466337068793427, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.262364264467491, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 30}}),
+       ("integer (20,30,40)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\21360\24230\20016\25910\33410\31532\19977\22825",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("\22307\20250\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20803\26086",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("\32654\22269\29420\31435\26085",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -5.694137640013845e-2,
+                               unseen = -6.329720905522696,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -4.718498871295094),
+                                    ("year (numeric with year symbol)\20809\26126\33410",
+                                     -4.248495242049359),
+                                    ("xxxx year<named-month> <day-of-month>", -4.941642422609305),
+                                    ("daymonth", -4.248495242049359),
+                                    ("monthday", -1.9459101490553135),
+                                    ("next yearSeptember", -5.2293244950610855),
+                                    ("year (numeric with year symbol)\25995\26376",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)\20061\22812\33410",
+                                     -4.941642422609305),
+                                    ("year (numeric with year symbol)February", -4.718498871295094),
+                                    ("xxxx yearintersect", -4.941642422609305),
+                                    ("March<time> <day-of-month>", -3.7629874262676584),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -3.494723439672979),
+                                    ("monthhour", -3.7629874262676584),
+                                    ("year (numeric with year symbol)\22320\29699\19968\23567\26102",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)April", -5.2293244950610855),
+                                    ("dayday", -2.284885515894645),
+                                    ("hourhour", -4.718498871295094),
+                                    ("xxxx yearFebruary", -5.634789603169249),
+                                    ("year (numeric with year symbol)March", -4.1307122063929755),
+                                    ("February<dim time> <part-of-day>", -3.7629874262676584),
+                                    ("hourminute", -4.718498871295094),
+                                    ("April<time> <day-of-month>", -5.2293244950610855),
+                                    ("February<time> <day-of-month>", -2.614364717024887),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -3.619886582626985),
+                                    ("year (numeric with year symbol)\22823\25995\26399",
+                                     -4.941642422609305),
+                                    ("this <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("year (numeric with year symbol)\22235\26092\33410",
+                                     -5.2293244950610855),
+                                    ("yearmonth", -3.332204510175204),
+                                    ("year (numeric with year symbol)\20303\26842\33410",
+                                     -5.2293244950610855),
+                                    ("dayminute", -4.718498871295094),
+                                    ("next <cycle>September", -5.634789603169249),
+                                    ("intersect by \",\"<time> <day-of-month>", -3.619886582626985),
+                                    ("xxxx yearMarch", -5.634789603169249),
+                                    ("absorption of , after named dayintersect",
+                                     -3.619886582626985),
+                                    ("intersect<time> <day-of-month>", -2.8015762591130335),
+                                    ("next <cycle><time> <day-of-month>", -4.941642422609305),
+                                    ("tonight<time-of-day> o'clock", -4.718498871295094),
+                                    ("year (numeric with year symbol)intersect",
+                                     -3.494723439672979),
+                                    ("yearday", -2.0794415416798357),
+                                    ("absorption of , after named dayFebruary", -4.248495242049359),
+                                    ("year (numeric with year symbol)\19971\19971\33410",
+                                     -4.248495242049359),
+                                    ("year (numeric with year symbol)\36926\36234\33410",
+                                     -5.2293244950610855),
+                                    ("year (numeric with year symbol)\29369\22826\26032\24180",
+                                     -5.2293244950610855),
+                                    ("yearminute", -5.2293244950610855),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -4.718498871295094)],
+                               n = 256},
+                   koData =
+                     ClassData{prior = -2.894068619777491, unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\20799\31461\33410<part-of-day> <dim time>",
+                                     -2.159484249353372),
+                                    ("dayhour", -2.7472709142554916),
+                                    ("year (numeric with year symbol)Sunday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day><time-of-day> o'clock",
+                                     -3.258096538021482),
+                                    ("hourhour", -3.258096538021482),
+                                    ("hourminute", -2.7472709142554916),
+                                    ("dayminute", -2.7472709142554916),
+                                    ("yearday", -3.6635616461296463),
+                                    ("<dim time> <part-of-day>relative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.7472709142554916)],
+                               n = 15}}),
+       ("half after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20399\20029\33410",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.625967214385311, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.21905356606268464,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("Saturday",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.570544858467613, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -1.5198257537444133),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.367123614131617), ("month", -1.5198257537444133)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.832909122935104, 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}}),
+       ("\22307\27583\34987\27585\26085",
+        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 <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}}),
+       ("\35199\36203\25176\25289\33410",
+        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}}),
+       ("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}}),
+       ("\20811\21704\29305\26222\36838\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21313\32988\33410",
+        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}}),
+       ("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}}),
+       ("\20303\26842\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\19977\19968\20027\26085",
+        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}}),
+       ("\30331\38660\33410",
+        Classifier{okData =
+                     ClassData{prior = 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.15415067982725836,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("\19971\19971\33410",
+        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.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.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24946085963158313,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3564413979702095),
+                                    ("integer (20,30,40)", -3.0910424533583156),
+                                    ("integer with consecutive unit modifiers", -1.245215762859985),
+                                    ("integer (0..10)", -1.4170660197866443),
+                                    ("number suffix: \21313|\25342", -2.1102132003465894),
+                                    ("compose by multiplication", -3.0910424533583156)],
+                               n = 60},
+                   koData =
+                     ClassData{prior = -1.5105920777974677,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)", -0.3629054936893685),
+                                    ("number suffix: \21313|\25342", -2.03688192726104)],
+                               n = 17}}),
+       ("\19996\27491\25945\22797\27963\33410",
+        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}}),
+       ("hh:mm (time-of-day)",
+        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}}),
+       ("relative (1-9) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.2754119798599665,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.174751721484161),
+                                    ("integer (0..10)", -0.1466034741918754)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -1.4240346891027378, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("one point 2", -1.1631508098056809)],
+                               n = 13}}),
+       ("\36926\36234\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -0.6931471805599453),
+                                    ("monthday", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22235\26092\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19996\27491\25945\22307\21608\20845",
+        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}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20016\25910\33410",
+        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}}),
+       ("\20809\26126\33410",
+        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 (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}}),
+       ("relative (10-59) minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)compose by multiplication",
+                                     -2.164963715117998),
+                                    ("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.9753796482441617),
+                                    ("hour", -0.7435780341868373)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)number suffix: \21313|\25342",
+                                     -1.413693335308005),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.413693335308005),
+                                    ("hour", -0.7777045685880083)],
+                               n = 16}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 47},
+                   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}}),
+       ("\22823\25995\26399",
+        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}}),
+       ("\24858\20154\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\29369\22826\26893\26641\33410",
+        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}}),
+       ("\19996\27491\25945\22797\27963\33410\26143\26399\19968",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22307\28789\33410\24198\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 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 = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("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}}),
+       ("\22522\30563\22307\20307\33410",
+        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}}),
+       ("\28595\38376\22238\24402\32426\24565\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21360\24230\20804\22969\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 <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}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   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}}),
+       ("\36174\32618\26085",
+        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}}),
+       ("February",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8909729238898653,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1526795099383855),
+                                    ("month (grain)", -2.2512917986064953),
+                                    ("year (grain)", -2.538973871058276),
+                                    ("week (grain)", -1.1526795099383855),
+                                    ("year", -2.538973871058276), ("month", -2.2512917986064953)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.5280674302004967, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7731898882334817),
+                                    ("week (grain)", -0.7731898882334817)],
+                               n = 23}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.4462871026284195, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -1.0216512475319814,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("xxxx year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)integer (0..10)integer (0..10)",
+                                     0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.7429086901190092),
+                                    ("<named-month> <day-of-month>morning", -2.069779630768099),
+                                    ("\24773\20154\33410evening|night", -3.536116699561526),
+                                    ("\20799\31461\33410afternoon", -3.536116699561526),
+                                    ("intersectmorning", -2.069779630768099),
+                                    ("<time> <day-of-month>morning", -2.069779630768099),
+                                    ("Mondaymorning", -2.4375044108934163)],
+                               n = 48},
+                   koData =
+                     ClassData{prior = -2.5649493574615367, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.0986122886681098),
+                                    ("<time> <day-of-month>morning", -1.0986122886681098)],
+                               n = 4}}),
+       ("<part-of-day> <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7935659283069926,
+                               unseen = -5.0369526024136295,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -3.4210000089583352),
+                                    ("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -1.6631420914059614),
+                                    ("hourhour", -2.322387720290225),
+                                    ("afternoon<time-of-day> o'clock", -3.644143560272545),
+                                    ("hourminute", -0.9699949108460162),
+                                    ("afternoon<integer> (latent time-of-day)", -3.644143560272545),
+                                    ("afternoonrelative (1-9) minutes after|past <integer> (hour-of-day)",
+                                     -2.72785282839839),
+                                    ("afternoonhh:mm (time-of-day)", -3.644143560272545),
+                                    ("tonight<time-of-day> o'clock", -3.4210000089583352),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -2.4654885639308985),
+                                    ("afternoonhalf after|past <integer> (hour-of-day)",
+                                     -3.2386784521643803)],
+                               n = 71},
+                   koData =
+                     ClassData{prior = -0.6018985090948004, unseen = -5.214935757608986,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoonrelative (10-59) minutes after|past <integer> (hour-of-day)",
+                                     -2.3762728087852047),
+                                    ("hourhour", -0.9899784476653142),
+                                    ("afternoon<time-of-day> o'clock", -1.7754989483562746),
+                                    ("hourminute", -2.21375387928743),
+                                    ("afternoon<integer> (latent time-of-day)", -1.571899993115035),
+                                    ("afternoonnumber of 5 minutes after|past <integer> (hour-of-day)",
+                                     -3.82319179172153)],
+                               n = 86}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -6.244166900663736,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342month (grain)",
+                                     -4.632785353021065),
+                                    ("week", -3.0233474405869645),
+                                    ("integer (0..10)month (grain)", -2.745715703988685),
+                                    ("integer (0..10)hour (grain)", -3.1067290495260154),
+                                    ("<number>\20010/\20491week (grain)", -3.8443279926567944),
+                                    ("compose by multiplicationminute (grain)", -4.45046379622711),
+                                    ("second", -3.6031659358399066),
+                                    ("integer (0..10)day (grain)", -3.1067290495260154),
+                                    ("integer (0..10)year (grain)", -3.7573166156671647),
+                                    ("<number>\20010/\20491month (grain)", -3.469634543215384),
+                                    ("integer (numeric)year (grain)", -2.3710222545472743),
+                                    ("integer (0..10)second (grain)", -3.6031659358399066),
+                                    ("day", -3.1067290495260154), ("year", -2.1646858215494458),
+                                    ("integer (0..10)minute (grain)", -2.984126727433683),
+                                    ("number suffix: \21313|\25342minute (grain)",
+                                     -4.855928904335275),
+                                    ("hour", -3.1067290495260154),
+                                    ("integer (0..10)week (grain)", -3.534173064352955),
+                                    ("month", -2.008116760857906),
+                                    ("integer (numeric)month (grain)", -3.3518515075590005),
+                                    ("integer with consecutive unit modifiersminute (grain)",
+                                     -4.296313116399852),
+                                    ("minute", -2.553343811341229)],
+                               n = 246}}),
+       ("\32769\26495\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\31709\28779\33410",
+        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> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4353180712578455, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -0.9555114450274363),
+                                    ("<integer> (latent time-of-day)", -2.159484249353372),
+                                    ("hour", -2.159484249353372), ("minute", -0.9555114450274363)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.041453874828161, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.8266785731844679),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6}}),
+       ("one point 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.9650808960435872),
+                                    ("integer (0..10)number suffix: \21313|\25342",
+                                     -1.9459101490553135),
+                                    ("integer (0..10)integer with consecutive unit modifiers",
+                                     -1.3397743454849977),
+                                    ("integer (0..10)<number>\20010/\20491", -2.639057329615259),
+                                    ("integer (0..10)compose by multiplication",
+                                     -2.639057329615259),
+                                    ("integer (0..10)half", -2.639057329615259)],
+                               n = 36}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2380465718564744),
+                                    ("Sunday<named-month> <day-of-month>", -1.6094379124341003),
+                                    ("SundayFebruary", -2.2380465718564744),
+                                    ("dayday", -0.9501922835498364),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\26837\26525\20027\26085",
+        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}}),
+       ("\38463\33298\25289\33410",
+        Classifier{okData =
+                     ClassData{prior = 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 with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313|\25342integer (0..10)",
+                                     -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -2.890371757896165, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)integer (0..10)", -0.2876820724517809)],
+                               n = 2}}),
+       ("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}}),
+       ("\19996\27491\25945\32822\31267\21463\38590\26085",
+        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}}),
+       ("\25289\25746\36335\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = 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> 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}}),
+       ("\22307\35806\33410",
+        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 <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7308875085427924), ("Sunday", -1.2163953243244932),
+                                    ("Tuesday", -1.5040773967762742)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20234\26031\20848\26032\24180",
+        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}}),
+       ("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}}),
+       ("\24320\25995\33410",
+        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 after tomorrow",
+        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}}),
+       ("\22307\21608\20845",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("\22919\22899\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20840\29699\38738\24180\26381\21153\26085",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\27431\21335\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\20061\22812\33410",
+        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 = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7731898882334817), ("Tuesday", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -0.7731898882334817),
+                                    ("day", -0.7731898882334817)],
+                               n = 5}}),
+       ("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}}),
+       ("\20197\33394\21015\29420\31435\26085",
+        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 n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.9856819377004897),
+                                    ("second", -2.803360380906535),
+                                    ("integer (0..10)day (grain)", -2.515678308454754),
+                                    ("integer (0..10)year (grain)", -3.2088254890146994),
+                                    ("<number>\20010/\20491month (grain)", -2.803360380906535),
+                                    ("integer (0..10)second (grain)", -2.803360380906535),
+                                    ("day", -2.515678308454754), ("year", -3.2088254890146994),
+                                    ("integer (0..10)minute (grain)", -2.649209701079277),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.803360380906535), ("minute", -2.649209701079277)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\19975\22307\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21476\23572\37030\33410",
+        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}}),
+       ("number of five minutes",
+        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 (0..10)", 0.0)],
+                               n = 2}}),
+       ("\20799\31461\33410",
+        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}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = -3.922071315328127e-2,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -3.258096538021482, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("\26149\33410",
+        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.number minutes",
+        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 (0..10)integer with consecutive unit modifiersminute (grain)",
+                                     -1.0986122886681098),
+                                    ("integer (0..10)compose by multiplicationminute (grain)",
+                                     -1.6094379124341003),
+                                    ("minute", -0.7621400520468967)],
+                               n = 6}}),
+       ("\32822\31267\21463\38590\26085",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.762173934797756,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (0..10)", -2.5563656137701454),
+                                    ("Marchinteger (numeric)", -3.144152278672264),
+                                    ("Aprilinteger (numeric)", -3.654977902438255),
+                                    ("Februaryinteger (0..10)", -2.6741486494265287),
+                                    ("Februarynumber suffix: \21313|\25342", -2.6741486494265287),
+                                    ("month", -0.7462570058738938),
+                                    ("Februaryinteger (numeric)", -2.5563656137701454),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -1.8091512119399242)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\21171\21160\33410",
+        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}}),
+       ("\22797\27963\33410\26143\26399\19968",
+        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}}),
+       ("number suffix: \19975|\33836",
+        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}}),
+       ("\22823\25995\39318\26085",
+        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}}),
+       ("half",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("two days 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}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.5907987153721106, unseen = -5.407171771460119,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 221},
+                   koData =
+                     ClassData{prior = -0.8071778665977783, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2823823856765264), ("second", -2.505525936990736),
+                                    ("day", -2.793208009442517),
+                                    ("<integer> <unit-of-duration>", -0.8007778447523107),
+                                    ("hour", -2.2823823856765264), ("month", -2.2823823856765264),
+                                    ("minute", -2.2823823856765264)],
+                               n = 21}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -8.701137698962981e-2)],
+                               n = 10}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("<number>\20010/\20491week (grain)", -2.908720896564361),
+                                    ("second", -2.908720896564361),
+                                    ("integer (0..10)day (grain)", -2.3978952727983707),
+                                    ("integer (0..10)year (grain)", -2.908720896564361),
+                                    ("<number>\20010/\20491month (grain)", -2.908720896564361),
+                                    ("integer (0..10)second (grain)", -2.908720896564361),
+                                    ("day", -2.3978952727983707), ("year", -2.908720896564361),
+                                    ("integer (0..10)minute (grain)", -2.908720896564361),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.908720896564361),
+                                    ("month", -2.908720896564361), ("minute", -2.908720896564361)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\24527\24724\33410",
+        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}}),
+       ("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}}),
+       ("number suffix: \21313|\25342",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874,
+                               unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("\22320\29699\19968\23567\26102",
+        Classifier{okData =
+                     ClassData{prior = 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.38299225225610584,
+                               unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -1.1451323043030026,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("\22307\32426\33410",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\22797\27963\33410",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -3.509131981127006e-2)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2", -0.9808292530117262),
+                                    ("integer (0..10)", -0.4700036292457356)],
+                               n = 6}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..10)number suffix: \21313|\25342",
+                                     -0.15415067982725836)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("one point 2number suffix: \21313|\25342",
+                                     -0.2876820724517809)],
+                               n = 2}}),
+       ("\24773\20154\33410",
+        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}}),
+       ("\20116\26092\33410",
+        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}}),
+       ("\31070\22307\26143\26399\22235",
+        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}}),
+       ("\25995\26376",
+        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}}),
+       ("\27861\20196\20043\22812",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9810014688665833),
+                                    ("Monday", -1.9810014688665833), ("day", -0.8415671856782186),
+                                    ("hour", -2.9618307218783095), ("Tuesday", -1.6625477377480489),
+                                    ("week-end", -2.9618307218783095)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Extraction.hs b/Duckling/Ranking/Extraction.hs
--- a/Duckling/Ranking/Extraction.hs
+++ b/Duckling/Ranking/Extraction.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Ranking/Rank.hs b/Duckling/Ranking/Rank.hs
--- a/Duckling/Ranking/Rank.hs
+++ b/Duckling/Ranking/Rank.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE RecordWildCards #-}
@@ -13,8 +12,6 @@
   ( rank
   ) where
 
-import Control.Arrow ((***))
-import Control.Monad (join)
 import qualified Data.HashMap.Strict as HashMap
 import Data.HashSet (HashSet)
 import qualified Data.HashSet as HashSet
@@ -27,23 +24,25 @@
 import Duckling.Ranking.Types
 import Duckling.Types
 
-classify :: Classifier -> BagOfFeatures -> (Class, Double)
-classify Classifier {..} feats = if okScore >= koScore
-  then (True, okScore)
-  else (False, koScore)
-  where
-    (okScore, koScore) = join (***) (p feats) (okData, koData)
-    p :: BagOfFeatures -> ClassData -> Double
-    p feats ClassData{..} =
-      prior + HashMap.foldrWithKey (\feat x res ->
-        res + fromIntegral x * HashMap.lookupDefault unseen feat likelihoods
-      ) 0.0 feats
+-- | computes log likelihood of a class
+ll :: BagOfFeatures -> ClassData -> Double
+ll feats ClassData{..} =
+  prior +
+    HashMap.foldrWithKey
+      (\feat x res ->
+       res + fromIntegral x * HashMap.lookupDefault unseen feat likelihoods)
+      0.0
+      feats
 
+-- | computes positive class log likelihood
+posLL :: Classifier -> BagOfFeatures -> Double
+posLL Classifier {..} feats = ll feats okData
+
 score :: Classifiers -> Node -> Double
 score classifiers node@Node {rule = Just rule, ..} =
   case HashMap.lookup rule classifiers of
     Just c -> let feats = extractFeatures node
-      in snd (classify c feats) + sum (map (score classifiers) children)
+      in posLL c feats + sum (map (score classifiers) children)
     Nothing -> 0.0
 score _ Node {rule = Nothing} = 0.0
 
@@ -54,7 +53,7 @@
 -- | Return a curated list of tokens
 rank
   :: Classifiers
-  -> HashSet (Some Dimension)
+  -> HashSet (Seal Dimension)
   -> [ResolvedToken]
   -> [ResolvedToken]
 rank classifiers targets tokens =
@@ -65,4 +64,4 @@
   where
     makeCandidate :: ResolvedToken -> Candidate
     makeCandidate token@Resolved {node = n@Node {token = Token d _}} =
-      Candidate token (score classifiers n) $ HashSet.member (This d) targets
+      Candidate token (score classifiers n) $ HashSet.member (Seal d) targets
diff --git a/Duckling/Ranking/Types.hs b/Duckling/Ranking/Types.hs
--- a/Duckling/Ranking/Types.hs
+++ b/Duckling/Ranking/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NoRebindableSyntax #-}
diff --git a/Duckling/Regex/Types.hs b/Duckling/Regex/Types.hs
--- a/Duckling/Regex/Types.hs
+++ b/Duckling/Regex/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -22,7 +21,7 @@
 import Prelude
 import Duckling.Resolve (Resolve(..))
 
-data GroupMatch = GroupMatch [Text]
+newtype GroupMatch = GroupMatch [Text]
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
 
 instance Resolve GroupMatch where
diff --git a/Duckling/Region.hs b/Duckling/Region.hs
--- a/Duckling/Region.hs
+++ b/Duckling/Region.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -23,23 +22,32 @@
 -- | ISO 3166-1 alpha-2 Country code (includes regions and territories).
 -- See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
 data Region
-  = AU
+  = AR
+  | AU
   | BE
   | BZ
   | CA
+  | CL
   | CN
+  | CO
+  | EG
+  | ES
   | GB
   | HK
   | IE
   | IN
   | JM
+  | MN
+  | MX
   | MO
   | NL
   | NZ
+  | PE
   | PH
   | TT
   | TW
   | US
+  | VE
   | ZA
   deriving (Bounded, Enum, Eq, Generic, Hashable, Ord, Read, Show)
 
diff --git a/Duckling/Resolve.hs b/Duckling/Resolve.hs
--- a/Duckling/Resolve.hs
+++ b/Duckling/Resolve.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE FlexibleContexts #-}
diff --git a/Duckling/Rules.hs b/Duckling/Rules.hs
--- a/Duckling/Rules.hs
+++ b/Duckling/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -22,9 +21,12 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.Rules.AF as AFRules
 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.BN as BNRules
+import qualified Duckling.Rules.CA as CARules
 import qualified Duckling.Rules.CS as CSRules
 import qualified Duckling.Rules.DA as DARules
 import qualified Duckling.Rules.DE as DERules
@@ -32,6 +34,8 @@
 import qualified Duckling.Rules.EN as ENRules
 import qualified Duckling.Rules.ES as ESRules
 import qualified Duckling.Rules.ET as ETRules
+import qualified Duckling.Rules.FI as FIRules
+import qualified Duckling.Rules.FA as FARules
 import qualified Duckling.Rules.FR as FRRules
 import qualified Duckling.Rules.GA as GARules
 import qualified Duckling.Rules.HE as HERules
@@ -39,10 +43,16 @@
 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.IS as ISRules
 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.KM as KMRules
+import qualified Duckling.Rules.KN as KNRules
 import qualified Duckling.Rules.KO as KORules
+import qualified Duckling.Rules.LO as LORules
+import qualified Duckling.Rules.ML as MLRules
+import qualified Duckling.Rules.MN as MNRules
 import qualified Duckling.Rules.MY as MYRules
 import qualified Duckling.Rules.NB as NBRules
 import qualified Duckling.Rules.NE as NERules
@@ -51,15 +61,19 @@
 import qualified Duckling.Rules.PT as PTRules
 import qualified Duckling.Rules.RO as RORules
 import qualified Duckling.Rules.RU as RURules
+import qualified Duckling.Rules.SK as SKRules
 import qualified Duckling.Rules.SV as SVRules
+import qualified Duckling.Rules.SW as SWRules
 import qualified Duckling.Rules.TA as TARules
+import qualified Duckling.Rules.TE as TERules
+import qualified Duckling.Rules.TH as THRules
 import qualified Duckling.Rules.TR as TRRules
 import qualified Duckling.Rules.UK as UKRules
 import qualified Duckling.Rules.VI as VIRules
 import qualified Duckling.Rules.ZH as ZHRules
 
 -- | Returns the minimal set of rules required for `targets`.
-rulesFor :: Locale -> HashSet (Some Dimension) -> [Rule]
+rulesFor :: Locale -> HashSet (Seal Dimension) -> [Rule]
 rulesFor locale targets
   | HashSet.null targets = allRules locale
   | otherwise = [ rules | dims <- HashSet.toList $ explicitDimensions targets
@@ -71,16 +85,19 @@
 allRules locale@(Locale lang _) = concatMap (rulesFor' locale) . HashSet.toList
   . explicitDimensions . HashSet.fromList $ allDimensions lang
 
-rulesFor' :: Locale -> Some Dimension -> [Rule]
+rulesFor' :: Locale -> Seal 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 :: Lang -> Seal Dimension -> [Rule]
+defaultRules AF = AFRules.defaultRules
 defaultRules AR = ARRules.defaultRules
 defaultRules BG = BGRules.defaultRules
+defaultRules BN = BNRules.defaultRules
+defaultRules CA = CARules.defaultRules
 defaultRules CS = CSRules.defaultRules
 defaultRules DA = DARules.defaultRules
 defaultRules DE = DERules.defaultRules
@@ -88,6 +105,8 @@
 defaultRules EN = ENRules.defaultRules
 defaultRules ES = ESRules.defaultRules
 defaultRules ET = ETRules.defaultRules
+defaultRules FI = FIRules.defaultRules
+defaultRules FA = FARules.defaultRules
 defaultRules FR = FRRules.defaultRules
 defaultRules GA = GARules.defaultRules
 defaultRules HE = HERules.defaultRules
@@ -95,10 +114,16 @@
 defaultRules HR = HRRules.defaultRules
 defaultRules HU = HURules.defaultRules
 defaultRules ID = IDRules.defaultRules
+defaultRules IS = ISRules.defaultRules
 defaultRules IT = ITRules.defaultRules
 defaultRules JA = JARules.defaultRules
 defaultRules KA = KARules.defaultRules
+defaultRules KM = KMRules.defaultRules
+defaultRules KN = KNRules.defaultRules
 defaultRules KO = KORules.defaultRules
+defaultRules LO = LORules.defaultRules
+defaultRules ML = MLRules.defaultRules
+defaultRules MN = MNRules.defaultRules
 defaultRules MY = MYRules.defaultRules
 defaultRules NB = NBRules.defaultRules
 defaultRules NE = NERules.defaultRules
@@ -107,16 +132,23 @@
 defaultRules PT = PTRules.defaultRules
 defaultRules RO = RORules.defaultRules
 defaultRules RU = RURules.defaultRules
+defaultRules SK = SKRules.defaultRules
 defaultRules SV = SVRules.defaultRules
+defaultRules SW = SWRules.defaultRules
 defaultRules TA = TARules.defaultRules
+defaultRules TE = TERules.defaultRules
+defaultRules TH = THRules.defaultRules
 defaultRules TR = TRRules.defaultRules
 defaultRules UK = UKRules.defaultRules
 defaultRules VI = VIRules.defaultRules
 defaultRules ZH = ZHRules.defaultRules
 
-localeRules :: Lang -> Region -> Some Dimension -> [Rule]
+localeRules :: Lang -> Region -> Seal Dimension -> [Rule]
+localeRules AF = AFRules.localeRules
 localeRules AR = ARRules.localeRules
 localeRules BG = BGRules.localeRules
+localeRules BN = BNRules.localeRules
+localeRules CA = CARules.localeRules
 localeRules CS = CSRules.localeRules
 localeRules DA = DARules.localeRules
 localeRules DE = DERules.localeRules
@@ -124,6 +156,8 @@
 localeRules EN = ENRules.localeRules
 localeRules ES = ESRules.localeRules
 localeRules ET = ETRules.localeRules
+localeRules FI = FIRules.localeRules
+localeRules FA = FARules.localeRules
 localeRules FR = FRRules.localeRules
 localeRules GA = GARules.localeRules
 localeRules HE = HERules.localeRules
@@ -131,10 +165,16 @@
 localeRules HR = HRRules.localeRules
 localeRules HU = HURules.localeRules
 localeRules ID = IDRules.localeRules
+localeRules IS = ISRules.localeRules
 localeRules IT = ITRules.localeRules
 localeRules JA = JARules.localeRules
 localeRules KA = KARules.localeRules
+localeRules KM = KMRules.localeRules
+localeRules KN = KNRules.localeRules
 localeRules KO = KORules.localeRules
+localeRules LO = LORules.localeRules
+localeRules ML = MLRules.localeRules
+localeRules MN = MNRules.localeRules
 localeRules MY = MYRules.localeRules
 localeRules NB = NBRules.localeRules
 localeRules NE = NERules.localeRules
@@ -143,16 +183,23 @@
 localeRules PT = PTRules.localeRules
 localeRules RO = RORules.localeRules
 localeRules RU = RURules.localeRules
+localeRules SK = SKRules.localeRules
 localeRules SV = SVRules.localeRules
+localeRules SW = SWRules.localeRules
 localeRules TA = TARules.localeRules
+localeRules TE = TERules.localeRules
+localeRules TH = THRules.localeRules
 localeRules TR = TRRules.localeRules
 localeRules UK = UKRules.localeRules
 localeRules VI = VIRules.localeRules
 localeRules ZH = ZHRules.localeRules
 
-langRules :: Lang -> Some Dimension -> [Rule]
+langRules :: Lang -> Seal Dimension -> [Rule]
+langRules AF = AFRules.langRules
 langRules AR = ARRules.langRules
 langRules BG = BGRules.langRules
+langRules BN = BNRules.langRules
+langRules CA = CARules.langRules
 langRules CS = CSRules.langRules
 langRules DA = DARules.langRules
 langRules DE = DERules.langRules
@@ -160,17 +207,25 @@
 langRules EN = ENRules.langRules
 langRules ES = ESRules.langRules
 langRules ET = ETRules.langRules
+langRules FI = FIRules.langRules
+langRules FA = FARules.langRules
 langRules FR = FRRules.langRules
 langRules GA = GARules.langRules
 langRules HE = HERules.langRules
 langRules HI = HIRules.langRules
+langRules KN = KNRules.langRules
 langRules HR = HRRules.langRules
 langRules HU = HURules.langRules
 langRules ID = IDRules.langRules
+langRules IS = ISRules.langRules
 langRules IT = ITRules.langRules
 langRules JA = JARules.langRules
 langRules KA = KARules.langRules
+langRules KM = KMRules.langRules
 langRules KO = KORules.langRules
+langRules LO = LORules.langRules
+langRules ML = MLRules.langRules
+langRules MN = MNRules.langRules
 langRules MY = MYRules.langRules
 langRules NB = NBRules.langRules
 langRules NE = NERules.langRules
@@ -179,8 +234,12 @@
 langRules PT = PTRules.langRules
 langRules RO = RORules.langRules
 langRules RU = RURules.langRules
+langRules SK = SKRules.langRules
 langRules SV = SVRules.langRules
+langRules SW = SWRules.langRules
 langRules TA = TARules.langRules
+langRules TE = TERules.langRules
+langRules TH = THRules.langRules
 langRules TR = TRRules.langRules
 langRules UK = UKRules.langRules
 langRules VI = VIRules.langRules
diff --git a/Duckling/Rules/AF.hs b/Duckling/Rules/AF.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/AF.hs
@@ -0,0 +1,45 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.AF
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.AF.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules AF dim
diff --git a/Duckling/Rules/AR.hs b/Duckling/Rules/AR.hs
--- a/Duckling/Rules/AR.hs
+++ b/Duckling/Rules/AR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -21,33 +20,37 @@
 import qualified Duckling.AmountOfMoney.AR.Rules as AmountOfMoney
 import qualified Duckling.Duration.AR.Rules as Duration
 import qualified Duckling.Numeral.AR.Rules as Numeral
+import qualified Duckling.Numeral.AR.EG.Rules as NumeralEG
 import qualified Duckling.Ordinal.AR.Rules as Ordinal
+import qualified Duckling.PhoneNumber.AR.Rules as PhoneNumber
 import qualified Duckling.Quantity.AR.Rules as Quantity
 import qualified Duckling.Temperature.AR.Rules as Temperature
 import qualified Duckling.Time.AR.Rules as Time
 import qualified Duckling.TimeGrain.AR.Rules as TimeGrain
 import qualified Duckling.Volume.AR.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules EG (Seal Numeral) = NumeralEG.rules
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = 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
-langRules (This (CustomDimension dim)) = dimLangRules AR dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = PhoneNumber.rules
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules AR dim
diff --git a/Duckling/Rules/BG.hs b/Duckling/Rules/BG.hs
--- a/Duckling/Rules/BG.hs
+++ b/Duckling/Rules/BG.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -22,29 +21,31 @@
 import qualified Duckling.AmountOfMoney.BG.Rules as AmountOfMoney
 import qualified Duckling.Distance.BG.Rules as Distance
 import qualified Duckling.Duration.BG.Rules as Duration
+import qualified Duckling.Time.BG.Rules as Time
 import qualified Duckling.TimeGrain.BG.Rules as TimeGrain
 import qualified Duckling.Ordinal.BG.Rules as Ordinal
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This Time) = []
-langRules (This TimeGrain) = TimeGrain.rules
-langRules (This Url) = []
-langRules (This Volume) = []
-langRules (This (CustomDimension dim)) = dimLangRules BG dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules BG dim
diff --git a/Duckling/Rules/BN.hs b/Duckling/Rules/BN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/BN.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.
+
+
+{-# LANGUAGE GADTs #-}
+
+module Duckling.Rules.BN
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.BN.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Email) = []
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules BN dim
diff --git a/Duckling/Rules/CA.hs b/Duckling/Rules/CA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/CA.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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.CA
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import qualified Duckling.Numeral.CA.Rules as Numeral
+import qualified Duckling.Ordinal.CA.Rules as Ordinal
+import Duckling.Types
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension _)) = []
diff --git a/Duckling/Rules/CS.hs b/Duckling/Rules/CS.hs
--- a/Duckling/Rules/CS.hs
+++ b/Duckling/Rules/CS.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -21,26 +20,27 @@
 import qualified Duckling.Distance.CS.Rules as Distance
 import qualified Duckling.Numeral.CS.Rules as Numeral
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules CS dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules CS dim
diff --git a/Duckling/Rules/Common.hs b/Duckling/Rules/Common.hs
--- a/Duckling/Rules/Common.hs
+++ b/Duckling/Rules/Common.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -16,6 +15,7 @@
 import Duckling.Dimensions.Types
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Rules as AmountOfMoney
+import qualified Duckling.CreditCardNumber.Rules as CreditCardNumber
 import qualified Duckling.Distance.Rules as Distance
 import qualified Duckling.Duration.Rules as Duration
 import qualified Duckling.Email.Rules as Email
@@ -25,19 +25,20 @@
 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 Email) = Email.rules
-rules (This Numeral) = Numeral.rules
-rules (This Ordinal) = []
-rules (This PhoneNumber) = PhoneNumber.rules
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = Url.rules
-rules (This Volume) = Volume.rules
-rules (This (CustomDimension dim)) = dimRules dim
+rules :: Seal Dimension -> [Rule]
+rules (Seal AmountOfMoney) = AmountOfMoney.rules
+rules (Seal CreditCardNumber) = CreditCardNumber.rules
+rules (Seal Distance) = Distance.rules
+rules (Seal Duration) = Duration.rules
+rules (Seal Email) = Email.rules
+rules (Seal Numeral) = Numeral.rules
+rules (Seal Ordinal) = []
+rules (Seal PhoneNumber) = PhoneNumber.rules
+rules (Seal Quantity) = []
+rules (Seal RegexMatch) = []
+rules (Seal Temperature) = Temperature.rules
+rules (Seal Time) = []
+rules (Seal TimeGrain) = []
+rules (Seal Url) = Url.rules
+rules (Seal Volume) = Volume.rules
+rules (Seal (CustomDimension dim)) = dimRules dim
diff --git a/Duckling/Rules/DA.hs b/Duckling/Rules/DA.hs
--- a/Duckling/Rules/DA.hs
+++ b/Duckling/Rules/DA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,26 +23,27 @@
 import qualified Duckling.Time.DA.Rules as Time
 import qualified Duckling.TimeGrain.DA.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules DA dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules DA dim
diff --git a/Duckling/Rules/DE.hs b/Duckling/Rules/DE.hs
--- a/Duckling/Rules/DE.hs
+++ b/Duckling/Rules/DE.hs
@@ -2,13 +2,10 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
-
-
 module Duckling.Rules.DE
   ( defaultRules
   , langRules
@@ -16,34 +13,38 @@
   ) where
 
 import Duckling.Dimensions.Types
-import Duckling.Locale
-import Duckling.Types
+import qualified Duckling.Distance.DE.Rules as Distance
 import qualified Duckling.Duration.DE.Rules as Duration
-import qualified Duckling.Ordinal.DE.Rules as Ordinal
+import qualified Duckling.Email.DE.Rules as Email
+import Duckling.Locale
 import qualified Duckling.Numeral.DE.Rules as Numeral
+import qualified Duckling.Ordinal.DE.Rules as Ordinal
 import qualified Duckling.Time.DE.Rules as Time
 import qualified Duckling.TimeGrain.DE.Rules as TimeGrain
+import Duckling.Types
+import qualified Duckling.Volume.DE.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules DE dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = Email.rules
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules DE dim
diff --git a/Duckling/Rules/EL.hs b/Duckling/Rules/EL.hs
--- a/Duckling/Rules/EL.hs
+++ b/Duckling/Rules/EL.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,26 +23,27 @@
 import qualified Duckling.Time.EL.Rules as Time
 import qualified Duckling.TimeGrain.EL.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules EL dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules EL dim
diff --git a/Duckling/Rules/EN.hs b/Duckling/Rules/EN.hs
--- a/Duckling/Rules/EN.hs
+++ b/Duckling/Rules/EN.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -39,6 +38,7 @@
 import qualified Duckling.Numeral.EN.Rules as Numeral
 import qualified Duckling.Ordinal.EN.Rules as Ordinal
 import qualified Duckling.Quantity.EN.Rules as Quantity
+import qualified Duckling.Region as R
 import qualified Duckling.Temperature.EN.Rules as Temperature
 import qualified Duckling.Time.EN.Rules as Time
 import qualified Duckling.Time.EN.AU.Rules as TimeAU
@@ -56,51 +56,52 @@
 import qualified Duckling.TimeGrain.EN.Rules as TimeGrain
 import qualified Duckling.Volume.EN.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
-defaultRules dim@(This Time) = TimeUS.rulesBackwardCompatible ++ langRules dim
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules dim@(Seal Time) = TimeUS.rulesBackwardCompatible ++ langRules dim
 defaultRules dim             = langRules dim
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules AU (This AmountOfMoney) = AmountOfMoneyAU.rules
-localeRules BZ (This AmountOfMoney) = AmountOfMoneyBZ.rules
-localeRules CA (This AmountOfMoney) = AmountOfMoneyCA.rules
-localeRules GB (This AmountOfMoney) = AmountOfMoneyGB.rules
-localeRules IE (This AmountOfMoney) = AmountOfMoneyIE.rules
-localeRules IN (This AmountOfMoney) = AmountOfMoneyIN.rules
-localeRules JM (This AmountOfMoney) = AmountOfMoneyJM.rules
-localeRules NZ (This AmountOfMoney) = AmountOfMoneyNZ.rules
-localeRules PH (This AmountOfMoney) = AmountOfMoneyPH.rules
-localeRules TT (This AmountOfMoney) = AmountOfMoneyTT.rules
-localeRules US (This AmountOfMoney) = AmountOfMoneyUS.rules
-localeRules ZA (This AmountOfMoney) = AmountOfMoneyZA.rules
-localeRules AU (This Time) = TimeAU.rules
-localeRules BZ (This Time) = TimeBZ.rules
-localeRules CA (This Time) = TimeCA.rules
-localeRules GB (This Time) = TimeGB.rules
-localeRules IE (This Time) = TimeIE.rules
-localeRules IN (This Time) = TimeIN.rules
-localeRules JM (This Time) = TimeJM.rules
-localeRules NZ (This Time) = TimeNZ.rules
-localeRules PH (This Time) = TimePH.rules
-localeRules TT (This Time) = TimeTT.rules
-localeRules US (This Time) = TimeUS.rules
-localeRules ZA (This Time) = TimeZA.rules
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules AU (Seal AmountOfMoney) = AmountOfMoneyAU.rules
+localeRules BZ (Seal AmountOfMoney) = AmountOfMoneyBZ.rules
+localeRules R.CA (Seal AmountOfMoney) = AmountOfMoneyCA.rules
+localeRules GB (Seal AmountOfMoney) = AmountOfMoneyGB.rules
+localeRules IE (Seal AmountOfMoney) = AmountOfMoneyIE.rules
+localeRules IN (Seal AmountOfMoney) = AmountOfMoneyIN.rules
+localeRules JM (Seal AmountOfMoney) = AmountOfMoneyJM.rules
+localeRules NZ (Seal AmountOfMoney) = AmountOfMoneyNZ.rules
+localeRules PH (Seal AmountOfMoney) = AmountOfMoneyPH.rules
+localeRules TT (Seal AmountOfMoney) = AmountOfMoneyTT.rules
+localeRules US (Seal AmountOfMoney) = AmountOfMoneyUS.rules
+localeRules ZA (Seal AmountOfMoney) = AmountOfMoneyZA.rules
+localeRules AU (Seal Time) = TimeAU.rules
+localeRules BZ (Seal Time) = TimeBZ.rules
+localeRules R.CA (Seal Time) = TimeCA.rules
+localeRules GB (Seal Time) = TimeGB.rules
+localeRules IE (Seal Time) = TimeIE.rules
+localeRules IN (Seal Time) = TimeIN.rules
+localeRules JM (Seal Time) = TimeJM.rules
+localeRules NZ (Seal Time) = TimeNZ.rules
+localeRules PH (Seal Time) = TimePH.rules
+localeRules TT (Seal Time) = TimeTT.rules
+localeRules US (Seal Time) = TimeUS.rules
+localeRules ZA (Seal Time) = TimeZA.rules
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules EN dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = Email.rules
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules EN dim
diff --git a/Duckling/Rules/ES.hs b/Duckling/Rules/ES.hs
--- a/Duckling/Rules/ES.hs
+++ b/Duckling/Rules/ES.hs
@@ -2,51 +2,75 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
-
-
 module Duckling.Rules.ES
   ( defaultRules
   , langRules
   , localeRules
   ) where
 
-import Duckling.Dimensions.Types
-import Duckling.Locale
-import Duckling.Types
+import Prelude
+
 import qualified Duckling.AmountOfMoney.ES.Rules as AmountOfMoney
+import Duckling.Dimensions.Types
 import qualified Duckling.Distance.ES.Rules as Distance
+import Duckling.Locale
+import qualified Duckling.Numeral.ES.AR.Rules as NumeralAR
+import qualified Duckling.Numeral.ES.CL.Rules as NumeralCL
+import qualified Duckling.Numeral.ES.CO.Rules as NumeralCO
+import qualified Duckling.Numeral.ES.ES.Rules as NumeralES
+import qualified Duckling.Numeral.ES.MX.Rules as NumeralMX
+import qualified Duckling.Numeral.ES.PE.Rules as NumeralPE
 import qualified Duckling.Numeral.ES.Rules as Numeral
+import qualified Duckling.Numeral.ES.VE.Rules as NumeralVE
 import qualified Duckling.Ordinal.ES.Rules as Ordinal
+import qualified Duckling.Region as R
+  ( Region
+      ( AR
+      , ES
+      )
+  )
 import qualified Duckling.Temperature.ES.Rules as Temperature
 import qualified Duckling.Time.ES.Rules as Time
 import qualified Duckling.TimeGrain.ES.Rules as TimeGrain
+import Duckling.Types
 import qualified Duckling.Volume.ES.Rules as Volume
+import qualified Duckling.Duration.ES.Rules as Duration
+import qualified Duckling.Quantity.ES.Rules as Quantity
 
-defaultRules :: Some Dimension -> [Rule]
-defaultRules = langRules
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules dim@(Seal Numeral) =
+  NumeralES.rulesBackwardCompatible ++ langRules dim
+defaultRules dim = langRules dim
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules R.AR (Seal Numeral) = NumeralAR.rules
+localeRules CL (Seal Numeral) = NumeralCL.rules
+localeRules CO (Seal Numeral) = NumeralCO.rules
+localeRules R.ES (Seal Numeral) = NumeralES.rules
+localeRules MX (Seal Numeral) = NumeralMX.rules
+localeRules PE (Seal Numeral) = NumeralPE.rules
+localeRules VE (Seal Numeral) = NumeralVE.rules
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules ES dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules ES dim
diff --git a/Duckling/Rules/ET.hs b/Duckling/Rules/ET.hs
--- a/Duckling/Rules/ET.hs
+++ b/Duckling/Rules/ET.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -21,26 +20,27 @@
 import qualified Duckling.Numeral.ET.Rules as Numeral
 import qualified Duckling.Ordinal.ET.Rules as Ordinal
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules ET dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules ET dim
diff --git a/Duckling/Rules/FA.hs b/Duckling/Rules/FA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/FA.hs
@@ -0,0 +1,45 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.FA
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.FA.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules FA dim
diff --git a/Duckling/Rules/FI.hs b/Duckling/Rules/FI.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/FI.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.
+
+{-# LANGUAGE GADTs #-}
+
+module Duckling.Rules.FI
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.FI.Rules as Numeral
+import qualified Duckling.TimeGrain.FI.Rules as TimeGrain
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules FI dim
diff --git a/Duckling/Rules/FR.hs b/Duckling/Rules/FR.hs
--- a/Duckling/Rules/FR.hs
+++ b/Duckling/Rules/FR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -30,26 +29,27 @@
 import qualified Duckling.TimeGrain.FR.Rules as TimeGrain
 import qualified Duckling.Volume.FR.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules FR dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = Email.rules
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules FR dim
diff --git a/Duckling/Rules/GA.hs b/Duckling/Rules/GA.hs
--- a/Duckling/Rules/GA.hs
+++ b/Duckling/Rules/GA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -28,26 +27,27 @@
 import qualified Duckling.TimeGrain.GA.Rules as TimeGrain
 import qualified Duckling.Volume.GA.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules GA dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules GA dim
diff --git a/Duckling/Rules/HE.hs b/Duckling/Rules/HE.hs
--- a/Duckling/Rules/HE.hs
+++ b/Duckling/Rules/HE.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,32 +17,34 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.AmountOfMoney.HE.Rules as AmountOfMoney
 import qualified Duckling.Duration.HE.Rules as Duration
 import qualified Duckling.Numeral.HE.Rules as Numeral
 import qualified Duckling.Ordinal.HE.Rules as Ordinal
 import qualified Duckling.TimeGrain.HE.Rules as TimeGrain
 import qualified Duckling.Time.HE.Rules as Time
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules HE dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules HE dim
diff --git a/Duckling/Rules/HI.hs b/Duckling/Rules/HI.hs
--- a/Duckling/Rules/HI.hs
+++ b/Duckling/Rules/HI.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -21,27 +20,29 @@
 import qualified Duckling.Ordinal.HI.Rules as Ordinal
 import qualified Duckling.Duration.HI.Rules as Duration
 import qualified Duckling.TimeGrain.HI.Rules as TimeGrain
+import qualified Duckling.Temperature.HI.Rules as Temperature
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
-langRules :: Some Dimension -> [Rule]
-langRules (This AmountOfMoney) = []
-langRules (This Distance) = []
-langRules (This Duration) = Duration.rules
-langRules (This Numeral) = Numeral.rules
-langRules (This Email) = []
-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) = []
-langRules (This (CustomDimension dim)) = dimLangRules HI dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Email) = []
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules HI dim
diff --git a/Duckling/Rules/HR.hs b/Duckling/Rules/HR.hs
--- a/Duckling/Rules/HR.hs
+++ b/Duckling/Rules/HR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -30,26 +29,27 @@
 import qualified Duckling.Volume.HR.Rules as Volume
 
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules HR dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules HR dim
diff --git a/Duckling/Rules/HU.hs b/Duckling/Rules/HU.hs
--- a/Duckling/Rules/HU.hs
+++ b/Duckling/Rules/HU.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,26 +23,27 @@
 import qualified Duckling.Time.HU.Rules as Time
 import qualified Duckling.TimeGrain.HU.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules HU dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules HU dim
diff --git a/Duckling/Rules/ID.hs b/Duckling/Rules/ID.hs
--- a/Duckling/Rules/ID.hs
+++ b/Duckling/Rules/ID.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -22,26 +21,27 @@
 import qualified Duckling.Numeral.ID.Rules as Numeral
 import qualified Duckling.Ordinal.ID.Rules as Ordinal
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules ID dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules ID dim
diff --git a/Duckling/Rules/IS.hs b/Duckling/Rules/IS.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/IS.hs
@@ -0,0 +1,45 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+module Duckling.Rules.IS
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Email.IS.Rules as Email
+import qualified Duckling.Numeral.IS.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Email) = Email.rules
+langRules (Seal AmountOfMoney) = []
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules IS dim
diff --git a/Duckling/Rules/IT.hs b/Duckling/Rules/IT.hs
--- a/Duckling/Rules/IT.hs
+++ b/Duckling/Rules/IT.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,6 +17,8 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.AmountOfMoney.IT.Rules as AmountOfMoney
+import qualified Duckling.Distance.IT.Rules as Distance
 import qualified Duckling.Duration.IT.Rules as Duration
 import qualified Duckling.Email.IT.Rules as Email
 import qualified Duckling.Numeral.IT.Rules as Numeral
@@ -27,26 +28,27 @@
 import qualified Duckling.TimeGrain.IT.Rules as TimeGrain
 import qualified Duckling.Volume.IT.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules IT dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = Email.rules
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules IT dim
diff --git a/Duckling/Rules/JA.hs b/Duckling/Rules/JA.hs
--- a/Duckling/Rules/JA.hs
+++ b/Duckling/Rules/JA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -23,26 +22,27 @@
 import qualified Duckling.Temperature.JA.Rules as Temperature
 import qualified Duckling.TimeGrain.JA.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules JA dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules JA dim
diff --git a/Duckling/Rules/KA.hs b/Duckling/Rules/KA.hs
--- a/Duckling/Rules/KA.hs
+++ b/Duckling/Rules/KA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,28 +17,34 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.AmountOfMoney.KA.Rules as AmountOfMoney
 import qualified Duckling.Numeral.KA.Rules as Numeral
+import qualified Duckling.Time.KA.Rules as Time
+import qualified Duckling.TimeGrain.KA.Rules as TimeGrain
+import qualified Duckling.Ordinal.KA.Rules as Ordinal
+import qualified Duckling.Duration.KA.Rules as Duration
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules KA dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules KA dim
diff --git a/Duckling/Rules/KM.hs b/Duckling/Rules/KM.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/KM.hs
@@ -0,0 +1,50 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.KM
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Distance.KM.Rules as Distance
+import qualified Duckling.Numeral.KM.Rules as Numeral
+import qualified Duckling.Ordinal.KM.Rules as Ordinal
+import qualified Duckling.Quantity.KM.Rules as Quantity
+import qualified Duckling.Temperature.KM.Rules as Temperature
+import qualified Duckling.Volume.KM.Rules as Volume
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules KM dim
diff --git a/Duckling/Rules/KN.hs b/Duckling/Rules/KN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/KN.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.
+
+
+{-# LANGUAGE GADTs #-}
+
+module Duckling.Rules.KN
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.KN.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Email) = []
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules KN dim
diff --git a/Duckling/Rules/KO.hs b/Duckling/Rules/KO.hs
--- a/Duckling/Rules/KO.hs
+++ b/Duckling/Rules/KO.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -29,26 +28,27 @@
 import qualified Duckling.TimeGrain.KO.Rules as TimeGrain
 import qualified Duckling.Volume.KO.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules KO dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules KO dim
diff --git a/Duckling/Rules/LO.hs b/Duckling/Rules/LO.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/LO.hs
@@ -0,0 +1,45 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.LO
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.LO.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules LO dim
diff --git a/Duckling/Rules/ML.hs b/Duckling/Rules/ML.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/ML.hs
@@ -0,0 +1,46 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.ML
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.ML.Rules as Numeral
+import qualified Duckling.Ordinal.ML.Rules as Ordinal
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules ML dim
diff --git a/Duckling/Rules/MN.hs b/Duckling/Rules/MN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/MN.hs
@@ -0,0 +1,53 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.MN
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.MN.Rules as AmountOfMoney
+import qualified Duckling.Distance.MN.Rules as Distance
+import qualified Duckling.Duration.MN.Rules as Duration
+import qualified Duckling.Numeral.MN.Rules as Numeral
+import qualified Duckling.Ordinal.MN.Rules as Ordinal
+import qualified Duckling.Quantity.MN.Rules as Quantity
+import qualified Duckling.TimeGrain.MN.Rules as TimeGrain
+import qualified Duckling.Volume.MN.Rules as Volume
+import qualified Duckling.Temperature.MN.Rules as Temperature
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules MN dim
diff --git a/Duckling/Rules/MY.hs b/Duckling/Rules/MY.hs
--- a/Duckling/Rules/MY.hs
+++ b/Duckling/Rules/MY.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -20,26 +19,27 @@
 import Duckling.Types
 import qualified Duckling.Numeral.MY.Rules as Numeral
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules MY dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules MY dim
diff --git a/Duckling/Rules/NB.hs b/Duckling/Rules/NB.hs
--- a/Duckling/Rules/NB.hs
+++ b/Duckling/Rules/NB.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -25,26 +24,27 @@
 import qualified Duckling.Time.NB.Rules as Time
 import qualified Duckling.TimeGrain.NB.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules NB dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules NB dim
diff --git a/Duckling/Rules/NE.hs b/Duckling/Rules/NE.hs
--- a/Duckling/Rules/NE.hs
+++ b/Duckling/Rules/NE.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -19,26 +18,27 @@
 import Duckling.Types
 import qualified Duckling.Numeral.NE.Rules as Numeral
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
-langRules :: Some Dimension -> [Rule]
-langRules (This AmountOfMoney) = []
-langRules (This Distance) = []
-langRules (This Duration) = []
-langRules (This Numeral) = Numeral.rules
-langRules (This Email) = []
-langRules (This Ordinal) = []
-langRules (This PhoneNumber) = []
-langRules (This Quantity) = []
-langRules (This RegexMatch) = []
-langRules (This Temperature) = []
-langRules (This Time) = []
-langRules (This TimeGrain) = []
-langRules (This Url) = []
-langRules (This Volume) = []
-langRules (This (CustomDimension dim)) = dimLangRules NE dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Email) = []
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules NE dim
diff --git a/Duckling/Rules/NL.hs b/Duckling/Rules/NL.hs
--- a/Duckling/Rules/NL.hs
+++ b/Duckling/Rules/NL.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,34 +23,36 @@
 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.Quantity.NL.Rules as Quantity
 import qualified Duckling.Time.NL.Rules as Time
 import qualified Duckling.Time.NL.BE.Rules as TimeBE
 import qualified Duckling.Time.NL.NL.Rules as TimeNL
 import qualified Duckling.TimeGrain.NL.Rules as TimeGrain
 import qualified Duckling.Volume.NL.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
-defaultRules dim@(This Time) = TimeNL.rulesBackwardCompatible ++ langRules dim
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules dim@(Seal Time) = TimeNL.rulesBackwardCompatible ++ langRules dim
 defaultRules dim = langRules dim
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
-localeRules BE (This Time) = TimeBE.rules
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules BE (Seal Time) = TimeBE.rules
 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) = []
-langRules (This Time) = Time.rules
-langRules (This TimeGrain) = TimeGrain.rules
-langRules (This Url) = []
-langRules (This Volume) = Volume.rules
-langRules (This (CustomDimension dim)) = dimLangRules NL dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules NL dim
diff --git a/Duckling/Rules/PL.hs b/Duckling/Rules/PL.hs
--- a/Duckling/Rules/PL.hs
+++ b/Duckling/Rules/PL.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,26 +23,27 @@
 import qualified Duckling.Time.PL.Rules as Time
 import qualified Duckling.TimeGrain.PL.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules PL dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules PL dim
diff --git a/Duckling/Rules/PT.hs b/Duckling/Rules/PT.hs
--- a/Duckling/Rules/PT.hs
+++ b/Duckling/Rules/PT.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -29,26 +28,27 @@
 import qualified Duckling.TimeGrain.PT.Rules as TimeGrain
 import qualified Duckling.Volume.PT.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules PT dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = PhoneNumber.rules
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules PT dim
diff --git a/Duckling/Rules/RO.hs b/Duckling/Rules/RO.hs
--- a/Duckling/Rules/RO.hs
+++ b/Duckling/Rules/RO.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -29,26 +28,27 @@
 import qualified Duckling.TimeGrain.RO.Rules as TimeGrain
 import qualified Duckling.Volume.RO.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules RO dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules RO dim
diff --git a/Duckling/Rules/RU.hs b/Duckling/Rules/RU.hs
--- a/Duckling/Rules/RU.hs
+++ b/Duckling/Rules/RU.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,29 +23,31 @@
 import qualified Duckling.Numeral.RU.Rules as Numeral
 import qualified Duckling.Ordinal.RU.Rules as Ordinal
 import qualified Duckling.Quantity.RU.Rules as Quantity
+import qualified Duckling.Time.RU.Rules as Time
 import qualified Duckling.TimeGrain.RU.Rules as TimeGrain
 import qualified Duckling.Volume.RU.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This Time) = []
-langRules (This TimeGrain) = TimeGrain.rules
-langRules (This Url) = []
-langRules (This Volume) = Volume.rules
-langRules (This (CustomDimension dim)) = dimLangRules RU dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules RU dim
diff --git a/Duckling/Rules/SK.hs b/Duckling/Rules/SK.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/SK.hs
@@ -0,0 +1,46 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.SK
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.SK.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules SK dim
diff --git a/Duckling/Rules/SV.hs b/Duckling/Rules/SV.hs
--- a/Duckling/Rules/SV.hs
+++ b/Duckling/Rules/SV.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -26,26 +25,27 @@
 import qualified Duckling.Time.SV.Rules as Time
 import qualified Duckling.TimeGrain.SV.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This Time) = Time.rules
-langRules (This TimeGrain) = TimeGrain.rules
-langRules (This Url) = []
-langRules (This Volume) = []
-langRules (This (CustomDimension dim)) = dimLangRules SV dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules SV dim
diff --git a/Duckling/Rules/SW.hs b/Duckling/Rules/SW.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/SW.hs
@@ -0,0 +1,45 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.SW
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.SW.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules SW dim
diff --git a/Duckling/Rules/TA.hs b/Duckling/Rules/TA.hs
--- a/Duckling/Rules/TA.hs
+++ b/Duckling/Rules/TA.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,27 +17,29 @@
 import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.Numeral.TA.Rules as Numeral
+import qualified Duckling.Ordinal.TA.Rules as Ordinal
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
-langRules :: Some Dimension -> [Rule]
-langRules (This AmountOfMoney) = []
-langRules (This Distance) = []
-langRules (This Duration) = []
-langRules (This Numeral) = Numeral.rules
-langRules (This Email) = []
-langRules (This Ordinal) = []
-langRules (This PhoneNumber) = []
-langRules (This Quantity) = []
-langRules (This RegexMatch) = []
-langRules (This Temperature) = []
-langRules (This Time) = []
-langRules (This TimeGrain) = []
-langRules (This Url) = []
-langRules (This Volume) = []
-langRules (This (CustomDimension dim)) = dimLangRules TA dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Email) = []
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules TA dim
diff --git a/Duckling/Rules/TE.hs b/Duckling/Rules/TE.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/TE.hs
@@ -0,0 +1,45 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+
+module Duckling.Rules.TE
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.TE.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules TE dim
diff --git a/Duckling/Rules/TH.hs b/Duckling/Rules/TH.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/TH.hs
@@ -0,0 +1,45 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+
+
+module Duckling.Rules.TH
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.TH.Rules as Numeral
+
+defaultRules :: Seal Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
+
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = []
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = []
+langRules (Seal TimeGrain) = []
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules TH dim
diff --git a/Duckling/Rules/TR.hs b/Duckling/Rules/TR.hs
--- a/Duckling/Rules/TR.hs
+++ b/Duckling/Rules/TR.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -23,29 +22,32 @@
 import qualified Duckling.Numeral.TR.Rules as Numeral
 import qualified Duckling.Ordinal.TR.Rules as Ordinal
 import qualified Duckling.Temperature.TR.Rules as Temperature
+import qualified Duckling.Time.TR.Rules as Time
 import qualified Duckling.TimeGrain.TR.Rules as TimeGrain
 import qualified Duckling.Volume.TR.Rules as Volume
+import qualified Duckling.AmountOfMoney.TR.Rules as AmountOfMoney
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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
-langRules (This (CustomDimension dim)) = dimLangRules TR dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules TR dim
diff --git a/Duckling/Rules/UK.hs b/Duckling/Rules/UK.hs
--- a/Duckling/Rules/UK.hs
+++ b/Duckling/Rules/UK.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,29 +17,33 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.Duration.UK.Rules as Duration
 import qualified Duckling.Numeral.UK.Rules as Numeral
 import qualified Duckling.Ordinal.UK.Rules as Ordinal
+import qualified Duckling.Time.UK.Rules as Time
+import qualified Duckling.TimeGrain.UK.Rules as TimeGrain
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules UK dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = []
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules UK dim
diff --git a/Duckling/Rules/VI.hs b/Duckling/Rules/VI.hs
--- a/Duckling/Rules/VI.hs
+++ b/Duckling/Rules/VI.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,26 +23,27 @@
 import qualified Duckling.TimeGrain.VI.Rules as TimeGrain
 import qualified Duckling.Time.VI.Rules as Time
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal Dimension -> [Rule]
 defaultRules = langRules
 
-localeRules :: Region -> Some Dimension -> [Rule]
-localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules VI dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = []
+langRules (Seal Duration) = []
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = []
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = []
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = []
+langRules (Seal (CustomDimension dim)) = dimLangRules VI dim
diff --git a/Duckling/Rules/ZH.hs b/Duckling/Rules/ZH.hs
--- a/Duckling/Rules/ZH.hs
+++ b/Duckling/Rules/ZH.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -20,6 +19,7 @@
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.ZH.Rules as AmountOfMoney
 import qualified Duckling.Distance.ZH.Rules as Distance
+import qualified Duckling.Duration.ZH.Rules as Duration
 import qualified Duckling.Numeral.ZH.Rules as Numeral
 import qualified Duckling.Ordinal.ZH.Rules as Ordinal
 import qualified Duckling.Quantity.ZH.Rules as Quantity
@@ -30,31 +30,33 @@
 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 qualified Duckling.Volume.ZH.Rules as Volume
 
-defaultRules :: Some Dimension -> [Rule]
+defaultRules :: Seal 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 region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules :: Region -> Seal Dimension -> [Rule]
+localeRules CN (Seal Time) = TimeCN.rules
+localeRules HK (Seal Time) = TimeHK.rules
+localeRules MO (Seal Time) = TimeMO.rules
+localeRules TW (Seal Time) = TimeTW.rules
+localeRules region (Seal (CustomDimension dim)) = dimLocaleRules region dim
 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) = 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) = []
-langRules (This (CustomDimension dim)) = dimLangRules ZH dim
+langRules :: Seal Dimension -> [Rule]
+langRules (Seal AmountOfMoney) = AmountOfMoney.rules
+langRules (Seal CreditCardNumber) = []
+langRules (Seal Distance) = Distance.rules
+langRules (Seal Duration) = Duration.rules
+langRules (Seal Email) = []
+langRules (Seal Numeral) = Numeral.rules
+langRules (Seal Ordinal) = Ordinal.rules
+langRules (Seal PhoneNumber) = []
+langRules (Seal Quantity) = Quantity.rules
+langRules (Seal RegexMatch) = []
+langRules (Seal Temperature) = Temperature.rules
+langRules (Seal Time) = Time.rules
+langRules (Seal TimeGrain) = TimeGrain.rules
+langRules (Seal Url) = []
+langRules (Seal Volume) = Volume.rules
+langRules (Seal (CustomDimension dim)) = dimLangRules ZH dim
diff --git a/Duckling/Temperature/AR/Corpus.hs b/Duckling/Temperature/AR/Corpus.hs
--- a/Duckling/Temperature/AR/Corpus.hs
+++ b/Duckling/Temperature/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Temperature/AR/Rules.hs b/Duckling/Temperature/AR/Rules.hs
--- a/Duckling/Temperature/AR/Rules.hs
+++ b/Duckling/Temperature/AR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Temperature/EN/Corpus.hs b/Duckling/Temperature/EN/Corpus.hs
--- a/Duckling/Temperature/EN/Corpus.hs
+++ b/Duckling/Temperature/EN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -36,6 +35,11 @@
              , "70 ° Fahrenheit"
              , "70 degrees F"
              , "seventy Fahrenheit"
+             ]
+  , examples (simple Fahrenheit 98.6)
+             [ "98.6°F"
+             , "98.6 ° Fahrenheit"
+             , "98.6 degrees F"
              ]
   , examples (simple Degree 45)
              [ "45°"
diff --git a/Duckling/Temperature/EN/Rules.hs b/Duckling/Temperature/EN/Rules.hs
--- a/Duckling/Temperature/EN/Rules.hs
+++ b/Duckling/Temperature/EN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Temperature/HI/Corpus.hs b/Duckling/Temperature/HI/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Temperature/HI/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Temperature.HI.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Temperature.Types
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext {locale = makeLocale HI Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Celsius 37)
+             [ "37 डिग्री सेल्सीयस"
+             , "37 ° सेल्सीयस"
+             ]
+  , examples (simple Fahrenheit 71)
+             [ "71 डिग्री फारेनहाइट"
+             , "71 ° फारेनहाइट"
+             ]
+  , examples (simple Degree 45)
+             [ "45 डिग्री"
+             , "45 °"
+             ]
+  ]
diff --git a/Duckling/Temperature/HI/Rules.hs b/Duckling/Temperature/HI/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Temperature/HI/Rules.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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Temperature.HI.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Regex.Types
+import Duckling.Temperature.Helpers
+import Duckling.Types
+import qualified Duckling.Temperature.Types as TTemperature
+
+ruleLatentTempDegrees :: Rule
+ruleLatentTempDegrees = Rule
+  { name = "<latent temp> degrees"
+  , pattern =
+    [ Predicate $ isValueOnly False
+    , regex "डिग्री|°"
+    ]
+  , prod = \case
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Degree td
+      _ -> Nothing
+  }
+
+ruleTempSpecific :: Rule
+ruleTempSpecific = Rule
+  { name = "<temp> Fahrenheit|Celsius"
+  , pattern =
+    [ Predicate $ isValueOnly True
+    , regex "(सेल्सीयस|फारेनहाइट)"
+    ]
+  , prod = \case
+      (Token Temperature td:Token RegexMatch (GroupMatch (match:_)):_) ->
+        case Text.toLower match of
+          "सेल्सीयस" -> Just . Token Temperature $ withUnit TTemperature.Celsius td
+          "फारेनहाइट" -> Just . Token Temperature $ withUnit TTemperature.Fahrenheit td
+          _  -> Nothing
+      _ -> Nothing
+  }
+
+
+rules :: [Rule]
+rules =
+  [ ruleLatentTempDegrees
+  , ruleTempSpecific
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Temperature/Helpers.hs b/Duckling/Temperature/Helpers.hs
--- a/Duckling/Temperature/Helpers.hs
+++ b/Duckling/Temperature/Helpers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -56,21 +55,21 @@
 withUnit :: TTemperature.TemperatureUnit -> TemperatureData -> TemperatureData
 withUnit u td = td {TTemperature.unit = Just u}
 
-withInterval :: (Int, Int) -> TemperatureData -> TemperatureData
+withInterval :: (Double, Double) -> TemperatureData -> TemperatureData
 withInterval (from, to) td = td
   { TTemperature.value = Nothing
   , TTemperature.minValue = Just from
   , TTemperature.maxValue = Just to
   }
 
-withValue :: Int -> TemperatureData -> TemperatureData
+withValue :: Double -> TemperatureData -> TemperatureData
 withValue v td = td
   { TTemperature.value = Just v
   , TTemperature.minValue = Nothing
   , TTemperature.maxValue = Nothing
   }
 
-valueOnly :: Int -> TemperatureData
+valueOnly :: Double -> TemperatureData
 valueOnly v = TemperatureData
   { TTemperature.unit = Nothing
   , TTemperature.value = Just v
@@ -86,14 +85,14 @@
   , TTemperature.maxValue = Nothing
   }
 
-withMax :: Int -> TemperatureData -> TemperatureData
+withMax :: Double -> TemperatureData -> TemperatureData
 withMax v td = td
   { TTemperature.value = Nothing
   , TTemperature.minValue = Nothing
   , TTemperature.maxValue = Just v
   }
 
-withMin :: Int -> TemperatureData -> TemperatureData
+withMin :: Double -> TemperatureData -> TemperatureData
 withMin v td = td
   { TTemperature.value = Nothing
   , TTemperature.minValue = Just v
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Temperature/KM/Corpus.hs b/Duckling/Temperature/KM/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Temperature/KM/Corpus.hs
@@ -0,0 +1,38 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Temperature.KM.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Temperature.Types
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext{locale = makeLocale KM Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Celsius 30)
+             [ "30អង្សា"
+             , "30អង្សាសេ"
+             ]
+  , examples (simple Degree 21)
+             [ "21ដឺក្រេ"
+             , "21°"
+             ]
+  ]
diff --git a/Duckling/Temperature/KM/Rules.hs b/Duckling/Temperature/KM/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Temperature/KM/Rules.hs
@@ -0,0 +1,54 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Temperature.KM.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Temperature.Helpers
+import Duckling.Types
+import qualified Duckling.Temperature.Types as TTemperature
+
+ruleLatentTempDegrees :: Rule
+ruleLatentTempDegrees = Rule
+  { name = "<latent temp> degrees"
+  , pattern =
+    [ Predicate $ isValueOnly False
+    , regex "ដឺក្រេ|°"
+    ]
+  , prod = \case
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Degree td
+      _ -> Nothing
+  }
+
+ruleTempCelcius :: Rule
+ruleTempCelcius = Rule
+  { name = "<temp> Celcius"
+  , pattern =
+    [ Predicate $ isValueOnly True
+    , regex "អង្សា(សេ)?"
+    ]
+  , prod = \case
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Celsius td
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleTempCelcius
+  , ruleLatentTempDegrees
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Temperature/MN/Corpus.hs b/Duckling/Temperature/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Temperature/MN/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Temperature.MN.Corpus
+  ( corpus 
+  ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Temperature.Types
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Celsius 37)
+             [ "37°C"
+             ]
+  , examples (simple Fahrenheit 70)
+             [ "70°F"
+             ]
+  , examples (simple Degree 45)
+             [ "45°"
+             , "45 хэм"
+             ]
+  , examples (simple Degree (-2))
+             [ "-2°"
+             , "- 2 хэм"
+             ]
+
+  ]
diff --git a/Duckling/Temperature/MN/Rules.hs b/Duckling/Temperature/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Temperature/MN/Rules.hs
@@ -0,0 +1,133 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Temperature.MN.Rules
+  ( rules ) where
+
+import Prelude
+import Data.String
+
+import Duckling.Dimensions.Types
+import Duckling.Temperature.Helpers
+import Duckling.Temperature.Types (TemperatureData(..))
+import qualified Duckling.Temperature.Types as TTemperature
+import Duckling.Types
+
+ruleTemperatureDegrees :: Rule
+ruleTemperatureDegrees = Rule
+  { name = "<latent temp> градус"
+  , pattern =
+    [ Predicate $ isValueOnly False
+    , regex "градус|°|хэм"
+    ]
+  , prod = \case
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Degree td
+      _ -> Nothing
+  }
+
+ruleTemperatureCelsius :: Rule
+ruleTemperatureCelsius = Rule
+  { name = "<temp> Celsius"
+  , pattern =
+    [ Predicate $ isValueOnly True
+    , regex "c(el[cs]?(ius)?)?\\.?"
+    ]
+  , prod = \case
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Celsius td
+      _ -> Nothing
+  }
+
+ruleTempC :: Rule
+ruleTempC = Rule
+  { name = "<temp> °C"
+  , pattern =
+    [ Predicate $ isValueOnly True
+    , regex "c"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Celsius td
+      _ -> Nothing
+  }
+
+ruleTemperatureFahrenheit :: Rule
+ruleTemperatureFahrenheit = Rule
+  { name = "<temp> Fahrenheit"
+  , pattern =
+    [ Predicate $ isValueOnly True
+    , regex "((f(ah?rh?eh?n(h?eit)?)?\\.?)|фарангейт)"
+    ]
+  , prod = \case
+      (Token Temperature td:_) -> Just . Token Temperature $
+        withUnit TTemperature.Fahrenheit td
+      _ -> Nothing
+  }
+
+ruleTemperatureBelowZero :: Rule
+ruleTemperatureBelowZero = Rule
+  { name = "<temp> below zero"
+  , pattern =
+    [ Predicate $ isValueOnly True
+    , regex "тэгээс доош"
+    ]
+  , prod = \case
+      (Token Temperature td@TemperatureData {TTemperature.value = Just v}:
+       _) -> case TTemperature.unit td of
+        Nothing -> Just . Token Temperature . withUnit TTemperature.Degree $
+          td {TTemperature.value = Just (- v)}
+        _ -> Just . Token Temperature $ td {TTemperature.value = Just (- v)}
+      _ -> Nothing
+  }
+
+
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "under/less/lower/no more than <temp>"
+  , pattern =
+    [ regex "доогуур|(бага|ихгүй|их биш)"
+    , Predicate isSimpleTemperature
+    ]
+  , prod = \case
+      (_:
+       Token Temperature TemperatureData{TTemperature.value = Just to,
+                                         TTemperature.unit = Just u}:
+       _) -> Just . Token Temperature . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "over/above/at least/more than <temp>"
+  , pattern =
+    [ regex "дээгүүр|их|багадаа"
+    , Predicate isSimpleTemperature
+    ]
+  , prod = \case
+      (_:
+       Token Temperature TemperatureData{TTemperature.value = Just from,
+                                         TTemperature.unit = Just u}:
+       _) -> Just . Token Temperature . withMin from $ unitOnly u
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleTemperatureDegrees
+  , ruleTemperatureCelsius
+  , ruleTemperatureFahrenheit
+  , ruleTemperatureBelowZero
+  , ruleTempC
+  , ruleIntervalMin
+  , ruleIntervalMax
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Temperature/Rules.hs b/Duckling/Temperature/Rules.hs
--- a/Duckling/Temperature/Rules.hs
+++ b/Duckling/Temperature/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -32,7 +31,7 @@
     ]
   , prod = \case
       (Token Numeral nd:_) ->
-        Just . Token Temperature $ valueOnly $ floor $ TNumeral.value nd
+        Just . Token Temperature $ valueOnly $ TNumeral.value nd
       _ -> Nothing
   }
 
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Temperature/TR/Rules.hs b/Duckling/Temperature/TR/Rules.hs
--- a/Duckling/Temperature/TR/Rules.hs
+++ b/Duckling/Temperature/TR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Temperature/Types.hs b/Duckling/Temperature/Types.hs
--- a/Duckling/Temperature/Types.hs
+++ b/Duckling/Temperature/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -35,9 +34,9 @@
 
 data TemperatureData = TemperatureData
   { unit     :: Maybe TemperatureUnit
-  , value    :: Maybe Int
-  , minValue :: Maybe Int
-  , maxValue :: Maybe Int
+  , value    :: Maybe Double
+  , minValue :: Maybe Double
+  , maxValue :: Maybe Double
   } deriving (Eq, Generic, Hashable, Show, Ord, NFData)
 
 instance Resolve TemperatureData where
@@ -59,7 +58,7 @@
 
 data SingleValue = SingleValue
   { vUnit :: TemperatureUnit
-  , vValue :: Int
+  , vValue :: Double
   }
   deriving (Eq, Show)
 
@@ -96,22 +95,22 @@
 -- -----------------------------------------------------------------
 -- Value helpers
 
-simple :: TemperatureUnit -> Int -> TemperatureValue
+simple :: TemperatureUnit -> Double -> TemperatureValue
 simple u v = SimpleValue $ single u v
 
-between :: TemperatureUnit -> (Int, Int) -> TemperatureValue
+between :: TemperatureUnit -> (Double, Double) -> TemperatureValue
 between u (from, to) = IntervalValue (single u from, single u to)
 
-above :: TemperatureUnit -> Int -> TemperatureValue
+above :: TemperatureUnit -> Double -> TemperatureValue
 above = openInterval Above
 
-under :: TemperatureUnit -> Int -> TemperatureValue
+under :: TemperatureUnit -> Double -> TemperatureValue
 under = openInterval Under
 
-openInterval :: IntervalDirection -> TemperatureUnit -> Int -> TemperatureValue
+openInterval :: IntervalDirection -> TemperatureUnit -> Double -> TemperatureValue
 openInterval direction u v = OpenIntervalValue (single u v, direction)
 
-single :: TemperatureUnit -> Int -> SingleValue
+single :: TemperatureUnit -> Double -> SingleValue
 single u v = SingleValue {vUnit = u, vValue = v}
 
 unitsAreCompatible :: Maybe TemperatureUnit -> TemperatureUnit -> Bool
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Testing/Types.hs b/Duckling/Testing/Types.hs
--- a/Duckling/Testing/Types.hs
+++ b/Duckling/Testing/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NoRebindableSyntax #-}
diff --git a/Duckling/Time/AR/Corpus.hs b/Duckling/Time/AR/Corpus.hs
--- a/Duckling/Time/AR/Corpus.hs
+++ b/Duckling/Time/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -127,6 +126,10 @@
              , "الاسبوع السابق"
              , "الاسبوع المنصرم"
              ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "قبل اسبوع"
+             , "من اسبوع"
+             ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
              [ "هذا الاسبوع"
              , "الاسبوع الحالي"
@@ -328,5 +331,28 @@
              [ "اغسطس 27 الى 29"
              , "من 27-29 من الشهر الثامن"
              ]
-
+  , examples (datetimeHoliday (2020, 12, 25, 0, 0, 0) Day "عيد الميلاد")
+             [ "عيد الميلاد 2020"
+             ]
+  , examples (datetimeHoliday (2013, 10, 15, 0, 0, 0) Day "عيد الأضحى")
+             [ "عيد الأضحى"
+             , "عيد الأضحى 2013"
+             ]
+  , examples (datetimeHoliday (2013, 8, 8, 0, 0, 0) Day "عيد الفطر")
+             [ "عيد الفطر"
+             , "عيد الفطر 2013"
+             ]
+  , examples (datetimeHoliday (2013, 3, 31, 0, 0, 0) Day "عيد الفصح")
+             [ "عيد الفصح"
+             , "عيد الفصح 2013"
+             ]
+  , examples (datetimeHoliday (2013, 11, 4, 0, 0, 0) Day "رأس السنة الهجرية")
+             [ "رأس السنة الهجرية"
+             ]
+  , examples (datetimeHoliday (2019, 8, 31, 0, 0, 0) Day "رأس السنة الهجرية")
+             [ "رأس السنة الهجرية 2019"
+             ]
+  , examples (datetimeIntervalHoliday ((2019, 5, 6, 0, 0, 0), (2019, 6, 4, 0, 0, 0)) Day "رمضان")
+             [ "رمضان 2019"
+             ]
   ]
diff --git a/Duckling/Time/AR/Rules.hs b/Duckling/Time/AR/Rules.hs
--- a/Duckling/Time/AR/Rules.hs
+++ b/Duckling/Time/AR/Rules.hs
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -26,6 +26,7 @@
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Regex.Types
+import Duckling.Time.Computed
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
@@ -177,7 +178,7 @@
   { name = "this <time>"
   , pattern =
     [ regex "هذا"
-    , Predicate isNotLatent
+    , Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> tt $ predNth 0 False td
@@ -188,7 +189,7 @@
 ruleNextTime = Rule
   { name = "<time> next"
   , pattern =
-    [ Predicate isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     , regex "التالي"
     ]
   , prod = \tokens -> case tokens of
@@ -201,7 +202,7 @@
   { name = "last <time>"
   , pattern =
     [ regex "([اآ]خر)"
-    , Predicate isNotLatent
+    , Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> tt $ predNth (- 1) False td
@@ -213,7 +214,7 @@
 ruleLastTime2 = Rule
   { name = "<time> last"
   , pattern =
-    [ Predicate isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     , regex "((ال)?ماضيت?(ان|ين|ة|ه)?|(ال)?منصرمت?(ان|ين|ة|ه)?|(ال)?سابقت?(ان|ين|ة|ه)?)"
     ]
   , prod = \tokens -> case tokens of
@@ -691,8 +692,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:token:_) -> do
         n <- getIntValue token
-        t <- minutesAfter n td
-        Just $ Token Time t
+        Token Time <$> minutesAfter n td
       _ -> Nothing
   }
 
@@ -707,8 +707,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesAfter n td
-        Just $ Token Time t
+        Token Time <$> minutesAfter n td
       _ -> Nothing
   }
 
@@ -905,7 +904,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+        intersect today td
       _ -> Nothing
   }
 
@@ -914,7 +913,6 @@
   { name = "tonight"
   , pattern = [regex "(هذه )?الليل[ةه]"]
   , prod = \_ -> do
-      let today = cycleNth TG.Day 0
       evening <- interval TTime.Open (hour False 18) (hour False 0)
       Token Time . partOfDay . notLatent <$> intersect today evening
   }
@@ -933,8 +931,7 @@
           "(ال)?مدرس[ةه]" -> Just (hour False 15, hour False 21)
           _        -> Nothing
         td <- interval TTime.Open start end
-        Token Time . partOfDay . notLatent <$>
-          intersect (cycleNth TG.Day 0) td
+        Token Time . partOfDay . notLatent <$> intersect today td
       _ -> Nothing
   }
 
@@ -960,26 +957,13 @@
   , prod = \_ -> tt weekend
   }
 
-ruleSeasons :: Rule
-ruleSeasons = Rule
-  { name = "seasons"
-  , pattern = [regex "((ال)?صيف|(ال)?خريف|(ال)?شتاء|(ال)?ربيع)"]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> do
-        (start, end) <- case Text.toLower match of
-          "الصيف"   -> Just $ (monthDay 6 21 , monthDay 9 23)
-          "صيف"     -> Just $ (monthDay 6 21 , monthDay 9 23)
-          "الخريف"  -> Just $ (monthDay 9 23 , monthDay 12 21)
-          "خريف"    -> Just $ (monthDay 9 23 , monthDay 12 21)
-          "الشتاء"  -> Just $ (monthDay 12 21, monthDay 3 20)
-          "شتاء"    -> Just $ (monthDay 12 21, monthDay 3 20)
-          "الربيع"  -> Just $ (monthDay 3 20 , monthDay 6 21)
-          "ربيع"    -> Just $ (monthDay 3 20 , monthDay 6 21)
-          _         -> Nothing
-        Token Time <$> interval TTime.Open start end
-      _ -> Nothing
-
-  }
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ("summer", "صيف|الصيف"  , monthDay  6 21, monthDay  9 23)
+  , ("fall"  , "الخريف|خريف", monthDay  9 23, monthDay 12 21)
+  , ("winter", "شتاء|الشتاء", monthDay 12 21, monthDay  3 20)
+  , ("spring", "ربيع|الربيع", monthDay  3 20, monthDay  6 21)
+  ]
 
 ruleTODPrecision :: Rule
 ruleTODPrecision = Rule
@@ -1216,8 +1200,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Open (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1257,8 +1240,8 @@
       _ -> Nothing
   }
 
-daysOfWeek :: [(Text, String)]
-daysOfWeek =
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
   [ ( "Monday"   , "(ال)?[اإ]ثنين"   )
   , ( "Tuesday"  , "(ال)?ثلاثاء?"     )
   , ( "Wednesday", "(ال)?[اأ]ربعاء?" )
@@ -1268,17 +1251,8 @@
   , ( "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 =
+ruleMonths :: [Rule]
+ruleMonths = mkRuleMonths
   [ ( "January"  , "يناير|كانون (ال)ثاني?"       )
   , ( "February" , "فبراير|شباط"                 )
   , ( "March"    , "مارس|[اآ]ذار"                )
@@ -1293,15 +1267,6 @@
   , ( "December" , "ديسمبر|كانون (ال)?[اأ]ول"    )
   ]
 
-ruleMonths :: [Rule]
-ruleMonths = zipWith go months [1..12]
-  where
-    go (name, regexPattern) i = Rule
-      { name = name
-      , pattern = [regex regexPattern]
-      , prod = \_ -> tt $ month i
-      }
-
 ruleMonthsNumeral :: Rule
 ruleMonthsNumeral = Rule
   { name = "month (integer)"
@@ -1384,24 +1349,15 @@
       _ -> Nothing
   }
 
-usHolidays :: [(Text, String, Int, Int)]
-usHolidays =
-  [ ( "Christmas"       , "(يوم |عطل[ةه] )?((ال)?كري?سماس)"              , 12, 25 )
-  , ( "Christmas Eve"   , "(ليل[ةه] )((ال)?كري?سماس)"                    , 12, 24 )
-  , ( "New Year's Eve"  , "(ليل[ةه] )(ر[اأ]س السن[ةه])"                  , 12, 31 )
-  , ( "New Year's Day"  , "(يوم |عطل[ةه] )?(ر[اأ]س السن[ةه])"            , 1 , 1  )
-  , ( "Valentine's Day" , "(عيد|يوم|عطل[ةه])((ال)?حب|(ال)?فالنتا?ين)"    , 2 , 14 )
-  , ( "Halloween"       , "(عيد |يوم |عطل[ةه] )?((ال)?هالوي?ين)"         , 10, 31 )
-  ]
-
 ruleUSHolidays :: [Rule]
-ruleUSHolidays = map go usHolidays
-  where
-    go (name, regexPattern, m, d) = Rule
-      { name = name
-      , pattern = [regex regexPattern]
-      , prod = \_ -> tt $ monthDay m d
-      }
+ruleUSHolidays = mkRuleHolidays
+  [ ( "Christmas"       , "(يوم |عطل[ةه] )?((ال)?كري?سماس)"           , monthDay 12 25)
+  , ( "Christmas Eve"   , "(ليل[ةه] )((ال)?كري?سماس)"                 , monthDay 12 24)
+  , ( "New Year's Eve"  , "(ليل[ةه] )(ر[اأ]س السن[ةه])"               , monthDay 12 31)
+  , ( "New Year's Day"  , "(وم |عطل[ةه] )?(ر[اأ]س السن[ةه])"          , monthDay  1  1)
+  , ( "Valentine's Day" , "(عيد|يوم|عطل[ةه])((ال)?حب|(ال)?فالنتا?ين)" , monthDay  2 12)
+  , ( "Halloween"       , "(عيد |يوم |عطل[ةه] )?((ال)?هالوي?ين)"      , monthDay 10 31 )
+  ]
 
 ruleThisLastNextCycle :: Rule
 ruleThisLastNextCycle = Rule
@@ -1619,8 +1575,7 @@
       (Token RegexMatch (GroupMatch (match:_)):
        Token Duration dd:
        _) -> case Text.toLower match of
-         "خلال" -> Token Time <$>
-           interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+         "خلال" -> Token Time <$> interval TTime.Open now (inDuration dd)
          "بعد" -> tt . withDirection TTime.After $ inDuration dd
          "في" -> tt $ inDuration dd
          _ -> Nothing
@@ -1643,6 +1598,19 @@
       _ -> Nothing
   }
 
+ruleBeforeDuration :: Rule
+ruleBeforeDuration = Rule
+  { name = "before <duration>"
+  , pattern =
+    [ regex "من|قبل"
+    , dimension Duration
+    ]
+  , prod = \case
+      (_:Token Duration dd:_) ->
+        tt $ durationAgo dd
+      _ -> Nothing
+  }
+
 ruleInNumeral :: Rule
 ruleInNumeral = Rule
   { name = "in <number> (implicit minutes)"
@@ -1717,6 +1685,27 @@
       _ -> Nothing
   }
 
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  [ ( "عيد الميلاد" ,"عيد الميلاد", monthDay 12 25 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "عيد الأضحى" ,"عيد الأضحى", eidalAdha )
+  , ( "عيد الفطر" ,"عيد الفطر", eidalFitr )
+  , ( "عيد الفصح" ,"عيد الفصح", easterSunday )
+  , ( "رأس السنة الهجرية" ,"رأس السنة الهجرية", muharram )
+  ]
+
+ruleComputedHolidays' :: [Rule]
+ruleComputedHolidays' = mkRuleHolidays'
+  [ ( "رمضان", "رمضان"
+    , let start = ramadan
+          end = cycleNthAfter False TG.Day (-1) eidalFitr
+        in interval TTime.Open start end )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleIntersect
@@ -1789,7 +1778,6 @@
   , ruleAfterPartofday
   , ruleTimePOD
   , ruleWeekend
-  , ruleSeasons
   , ruleTODPrecision
   , rulePrecisionTOD
   , ruleIntervalFromMonthDDDD
@@ -1820,6 +1808,7 @@
   , ruleCycleOrdinalAfterTime
   , ruleDurationInWithinAfter
   , ruleDurationHenceAgo
+  , ruleBeforeDuration
   , ruleDurationAfterBeforeTime
   , ruleIntervalForDurationFrom
   , ruleTimeForDuration
@@ -1829,7 +1818,12 @@
   , ruleDayOfMonth
   , ruleNow
   ]
+
   ++ ruleInstants
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ ruleSeasons
   ++ ruleUSHolidays
+  ++ rulePeriodicHolidays
+  ++ ruleComputedHolidays
+  ++ ruleComputedHolidays'
diff --git a/Duckling/Time/BG/Corpus.hs b/Duckling/Time/BG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/BG/Corpus.hs
@@ -0,0 +1,171 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.BG.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Data.String
+import Prelude
+
+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)
+
+context :: Context
+context = testContext {locale = makeLocale BG Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (context, testOptions, examples)
+  where
+    examples =
+      [ "един хотел"
+      , "една оферта"
+      , "следващи 5"
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
+             [ "сега"
+             , "точно сега"
+             ]
+  , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "днес"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "вчера"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "утре"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "понеделник"
+             , "пон."
+             , "този понеделник"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "понеделник, 18 февруари"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "вторник"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "четвъртък"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "петък"
+             ]
+  , examples (datetime (2013, 2, 16, 0, 0, 0) Day)
+             [ "събота"
+             ]
+  , examples (datetime (2013, 2, 17, 0, 0, 0) Day)
+             [ "неделя"
+             , "нед."
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "1 март"
+             , "първи март"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "на петнадесети"
+             ]
+  , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
+             [ "8 август"
+             ]
+  , examples (datetime (2014, 10, 0, 0, 0, 0) Month)
+             [ "октомври 2014"
+             ]
+  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+             [ "31.10.1974"
+             , "31.10.74"
+             ]
+  , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
+             ["14 април 2015"
+             ,"април 14, 2015"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "следващия вторник"
+             ]
+  , examples (datetime (2013, 2, 22, 0, 0, 0) Day)
+             [ "по-следващия петък"
+             ]
+  , examples (datetime (2013, 3, 0, 0, 0, 0) Month)
+             [ "следващия март"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
+             [ "тази седмица"
+             ]
+  , examples (datetime (2013, 2, 4, 0, 0, 0) Week)
+             [ "последната седмица"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
+             [ "следващата седмица"
+             ]
+  , examples (datetime (2013, 1, 0, 0, 0, 0) Month)
+             [ "последния месец"
+             ]
+  , examples (datetime (2012, 0, 0, 0, 0, 0) Year)
+             [ "миналата година"
+             ]
+  , examples (datetime (2013, 0, 0, 0, 0, 0) Year)
+             [ "тази година"
+             ]
+  , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
+             [ "следващата година"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 0, 0) Hour)
+             [ "в 4 сутринта"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "в 3"
+             , "3 часа"
+             , "в три"
+             ]
+  , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
+             [ "3:18 сутринта"
+             ]
+  , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
+             [ "3:18"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 18, 0) Minute)
+             [ "3:18 след обед"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 0, 0) Minute)
+             [ "днес в 20:00"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "утре"
+             ]
+  , examples (datetimeOpenInterval After (2016, 2, 0, 0, 0, 0) Month)
+             [ "след 3 години"
+             ]
+  , examples (datetimeOpenInterval After (2013, 2, 19, 4, 0, 0) Hour)
+             [ "след 7 дни"
+             ]
+  , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
+             [ "това лято"
+             ]
+  , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
+             [ "тази зима"
+             ]
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Christmas")
+             [ "коледа"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "тази вечер"
+             ]
+  ]
diff --git a/Duckling/Time/BG/Rules.hs b/Duckling/Time/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/BG/Rules.hs
@@ -0,0 +1,1793 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.BG.Rules
+  ( rules
+  ) where
+
+import Control.Applicative ((<|>))
+import Data.Maybe
+import Data.Text (Text)
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (duration)
+import Duckling.Duration.Types (DurationData (..))
+import Duckling.Numeral.Helpers (isNatural, parseInt)
+import Duckling.Numeral.Types (NumeralData (..))
+import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Regex.Types
+import Duckling.Time.Computed
+import Duckling.Time.Helpers
+import Duckling.Time.Types (TimeData (..), TimeIntervalType (..))
+import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
+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
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isGrainFinerThan TG.Year]
+    , Predicate $ or . sequence [isNotLatent, isGrainOfTime TG.Year]
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleIntersectOf :: Rule
+ruleIntersectOf = Rule
+  { name = "intersect by \",\", \"of\", \"from\", \"'s\""
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "от|за|на|,"
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time . notLatent <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleIntersectYear :: Rule
+ruleIntersectYear = Rule
+  { name = "intersect by \",\", \"of\", \"from\" for year"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "на|,"
+    , Predicate $ isGrainOfTime TG.Year
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time . notLatent <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleAbsorbOnDay :: Rule
+ruleAbsorbOnDay = Rule
+  { name = "on <day>"
+  , pattern =
+    [ regex "на"
+    , Predicate $ isGrainOfTime TG.Day
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleAbsorbOnADOW :: Rule
+ruleAbsorbOnADOW = Rule
+  { name = "on a <named-day>"
+  , pattern =
+    [ regex "в"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleAbsorbInMonthYear :: Rule
+ruleAbsorbInMonthYear = Rule
+  { name = "in|during <named-month>|year"
+  , pattern =
+    [ regex "в|през"
+    , Predicate $ or . sequence [isAMonth, isGrainOfTime TG.Year]
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleAbsorbCommaTOD :: Rule
+ruleAbsorbCommaTOD = Rule
+  { name = "absorption of , after named day"
+  , pattern =
+    [ Predicate isADayOfWeek
+    , regex ","
+    ]
+  , prod = \case
+      (token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleInstants :: [Rule]
+ruleInstants = mkRuleInstants
+  [ ("right now"        , TG.Second, 0  , "((точно\\s+)?сега)|веднага")
+  , ("today"            , TG.Day   , 0  , "днес|(по това време)"      )
+  , ("tomorrow"         , TG.Day   , 1  , "утре"                      )
+  , ("yesterday"        , TG.Day   , - 1, "вчера"                     )
+  , ( "after tomorrow"  , TG.Day   , 2  , "(в\\s*)?другиден"          )
+  , ( "before yesterday", TG.Day   , - 2, "(оня ден)|завчера"         )
+  ]
+
+ruleNow :: Rule
+ruleNow = Rule
+  { name = "now"
+  , pattern =
+    [ regex "сега"
+    ]
+  , prod = \_ -> tt now
+  }
+
+ruleNextDOW :: Rule
+ruleNextDOW = Rule
+  { name = "this|next <day-of-week>"
+  , pattern =
+    [ regex "(т(о|а)зи)|следващ((ия(т)?)|ата)"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 0 True td
+      _ -> Nothing
+  }
+
+ruleThisTime :: Rule
+ruleThisTime = Rule
+  { name = "this <time>"
+  , pattern =
+    [ regex "(т(а|о)зи)|това"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 0 False td
+      _ -> Nothing
+  }
+
+ruleNextTime :: Rule
+ruleNextTime = Rule
+  { name = "next <time>"
+  , pattern =
+    [ regex "следващ((ия(т)?)|ата|ото)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 0 True td
+      _ -> Nothing
+  }
+
+ruleLastTime :: Rule
+ruleLastTime = Rule
+  { name = "last <time>"
+  , pattern =
+    [ regex "((пред(н|ишн))|минал)((ия(т)?)|ата|ото)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth (- 1) False td
+      _ -> Nothing
+  }
+
+ruleLastWeekendOfMonth :: Rule
+ruleLastWeekendOfMonth = Rule
+  { name = "last weekend of <named-month>"
+  , pattern =
+    [ regex "последния(т)? уикенд\\s+(през|на)"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:Token Time td2:_) -> tt $ predLastOf weekend td2
+      _ -> Nothing
+  }
+
+ruleTimeBeforeLast :: Rule
+ruleTimeBeforeLast = Rule
+  { name = "<time> before last"
+  , pattern =
+    [ regex "по(\\-|\\s+)((пред(н|ишн))|минал)((ия(т)?)|ата|ото)"
+    , dimension Time
+    ]
+  , prod = \case
+    (_:Token Time td:_) -> tt $ predNth (- 2) False td
+    _ -> Nothing
+  }
+
+ruleTimeAfterNext :: Rule
+ruleTimeAfterNext = Rule
+  { name = "<time> after next"
+  , pattern =
+    [ regex "по(\\-|\\s+)следващ((ия(т)?)|ата|ото)"
+    , dimension Time
+    ]
+  , prod = \case
+    (_:Token Time td:_) -> tt $ predNth 1 True td
+    _ -> Nothing
+  }
+
+ruleLastDOWOfTime :: Rule
+ruleLastDOWOfTime = Rule
+  { name = "last <day-of-week> of <time>"
+  , pattern =
+    [ regex "последн((ия(т)?)|ата)"
+    , Predicate isADayOfWeek
+    , regex "на"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        tt $ predLastOf td1 td2
+      _ -> Nothing
+  }
+
+ruleLastCycleOfTime :: Rule
+ruleLastCycleOfTime = Rule
+  { name = "last <cycle> of <time>"
+  , pattern =
+    [ regex "последн((ия(т)?)|ото|ата)"
+    , dimension TimeGrain
+    , regex "на|в|през"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_:Token Time td:_) ->
+        tt $ cycleLastOf grain td
+      _ -> Nothing
+  }
+
+ruleLastNight :: Rule
+ruleLastNight = Rule
+  { name = "last night"
+  , pattern =
+    [ regex "(късно )?снощи"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        let hours = if Text.toLower match == "късно " then 3 else 6
+            start = durationBefore (DurationData hours TG.Hour) today
+        in Token Time . partOfDay . notLatent <$> interval TTime.Open start today
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime :: Rule
+ruleNthTimeOfTime = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , regex "на|в|през"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal od:Token Time td1:_:Token Time td2:_) -> Token Time .
+        predNth (TOrdinal.value od - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleNthTimeAfterTime :: Rule
+ruleNthTimeAfterTime = Rule
+  { name = "nth <time> after <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , regex "след|от"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal od:Token Time td1:_:Token Time td2:_) ->
+        tt $ predNthAfter (TOrdinal.value od - 1) td1 td2
+      _ -> Nothing
+  }
+
+ruleNDOWFromTime :: Rule
+ruleNDOWFromTime = Rule
+  { name = "<integer> <day-of-week> from <time>"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isADayOfWeek
+    , regex "от"
+    , dimension Time
+    ]
+  , prod = \case
+      (token:Token Time td1:_:Token Time td2:_) -> do
+        n <- getIntValue token
+        tt $ predNthAfter (n - 1) td1 td2
+      _ -> Nothing
+  }
+
+ruleYearLatent :: Rule
+ruleYearLatent = Rule
+  { name = "year (latent)"
+  , pattern =
+      [ Predicate $
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 10000]
+      ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ year n
+      _ -> Nothing
+  }
+
+ruleYearADBC :: Rule
+ruleYearADBC = Rule
+  { name = "<year> (bc|ad)"
+  , pattern =
+    [ Predicate $ isIntegerBetween (-10000) 10000
+    , regex "(пр|сл)\\.?\\s+(Хр\\.?|н\\.?\\e.?)"
+    ]
+  , prod = \case
+    (token:Token RegexMatch (GroupMatch (ab:_)):_) -> do
+      y <- getIntValue token
+      tt . yearADBC $ if Text.head (Text.toLower ab) == 'п' then -y else y
+    _ -> Nothing
+  }
+
+ruleDOMLatent :: Rule
+ruleDOMLatent = Rule
+  { name = "<day-of-month> (ordinal)"
+  , pattern = [Predicate isDOMOrdinal]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ dayOfMonth n
+      _ -> Nothing
+  }
+
+ruleTheDOMNumeral :: Rule
+ruleTheDOMNumeral = Rule
+  { name = "the <day-of-month> (number)"
+  , pattern =
+    [ Predicate isDOMInteger
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ dayOfMonth n
+      _ -> Nothing
+  }
+
+ruleTheDOMOrdinal :: Rule
+ruleTheDOMOrdinal = Rule
+  { name = "the <day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       _) -> tt $ dayOfMonth v
+      _ -> Nothing
+  }
+
+ruleNamedDOMOrdinal :: Rule
+ruleNamedDOMOrdinal = Rule
+  { name = "<named-month>|<named-day> <day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate $ or . sequence [isAMonth, isADayOfWeek]
+    , Predicate isDOMOrdinal
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleMonthDOMNumeral :: Rule
+ruleMonthDOMNumeral = Rule
+  { name = "<named-month> <day-of-month> (non ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMInteger
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleDOMMonth :: Rule
+ruleDOMMonth = Rule
+  { name = "<day-of-month> (ordinal or number) <named-month>"
+  , pattern =
+    [ Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleDOMMonthYear :: Rule
+ruleDOMMonthYear = Rule
+  { name = "<day-of-month>(ordinal or number)/<named-month>/year"
+  , pattern =
+    [ Predicate isDOMValue
+    , regex "[-/\\s]"
+    , Predicate isAMonth
+    , regex "[-/\\s]"
+    , regex "(\\d{4})"
+    ]
+  , prod = \case
+      (token:
+       _:
+       Token Time td:
+       _:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+         intVal <- parseInt match
+         dom <- intersectDOM td token
+         Token Time <$> intersect dom (year intVal)
+      _ -> Nothing
+  }
+
+ruleDOMOrdinalMonthYear :: Rule
+ruleDOMOrdinalMonthYear = Rule
+  { name = "<day-of-month>(ordinal) <named-month> year"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    , Predicate isAMonth
+    , regex "(\\d{2,4})"
+    ]
+  , prod = \case
+      (token:Token Time td:Token RegexMatch (GroupMatch (match:_)):_) -> do
+        intVal <- parseInt match
+        dom <- intersectDOM td token
+        Token Time <$> intersect dom (year intVal)
+      _ -> Nothing
+  }
+
+ruleMonthYear :: Rule
+ruleMonthYear = Rule
+  { name = "<named-month> year"
+  , pattern =
+    [ Predicate isAMonth
+    , regex "(\\d{2,4})"
+    ]
+  , prod = \case
+      (Token Time td:Token RegexMatch (GroupMatch (match:_)):_) -> do
+        intVal <- parseInt match
+        Token Time <$> intersect td (year intVal)
+      _ -> Nothing
+  }
+
+ruleIdesOfMonth :: Rule
+ruleIdesOfMonth = Rule
+  { name = "the ides of <named-month>"
+  , pattern =
+    [ regex "средата на"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:Token Time td@TimeData {TTime.form = Just (TTime.Month m)}:_) ->
+        Token Time <$>
+          intersect td (dayOfMonth $ if elem m [3, 5, 7, 10] then 15 else 13)
+      _ -> Nothing
+  }
+
+ruleTODLatent :: Rule
+ruleTODLatent = Rule
+  { name = "time-of-day (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 0 23
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ hour (n < 13) n
+      _ -> Nothing
+  }
+
+ruleAtTOD :: Rule
+ruleAtTOD = Rule
+  { name = "at <time-of-day>"
+  , pattern =
+    [ regex "в"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleTODOClock :: Rule
+ruleTODOClock = Rule
+  { name = "<time-of-day> o'clock"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "часа"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleHHMM :: Rule
+ruleHHMM = Rule
+  { name = "hh:mm"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))[:.]([0-5]\\d)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        tt $ hourMinute False h m
+      _ -> Nothing
+  }
+
+ruleHHhMM :: Rule
+ruleHHhMM = Rule
+  { name = "hhhmm"
+  , pattern =
+    [ regex "(?<!/)((?:[01]?\\d)|(?:2[0-3]))ч(([0-5]\\d)|(?!\\d))"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm <|> Just 0
+        tt $ hourMinute False h m
+      _ -> Nothing
+  }
+
+ruleHHMMLatent :: Rule
+ruleHHMMLatent = Rule
+  { name = "hhmm (latent)"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))([0-5]\\d)(?!.\\d)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        tt . mkLatent $ hourMinute False 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 = \case
+      (Token RegexMatch (GroupMatch (hh:mm:ss:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        s <- parseInt ss
+        tt $ hourMinuteSecond False h m s
+      _ -> Nothing
+  }
+
+ruleTODAM :: Rule
+ruleTODAM = Rule
+  { name = "<time-of-day> am"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "сутрин(та)?"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ timeOfDayAMPM True td
+      _ -> Nothing
+  }
+
+ruleTODPM :: Rule
+ruleTODPM = Rule
+  { name = "<time-of-day> pm"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "вечер(та)?|след об(е|я)д"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ timeOfDayAMPM False td
+      _ -> Nothing
+  }
+
+ruleHONumeral :: Rule
+ruleHONumeral = Rule
+  { name = "<hour-of-day> <integer>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , Predicate $ isIntegerBetween 1 59
+    ]
+  , prod = \case
+      (Token Time TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)
+                          ,TTime.latent = isLatent}:
+       token:
+       _) -> do
+        n <- getIntValue token
+        if isLatent
+          then tt . mkLatent $ hourMinute is12H hours n
+          else tt $ hourMinute is12H hours n
+      _ -> Nothing
+  }
+
+ruleHODHalf :: Rule
+ruleHODHalf = Rule
+  { name = "<hour-of-day> half"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "и половина"
+    ]
+  , prod = \case
+      (Token Time TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       _) -> tt $ hourMinute is12H hours 30
+      _ -> Nothing
+  }
+
+ruleHODQuarter :: Rule
+ruleHODQuarter = Rule
+  { name = "<hour-of-day> quarter"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "и (четвърт|(петнайсе(т)?))"
+    ]
+  , prod = \case
+      (Token Time TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       _) -> tt $ hourMinute is12H hours 15
+      _ -> Nothing
+  }
+
+ruleNumeralToHOD :: Rule
+ruleNumeralToHOD = Rule
+  { name = "<integer> to|till|before <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "без"
+    , Predicate $ isIntegerBetween 1 59
+    ]
+  , prod = \case
+      (Token Time td:_:token:_) -> do
+        n <- getIntValue token
+        Token Time <$> minutesBefore n td
+      _ -> Nothing
+  }
+
+ruleQuarterToHOD :: Rule
+ruleQuarterToHOD = Rule
+  { name = "quarter to|till|before <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "без (четвърт|(петнайсе(т)?))"
+    ]
+  , prod = \case
+      (Token Time td:_:_) -> Token Time <$> minutesBefore 15 td
+      _ -> Nothing
+  }
+
+ruleNumeralAfterHOD :: Rule
+ruleNumeralAfterHOD = Rule
+  { name = "integer after|past <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "и"
+    , Predicate $ isIntegerBetween 1 59
+    ]
+  , prod = \case
+      (Token Time td:_:token:_) -> do
+        n <- getIntValue token
+        Token Time <$> minutesAfter n td
+      _ -> Nothing
+  }
+
+ruleMMYYYY :: Rule
+ruleMMYYYY = Rule
+  { name = "mm/yyyy"
+  , pattern =
+    [ regex "(0?[1-9]|1[0-2])[/-](\\d{4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (mm:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        tt $ yearMonth y m
+      _ -> Nothing
+  }
+
+ruleYYYYMM :: Rule
+ruleYYYYMM = Rule
+  { name = "yyyy-mm"
+  , pattern =
+    [ regex "(\\d{4})\\s*[/-]\\s*(1[0-2]|0?[1-9])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (yy:mm:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        tt $ yearMonth y m
+      _ -> Nothing
+  }
+
+ruleYYYYMMDD :: Rule
+ruleYYYYMMDD = Rule
+  { name = "yyyy-mm-dd"
+  , pattern =
+    [ regex "(\\d{2,4})-(0?[1-9]|1[0-2])-(3[01]|[12]\\d|0?[1-9])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (yy:mm:dd:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleDDMMYYYYDot :: Rule
+ruleDDMMYYYYDot = Rule
+  { name = "dd.mm.yyyy"
+  , pattern =
+    [ regex "(3[01]|[12]\\d|0?[1-9])\\.(1[0-2]|0?[1-9])\\.(\\d{2,4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleYYYYQQ :: Rule
+ruleYYYYQQ = Rule
+  { name = "yyyyqq"
+  , pattern =
+    [ regex "(\\d{2,4})q([1-4])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (yy:qq:_)):_) -> do
+        y <- parseInt yy
+        q <- parseInt qq
+        tt . cycleNthAfter True TG.Quarter (q - 1) $ year y
+      _ -> Nothing
+  }
+
+ruleNoonMidnightEOD :: Rule
+ruleNoonMidnightEOD = Rule
+  { name = "noon|midnight|EOD|end of day"
+  , pattern =
+    [ regex "(обед|обяд|полунощ|((в )?(края на деня)))"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> tt . hour False $
+        if (Text.toLower match == "обед" || Text.toLower match == "обяд")  then 12 else 0
+      _ -> Nothing
+  }
+
+rulePartOfDays :: Rule
+rulePartOfDays = Rule
+  { name = "part of days"
+  , pattern =
+    [ regex "(сутрин(та)?|(по|след) ?об(е|я)д|вечер(та)?|(през )?нощ(та)?)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let (start, end) = case Text.toLower match of
+              "сутрин"  -> (hour False 4, hour False 12)
+              "сутринта"  -> (hour False 4, hour False 12)
+              "вечер"  -> (hour False 18, hour False 0)
+              "вечерта"  -> (hour False 18, hour False 0)
+              "нощ"    -> (hour False 0, hour False 4)
+              "нощта"    -> (hour False 0, hour False 4)
+              "през нощта"    -> (hour False 0, hour False 4)
+              "обед"    -> (hour False 12, hour False 14)
+              "по обед" -> (hour False 12, hour False 14)
+              "обяд"    -> (hour False 12, hour False 14)
+              "по обяд" -> (hour False 12, hour False 14)
+              _          -> (hour False 12, hour False 19)
+        td <- interval TTime.Open start end
+        tt . partOfDay $ mkLatent td
+      _ -> Nothing
+  }
+
+ruleEarlyMorning :: Rule
+ruleEarlyMorning = Rule
+  { name = "early morning"
+  , pattern =
+    [ regex "рано сутрин(та)?"
+    ]
+  , prod = \_ -> Token Time . partOfDay . mkLatent <$>
+      interval TTime.Open (hour False 4) (hour False 9)
+  }
+
+rulePODThis :: Rule
+rulePODThis = Rule
+  { name = "this <part-of-day>"
+  , pattern =
+    [ regex "(т(о|а)зи)"
+    , Predicate isAPartOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> Token Time . partOfDay . notLatent <$>
+        intersect today td
+      _ -> Nothing
+  }
+
+ruleTonight :: Rule
+ruleTonight = Rule
+  { name = "tonight"
+  , pattern =
+    [ regex "(късно )?вечер(та)?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let h = if Text.toLower match == "късно " then 21 else 18
+        evening <- interval TTime.Open (hour False h) (hour False 0)
+        Token Time . partOfDay . notLatent <$> intersect today evening
+      _ -> Nothing
+  }
+
+ruleAfterPartofday :: Rule
+ruleAfterPartofday = Rule
+  { name = "after lunch/work/school"
+  , pattern =
+    [ regex "след[\\s*]?((об(е|я)д)|работа|училище)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        (start, end) <- case Text.toLower match of
+          "обед"  -> Just (hour False 13, hour False 17)
+          "обяд"  -> Just (hour False 13, hour False 17)
+          "работа"   -> Just (hour False 17, hour False 21)
+          "училище" -> Just (hour False 15, hour False 21)
+          _        -> Nothing
+        td <- interval TTime.Open start end
+        Token Time . partOfDay . notLatent <$> intersect today 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 = \case
+      (Token Time td:Token Time pod:_) -> Token Time <$> intersect pod td
+      _ -> Nothing
+  }
+
+rulePODofTime :: Rule
+rulePODofTime = Rule
+  { name = "<part-of-day> of <time>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , regex "на"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time pod:_:Token Time td:_) -> Token Time <$> intersect pod td
+      _ -> Nothing
+  }
+
+ruleWeekend :: Rule
+ruleWeekend = Rule
+  { name = "week-end"
+  , pattern =
+    [ regex "(края на седмицата)|(уикенд(а)?)"
+    ]
+  , prod = \_ -> tt $ mkOkForThisNext weekend
+  }
+
+ruleWeek :: Rule
+ruleWeek = Rule
+ { name = "week"
+ , pattern = [regex "(цяла|(остатъка на( тази)?)) седмица(та)?"]
+ , prod = \case
+     (Token RegexMatch (GroupMatch (match:_)):_) ->
+       let end = cycleNthAfter True TG.Day (-2) $ cycleNth TG.Week 1
+           period = case Text.toLower match of
+                      "цяла" -> interval Closed (cycleNth TG.Week 0) end
+                      "остатъка на" -> interval Open today end
+                      "остатъка на тази" -> interval Open today end
+                      _ -> Nothing
+       in case Text.toLower match of
+         "тази" -> Token Time . mkLatent <$> period
+         _ -> Token Time <$> period
+     _ -> Nothing
+ }
+
+ruleSeason :: Rule
+ruleSeason = Rule
+  { name = "last|this|next <season>"
+  , pattern =
+    [ regex "(това|тази|(по\\-)?(по\\-)?((настоящ|следващ|друг|последн|минал|предн)(ото|ата))) seasons?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        n <- case Text.toLower match of
+               "това" -> Just 0
+               "тази" -> Just 0
+               "настоящото" -> Just 0
+               "настоящата" -> Just 0
+               "миналото" -> Just (-1)
+               "миналата" -> Just (-1)
+               "последното" -> Just (-1)
+               "последната" -> Just (-1)
+               "предното" -> Just (-1)
+               "предната" -> Just (-1)
+               "следващото" -> Just 1
+               "следващата" -> Just 1
+               "другото" -> Just 1
+               "другата" -> Just 1
+               "по-миналото" -> Just (-2)
+               "по-миналата" -> Just (-2)
+               "по-последното" -> Just (-2)
+               "по-последната" -> Just (-2)
+               "по-предното" -> Just (-2)
+               "по-предната" -> Just (-2)
+               "по-следващото" -> Just 2
+               "по-следващата" -> Just 2
+               "по-другото" -> Just 2
+               "по-другата" -> Just 2
+               "по-по-миналото" -> Just (-3)
+               "по-по-миналата" -> Just (-3)
+               "по-по-последното" -> Just (-3)
+               "по-по-последната" -> Just (-3)
+               "по-по-предното" -> Just (-3)
+               "по-по-предната" -> Just (-3)
+               "по-по-следващото" -> Just 3
+               "по-по-следващата" -> Just 3
+               "по-по-другото" -> Just 3
+               "по-по-другата" -> Just 3
+               _ -> Nothing
+        tt $ predNth n False season
+      _ -> Nothing
+  }
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "summer", "лято"     , monthDay  6 21, monthDay  9 23 )
+  , ( "fall"  , "есен"     , monthDay  9 23, monthDay 12 21 )
+  , ( "winter", "зима"     , monthDay 12 21, monthDay  3 20 )
+  , ( "spring", "пролет"   , monthDay  3 20, monthDay  6 21 )
+  ]
+
+ruleTODPrecision :: Rule
+ruleTODPrecision = Rule
+  { name = "<time-of-day> sharp|exactly"
+  , pattern =
+    [ regex "(в )?точно( в )?"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+rulePrecisionTOD :: Rule
+rulePrecisionTOD = Rule
+  { name = "about|exactly <time-of-day>"
+  , pattern =
+    [ regex "около"
+    , Predicate $ isGrainFinerThan TG.Year
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleIntervalMonthDDDD :: Rule
+ruleIntervalMonthDDDD = Rule
+  { name = "<month> dd-dd (interval)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMValue
+    , regex "\\-|до"
+    , Predicate isDOMValue
+    ]
+  , prod = \case
+      (Token Time td:
+       token1:
+       _:
+       token2:
+       _) -> do
+        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 "\\-|до"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token1:
+       _:
+       token2:
+       Token Time td:
+       _) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
+ruleIntervalFromDDDDMonth :: Rule
+ruleIntervalFromDDDDMonth = Rule
+  { name = "from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) <named-month> (interval)"
+  , pattern =
+    [ regex "от"
+    , Predicate isDOMValue
+    , regex "\\-|до"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:
+       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
+  { name = "<datetime> - <datetime> (interval)"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "\\-|до"
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalSlash :: Rule
+ruleIntervalSlash = Rule
+  { name = "<datetime>/<datetime> (interval)"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "/"
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        if sameGrain td1 td2 then
+          Token Time <$> interval TTime.Closed td1 td2
+        else Nothing
+      _ -> Nothing
+  }
+
+ruleIntervalFrom :: Rule
+ruleIntervalFrom = Rule
+  { name = "from <datetime> - <datetime> (interval)"
+  , pattern =
+    [ regex "от"
+    , dimension Time
+    , regex "до"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between <time> and <time>"
+  , pattern =
+    [ regex "между"
+    , dimension Time
+    , regex "и"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+-- Specific for time-of-day, to help resolve ambiguities
+ruleIntervalTODDash :: Rule
+ruleIntervalTODDash = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "\\-|до"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalTODBetween :: Rule
+ruleIntervalTODBetween = Rule
+  { name = "between <time-of-day> and <time-of-day> (interval)"
+  , pattern =
+    [ regex "между"
+    , Predicate isATimeOfDay
+    , regex "и"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalBy :: Rule
+ruleIntervalBy = Rule
+  { name = "by <time>"
+  , pattern =
+    [ regex "до"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
+      _ -> Nothing
+  }
+
+ruleIntervalByTheEndOf :: Rule
+ruleIntervalByTheEndOf = Rule
+  { name = "by the end of <time>"
+  , pattern =
+    [ regex "до края на"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
+      _ -> Nothing
+  }
+
+ruleIntervalUntilTime :: Rule
+ruleIntervalUntilTime = Rule
+  { name = "until <time>"
+  , pattern =
+    [ regex "преди|до"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt . withDirection TTime.Before $ notLatent td
+      _ -> Nothing
+  }
+
+ruleIntervalAfterFromSinceTime :: Rule
+ruleIntervalAfterFromSinceTime = Rule
+  { name = "from|since|after <time>"
+  , pattern =
+    [ regex "след|от"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt . withDirection TTime.After $ notLatent td
+      _ -> Nothing
+  }
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
+  [ ( "Monday"   , "понеделник|пон\\.?|пн\\.?" )
+  , ( "Tuesday"  , "вторник|вт\\.?"            )
+  , ( "Wednesday", "сряда|ср\\.?"              )
+  , ( "Thursday" , "четвъртък|четв\\.?|чт\\.?" )
+  , ( "Friday"   , "петък|пет\\.?|пт\\.?"      )
+  , ( "Saturday" , "събота|съб\\.?|сб\\.?"     )
+  , ( "Sunday"   , "неделя|нед\\.?|нд\\.?"     )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = mkRuleMonths
+  [ ( "January"  , "януари|ян\\.?"     )
+  , ( "February" , "февруари|февр\\.?" )
+  , ( "March"    , "март"              )
+  , ( "April"    , "април|апр\\.?"     )
+  , ( "May"      , "май"               )
+  , ( "June"     , "юни"               )
+  , ( "July"     , "юли"               )
+  , ( "August"   , "август|авг\\.?"    )
+  , ( "September", "септември|септ\\.?")
+  , ( "October"  , "октомври|окт\\.?"  )
+  , ( "November" , "ноември|ноем\\.?"  )
+  , ( "December" , "декември|дек\\.?"  )
+  ]
+
+rulePartOfMonth :: Rule
+rulePartOfMonth = Rule
+  { name = "part of <named-month>"
+  , pattern =
+    [ regex "(началото|средата|края) на"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "началото" -> Just (1, 10)
+          "средата"   -> Just (11, 20)
+          "края"  -> Just (21, -1)
+          _       -> Nothing
+        start <- intersect td $ dayOfMonth sd
+        end <- if ed /= -1
+          then intersect td $ dayOfMonth ed
+          else Just $ cycleLastOf TG.Day td
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOrBeginningOfMonth :: Rule
+ruleEndOrBeginningOfMonth = Rule
+  { name = "at the beginning|end of <named-month>"
+  , pattern =
+    [ regex "(в )?(началото|края) на"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (_:match:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "началото" -> Just (1, 10)
+          "края"       -> Just (21, -1)
+          _           -> Nothing
+        start <- intersect td $ dayOfMonth sd
+        end <- if ed /= -1
+          then intersect td $ dayOfMonth ed
+          else Just $ cycleLastOf TG.Day td
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOfMonth :: Rule
+ruleEndOfMonth = Rule
+  { name = "end of month"
+  , pattern =
+    [ regex "((до|в)\\s+)?края на месеца"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_)
+        | (Just start, Just end) <- parsed ->
+          Token Time <$> interval TTime.Open start end
+        where
+          cycleMonth = cycleNth TG.Month
+          parsed = if "до" `Text.isPrefixOf` Text.toLower match
+            then
+              ( Just now
+              , intersect (dayOfMonth 1) $ cycleMonth 1)
+            else
+              ( intersect (dayOfMonth 21) $ cycleMonth 0
+              , Just $ cycleLastOf TG.Day $ cycleMonth 0)
+      _ -> Nothing
+  }
+
+ruleBeginningOfMonth :: Rule
+ruleBeginningOfMonth = Rule
+  { name = "beginning of month"
+  , pattern = [ regex "(в\\s+ )?началото на месеца" ]
+  , prod = \_ -> do
+      start <- intersect (dayOfMonth 1) $ cycleNth TG.Month 0
+      end <- intersect (dayOfMonth 10) $ cycleNth TG.Month 0
+      Token Time <$> interval TTime.Open start end
+  }
+
+ruleEndOrBeginningOfYear :: Rule
+ruleEndOrBeginningOfYear = Rule
+  { name = "at the beginning|end of <year>"
+  , pattern =
+    [ regex "(в\\s+)?(началото|края) на"
+    , Predicate $ isGrainOfTime TG.Year
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (_:match:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "началото" -> Just (1, 4)
+          "края"       -> Just (9, -1)
+          _           -> Nothing
+        start <- intersect td $ month sd
+        end <- if ed /= -1
+          then intersect td $ cycleLastOf TG.Month $ month ed
+          else cycleNthAfter False TG.Year 1 <$> intersect td (month 1)
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOfYear :: Rule
+ruleEndOfYear = Rule
+  { name = "end of year"
+  , pattern =
+    [ regex "((до|в)\\s+)?края на годината"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        start <- std
+        end <- intersect (month 1) $ cycleYear 1
+        Token Time <$> interval TTime.Open start end
+          where
+            std = if "до" `Text.isPrefixOf` Text.toLower match
+              then Just now
+              else intersect (month 9) $ cycleYear 0
+            cycleYear = cycleNth TG.Year
+      _ -> Nothing
+  }
+
+ruleBeginningOfYear :: Rule
+ruleBeginningOfYear = Rule
+  { name = "beginning of year"
+  , pattern = [ regex "(в\\s+)?началото на годината" ]
+  , prod = \_ -> do
+      start <- intersect (month 1) $ cycleNth TG.Year 0
+      end <- intersect (month 4) $ cycleNth TG.Year 0
+      Token Time <$> interval TTime.Open start end
+  }
+
+ruleEndOrBeginningOfWeek :: Rule
+ruleEndOrBeginningOfWeek = Rule
+  { name = "at the beginning|end of <week>"
+  , pattern =
+    [ regex "(в\\s+)?(началото|края) на"
+    , Predicate $ isGrainOfTime TG.Week
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (_:match1:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match1 of
+          "началото" -> Just (1, 3)
+          "края"       -> Just (5, 7)
+          _           -> Nothing
+        start <- intersect td $ dayOfWeek sd
+        end <- intersect td $ dayOfWeek ed
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "April Fools", "първи април", monthDay 4 1 )
+  , ( "Bulgarian Liberation Day", "(трети март)|(ден(я|ят)? на освобождението на българия( от турско робство)?)", monthDay 3 3 )
+  , ( "Bulgarian Indenpendence Day", "ден(я|ят)? на (обявянето на)? независимостта на българия", monthDay 9 22 )
+  , ( "Bulgarian Unification Day", "ден(я|ят)? на съединението на (княжество )?българия(и източна румелия)?", monthDay 9 6 )
+  , ( "Slavonic Litaracy Day", "(ден(я|ят)? на славянската писменост)|(св(\\.|ети)?(св(\\.|ети)?)? кирил и методи(й)?)", monthDay 5 24 )
+  , ( "Saint Geroge's Day", "(св(\\.|ети)? георги)|гергьовден", monthDay 5 6 )
+  , ( "Assumption of Mary", "голяма богородица", monthDay 8 15 )
+  , ( "Christmas", "коледа|(рождество( христово)?)", monthDay 12 25 )
+  , ( "Christmas Eve", "бъдни вечер", monthDay 12 24 )
+  , ( "Earth Day", "ден(я|ят) на земята", monthDay 4 22 )
+  , ( "May Day", "(първи май)|(ден(я|ят)? на труда)", monthDay 5 1 )
+  , ( "New Year's Day", "нова година", monthDay  1  1 )
+  , ( "St. George's Day", "гергьовден|(св(\\.|ети)? георги)", monthDay 5 6 )
+  , ( "Valentine's Day", "св(\\.|ети)? валентин", monthDay 2 14 )
+  , ( "International Women's Day", "ден(я|ят)? на (майката|жената)", monthDay 3 8 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Orthodox Easter Monday", "велики понеделник"
+    , cycleNthAfter False TG.Day 1 orthodoxEaster )
+  , ( "Orthodox Easter Sunday", "великден"
+    , orthodoxEaster )
+  , ( "Orthodox Holy Saturday", "велика събота"
+    , cycleNthAfter False TG.Day (-1) orthodoxEaster )
+  , ( "Orthodox Great Friday", "(велики|разпети) петък"
+    , cycleNthAfter False TG.Day (-2) orthodoxEaster )
+  , ( "Orthodox Palm Sunday", "цветница"
+    , cycleNthAfter False TG.Day (-7) orthodoxEaster )
+  ]
+
+ruleComputedHolidays' :: [Rule]
+ruleComputedHolidays' = mkRuleHolidays'
+  [ ( "Great Lent", "велики(те)? пости"
+    , let start = cycleNthAfter False TG.Day (-48) orthodoxEaster
+          end = cycleNthAfter False TG.Day (-9) orthodoxEaster
+        in interval TTime.Open start end )
+
+  -- Other
+  -- Last Saturday of March unless it falls on Holy Saturday
+  -- In which case it's the Saturday before
+  , ( "Earth Hour", "час(а|ът) на земята"
+    , let holySaturday = cycleNthAfter False TG.Day (-1) easterSunday
+          tentative = predLastOf (dayOfWeek 6) (month 3)
+          alternative = cycleNthAfter False TG.Day (-7) tentative
+        in do
+          day <- intersectWithReplacement holySaturday tentative alternative
+          start <- intersect day $ hourMinute True 20 30
+          interval TTime.Closed start $ cycleNthAfter False TG.Minute 60 start )
+  ]
+
+ruleCycleThisLastNext :: Rule
+ruleCycleThisLastNext = Rule
+  { name = "this|last|next <cycle>"
+  , pattern =
+    [ regex "(т(о|а)зи|това|((по\\-)*(настоящ|идн|следващ|минал|последн|предишн)(ия(т)?|ата|ото)))"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):Token TimeGrain grain:_) ->
+        case Text.toLower match of
+          "този"          -> tt $ cycleNth grain 0
+          "тази"          -> tt $ cycleNth grain 0
+          "това"          -> tt $ cycleNth grain 0
+          "настоящия"     -> tt $ cycleNth grain 0
+          "настоящият"    -> tt $ cycleNth grain 0
+          "настоящата"    -> tt $ cycleNth grain 0
+          "настоящото"    -> tt $ cycleNth grain 0
+          "последния"     -> tt . cycleNth grain $ - 1
+          "последният"    -> tt . cycleNth grain $ - 1
+          "последната"    -> tt . cycleNth grain $ - 1
+          "последното"    -> tt . cycleNth grain $ - 1
+          "миналия"       -> tt . cycleNth grain $ - 1
+          "миналият"      -> tt . cycleNth grain $ - 1
+          "миналата"      -> tt . cycleNth grain $ - 1
+          "миналото"      -> tt . cycleNth grain $ - 1
+          "предишния"     -> tt . cycleNth grain $ - 1
+          "предишният"    -> tt . cycleNth grain $ - 1
+          "предишната"    -> tt . cycleNth grain $ - 1
+          "предишното"    -> tt . cycleNth grain $ - 1
+          "следващия"     -> tt $ cycleNth grain 1
+          "следващият"    -> tt $ cycleNth grain 1
+          "следващата"    -> tt $ cycleNth grain 1
+          "следващото"    -> tt $ cycleNth grain 1
+          "идния"         -> tt $ cycleNth grain 1
+          "идният"        -> tt $ cycleNth grain 1
+          "идната"        -> tt $ cycleNth grain 1
+          "идното"        -> tt $ cycleNth grain 1
+          "по-последния"     -> tt . cycleNth grain $ - 2
+          "по-последният"    -> tt . cycleNth grain $ - 2
+          "по-последната"    -> tt . cycleNth grain $ - 2
+          "по-последното"    -> tt . cycleNth grain $ - 2
+          "по-миналия"       -> tt . cycleNth grain $ - 2
+          "по-миналият"      -> tt . cycleNth grain $ - 2
+          "по-миналата"      -> tt . cycleNth grain $ - 2
+          "по-миналото"      -> tt . cycleNth grain $ - 2
+          "по-предишния"     -> tt . cycleNth grain $ - 2
+          "по-предишният"    -> tt . cycleNth grain $ - 2
+          "по-предишната"    -> tt . cycleNth grain $ - 2
+          "по-предишното"    -> tt . cycleNth grain $ - 2
+          "по-следващия"     -> tt $ cycleNth grain 2
+          "по-следващият"    -> tt $ cycleNth grain 2
+          "по-следващата"    -> tt $ cycleNth grain 2
+          "по-следващото"    -> tt $ cycleNth grain 2
+          "по-по-последния"     -> tt . cycleNth grain $ - 3
+          "по-по-последният"    -> tt . cycleNth grain $ - 3
+          "по-по-последната"    -> tt . cycleNth grain $ - 3
+          "по-по-последното"    -> tt . cycleNth grain $ - 3
+          "по-по-миналия"       -> tt . cycleNth grain $ - 3
+          "по-по-миналият"      -> tt . cycleNth grain $ - 3
+          "по-по-миналата"      -> tt . cycleNth grain $ - 3
+          "по-по-миналото"      -> tt . cycleNth grain $ - 3
+          "по-по-предишния"     -> tt . cycleNth grain $ - 3
+          "по-по-предишният"    -> tt . cycleNth grain $ - 3
+          "по-по-предишната"    -> tt . cycleNth grain $ - 3
+          "по-по-предишното"    -> tt . cycleNth grain $ - 3
+          "по-по-следващия"     -> tt $ cycleNth grain 3
+          "по-по-следващият"    -> tt $ cycleNth grain 3
+          "по-по-следващата"    -> tt $ cycleNth grain 3
+          "по-по-следващото"    -> tt $ cycleNth grain 3
+          _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleCycleAfterBeforeTime :: Rule
+ruleCycleAfterBeforeTime = Rule
+  { name = "<cycle> after|before <time>"
+  , pattern =
+    [ dimension TimeGrain
+    , regex "след|преди"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token TimeGrain grain:
+       Token RegexMatch (GroupMatch (match:_)):
+       Token Time td:
+       _) ->
+        let n = if Text.toLower match == "след" then 1 else - 1 in
+          tt $ cycleNthAfter False grain n td
+      _ -> Nothing
+  }
+
+ruleDayInDuration :: Rule
+ruleDayInDuration = Rule
+  { name = "<day> in <duration>"
+  , pattern =
+    [ Predicate $ or . sequence [isGrainOfTime TG.Day, isGrainOfTime TG.Month]
+    , regex "в|през"
+    , Predicate $ isDurationGreaterThan TG.Hour
+    ]
+  , prod = \case
+      (Token Time td:_:Token Duration dd:_) ->
+        Token Time <$> intersect td (inDurationInterval dd)
+      _ -> Nothing
+  }
+
+ruleDurationInWithinAfter :: Rule
+ruleDurationInWithinAfter = Rule
+  { name = "in|within|after <duration>"
+  , pattern =
+    [ regex "(за|в рамките на|след)"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+        Token Duration dd:
+        _) -> case Text.toLower match of
+          "в рамките на" -> Token Time <$> interval TTime.Open now (inDuration dd)
+          "след"  -> tt . withDirection TTime.After $ inDuration dd
+          "за"     -> tt $ inDuration dd
+          _        -> Nothing
+      _ -> Nothing
+  }
+
+ruleNDOWago :: Rule
+ruleNDOWago = Rule
+  { name = "<integer> <named-day> ago|back"
+  , pattern =
+    [ regex "преди"
+    , Predicate isNatural
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:Token Time td:_) ->
+        tt $ predNth (- (floor v)) False td
+      _ -> Nothing
+  }
+
+ruleDurationHenceAgo :: Rule
+ruleDurationHenceAgo = Rule
+  { name = "<duration> hence|ago"
+  , pattern =
+    [ regex "(от|преди)"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):Token Duration dd:_) ->
+        case Text.toLower match of
+          "от" -> tt $ durationAgo dd
+          _     -> tt $ inDuration dd
+      _ -> Nothing
+  }
+
+ruleInNumeral :: Rule
+ruleInNumeral = Rule
+  { name = "in <number> (implicit minutes)"
+  , pattern =
+    [ regex "след"
+    , Predicate $ isIntegerBetween 0 60
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        tt . inDuration . duration TG.Minute $ floor v
+      _ -> Nothing
+  }
+
+ruleIntervalForDurationFrom :: Rule
+ruleIntervalForDurationFrom = Rule
+  { name = "for <duration> from <time>"
+  , pattern =
+    [ regex "за"
+    , dimension Duration
+    , regex "от|след"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Duration dd:_:Token Time td1:_) ->
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
+      _ -> Nothing
+}
+
+ruleIntervalTimeForDuration :: Rule
+ruleIntervalTimeForDuration = Rule
+  { name = "<time> for <duration>"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "за"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Duration dd:_) ->
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
+      _ -> Nothing
+}
+
+ruleIntervalFromTimeForDuration :: Rule
+ruleIntervalFromTimeForDuration = Rule
+  { name = "from <time> for <duration>"
+  , pattern =
+    [ regex "от|след"
+    , Predicate isNotLatent
+    , regex "за"
+    , dimension Duration
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Duration dd:_) ->
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
+      _ -> Nothing
+}
+
+timezoneName :: String
+timezoneName = "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"
+
+ruleTimezone :: Rule
+ruleTimezone = Rule
+  { name = "<time> timezone"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay, hasNoTimezone]
+    , regex $ "\\b(" ++ timezoneName ++ ")\\b"
+    ]
+  , prod = \case
+      (Token Time td:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> Token Time <$> inTimezone (Text.toUpper tz) td
+      _ -> Nothing
+  }
+
+ruleTimezoneBracket :: Rule
+ruleTimezoneBracket = Rule
+  { name = "<time> (timezone)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay, hasNoTimezone]
+    , regex $ "\\((" ++ timezoneName ++ ")\\)"
+    ]
+  , prod = \case
+      (Token Time td:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> Token Time <$> inTimezone (Text.toUpper tz) td
+      _ -> Nothing
+  }
+
+ruleIntervalDashTimezone :: Rule
+ruleIntervalDashTimezone = Rule
+  { name = "<datetime> - <datetime> (interval) timezone"
+  , pattern =
+    [ Predicate $ and . sequence [isATimeOfDay, hasNoTimezone]
+    , regex "\\-|до"
+    , Predicate $ and . sequence [isATimeOfDay, hasNoTimezone]
+    , regex $ "\\b(" ++ timezoneName ++ ")\\b"
+    ]
+  , prod = \case
+      (Token Time td1:
+       _:
+       Token Time td2:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> do
+        tdz1 <- inTimezone (Text.toUpper tz) td1
+        tdz2 <- inTimezone (Text.toUpper tz) td2
+        Token Time <$> interval TTime.Closed tdz1 tdz2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntersect
+  , ruleIntersectOf
+  , ruleIntersectYear
+  , ruleAbsorbOnDay
+  , ruleAbsorbInMonthYear
+  , ruleAbsorbCommaTOD
+  , ruleAbsorbOnADOW
+  , ruleNextDOW
+  , ruleNextTime
+  , ruleThisTime
+  , ruleLastTime
+  , ruleTimeBeforeLast
+  , ruleTimeAfterNext
+  , ruleLastDOWOfTime
+  , ruleLastCycleOfTime
+  , ruleLastNight
+  , ruleLastWeekendOfMonth
+  , ruleNthTimeOfTime
+  , ruleNthTimeAfterTime
+  , ruleNDOWFromTime
+  , ruleYearLatent
+  , ruleYearADBC
+  , ruleTheDOMNumeral
+  , ruleTheDOMOrdinal
+  , ruleDOMLatent
+  , ruleNamedDOMOrdinal
+  , ruleMonthDOMNumeral
+  , ruleDOMMonth
+  , ruleDOMOrdinalMonthYear
+  , ruleDOMMonthYear
+  , ruleIdesOfMonth
+  , ruleTODLatent
+  , ruleAtTOD
+  , ruleTODOClock
+  , ruleTODAM
+  , ruleTODPM
+  , ruleHHMM
+  , ruleHHhMM
+  , ruleHHMMLatent
+  , ruleHHMMSS
+  , ruleHONumeral
+  , ruleHODHalf
+  , ruleHODQuarter
+  , ruleNumeralToHOD
+  , ruleQuarterToHOD
+  , ruleNumeralAfterHOD
+  , ruleYYYYQQ
+  , ruleYYYYMM
+  , ruleYYYYMMDD
+  , ruleDDMMYYYYDot
+  , ruleMMYYYY
+  , ruleNoonMidnightEOD
+  , rulePartOfDays
+  , ruleEarlyMorning
+  , rulePODThis
+  , ruleTonight
+  , ruleAfterPartofday
+  , ruleTimePOD
+  , rulePODofTime
+  , ruleWeekend
+  , ruleWeek
+  , ruleTODPrecision
+  , rulePrecisionTOD
+  , ruleIntervalFromDDDDMonth
+  , ruleIntervalMonthDDDD
+  , ruleIntervalDDDDMonth
+  , ruleIntervalDash
+  , ruleIntervalSlash
+  , ruleIntervalFrom
+  , ruleIntervalBetween
+  , ruleIntervalTODDash
+  , ruleIntervalTODBetween
+  , ruleIntervalBy
+  , ruleIntervalByTheEndOf
+  , ruleIntervalUntilTime
+  , ruleIntervalAfterFromSinceTime
+  , ruleCycleThisLastNext
+  , ruleCycleAfterBeforeTime
+  , ruleDayInDuration
+  , ruleDurationInWithinAfter
+  , ruleNDOWago
+  , ruleDurationHenceAgo
+  , ruleIntervalForDurationFrom
+  , ruleIntervalFromTimeForDuration
+  , ruleIntervalTimeForDuration
+  , ruleInNumeral
+  , ruleTimezone
+  , ruleTimezoneBracket
+  , ruleIntervalDashTimezone
+  , rulePartOfMonth
+  , ruleEndOrBeginningOfMonth
+  , ruleEndOrBeginningOfYear
+  , ruleEndOrBeginningOfWeek
+  , ruleNow
+  , ruleSeason
+  , ruleEndOfMonth
+  , ruleBeginningOfMonth
+  , ruleEndOfYear
+  , ruleBeginningOfYear
+  , ruleMonthYear
+  ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
+  ++ ruleSeasons
+  ++ ruleComputedHolidays
+  ++ ruleComputedHolidays'
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/Computed.hs b/Duckling/Time/Computed.hs
--- a/Duckling/Time/Computed.hs
+++ b/Duckling/Time/Computed.hs
@@ -2,34 +2,26 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Time.Computed
   ( chanukah, chineseNewYear, dhanteras, easterSunday, eidalAdha, eidalFitr
-  , globalYouthServiceDay, lagBaOmer, mawlid, muharram, navaratri
-  , orthodoxEaster, passover, rajab, rakshaBandhan, ramadan, roshHashana
-  , thaiPongal, thiruOnam, tishaBAv, tuBishvat, vasantPanchami, vesak
-  , yomHaatzmaut
+  , globalYouthServiceDay, guruGobindSinghJayanti, karvaChauth
+  , krishnaJanmashtami, lagBaOmer, mawlid, muharram, navaratri, orthodoxEaster
+  , passover, rajab, rakshaBandhan, mahavirJayanti, mahaShivaRatri
+  , ramadan, rathaYatra, roshHashana, thaiPongal, thiruOnam, superTuesday
+  , tishaBAv, tuBishvat, vasantPanchami, vesak
+  , yomHaatzmaut, vaisakhi, purim, saraswatiJayanti, rabindraJayanti
+  , ravidassJayanti, pargatDiwas, ugadi, ganeshChaturthi, ramaNavami
   ) where
 
 import Data.Maybe
 import Prelude
-import qualified Data.Time as Time
 
-import Duckling.Time.Helpers (timeComputed)
+import Duckling.Time.Helpers (timeComputed, toTimeObjectM)
 import Duckling.Time.Types (TimeData(..), TimeObject(..), timedata')
 import qualified Duckling.TimeGrain.Types as TG
 
-toTimeObjectM :: (Integer, Int, Int) -> Maybe TimeObject
-toTimeObjectM (year, month, day) = do
-  day <- Time.fromGregorianValid year month day
-  return TimeObject
-    { start = Time.UTCTime day 0
-    , grain = TG.Day
-    , end = Nothing
-    }
-
 computedDays :: [TimeObject] -> TimeData
 computedDays xs = timedata'
   { timePred = timeComputed xs
@@ -1013,7 +1005,58 @@
 
 eidalAdha' :: [TimeObject]
 eidalAdha' = mapMaybe toTimeObjectM
-  [ (2000, 3, 16)
+  [ (1950, 9, 23)
+  , (1951, 9, 12)
+  , (1952, 8, 31)
+  , (1953, 8, 20)
+  , (1954, 8, 9)
+  , (1955, 7, 30)
+  , (1956, 7, 19)
+  , (1957, 7, 8)
+  , (1958, 6, 27)
+  , (1959, 6, 17)
+  , (1960, 6, 4)
+  , (1961, 5, 25)
+  , (1962, 5, 14)
+  , (1963, 5, 3)
+  , (1964, 4, 22)
+  , (1965, 4, 11)
+  , (1966, 4, 1)
+  , (1967, 3, 21)
+  , (1968, 3, 9)
+  , (1969, 2, 27)
+  , (1970, 2, 16)
+  , (1971, 2, 6)
+  , (1972, 1, 26)
+  , (1973, 1, 14)
+  , (1974, 1, 3)
+  , (1974, 12, 24)
+  , (1975, 12, 13)
+  , (1976, 12, 1)
+  , (1977, 11, 21)
+  , (1978, 11, 10)
+  , (1979, 10, 31)
+  , (1980, 10, 19)
+  , (1981, 10, 8)
+  , (1982, 9, 27)
+  , (1983, 9, 17)
+  , (1984, 9, 5)
+  , (1985, 8, 26)
+  , (1986, 8, 15)
+  , (1987, 8, 4)
+  , (1988, 7, 23)
+  , (1989, 7, 13)
+  , (1990, 7, 2)
+  , (1991, 6, 22)
+  , (1992, 6, 11)
+  , (1993, 5, 31)
+  , (1994, 5, 20)
+  , (1995, 5, 9)
+  , (1996, 4, 27)
+  , (1997, 4, 17)
+  , (1998, 4, 7)
+  , (1999, 3, 27)
+  , (2000, 3, 16)
   , (2001, 3, 5)
   , (2002, 2, 22)
   , (2003, 2, 11)
@@ -1050,7 +1093,58 @@
 
 eidalFitr' :: [TimeObject]
 eidalFitr' = mapMaybe toTimeObjectM
-  [ (2000, 1, 8)
+  [ (1950, 7, 16)
+  , (1951, 7, 6)
+  , (1952, 6, 23)
+  , (1953, 6, 13)
+  , (1954, 6, 2)
+  , (1955, 5, 23)
+  , (1956, 5, 11)
+  , (1957, 5, 1)
+  , (1958, 4, 20)
+  , (1959, 4, 10)
+  , (1960, 3, 28)
+  , (1961, 3, 18)
+  , (1962, 3, 7)
+  , (1963, 2, 24)
+  , (1964, 2, 14)
+  , (1965, 2, 2)
+  , (1966, 1, 22)
+  , (1967, 1, 12)
+  , (1968, 1, 1)
+  , (1968, 12, 21)
+  , (1969, 12, 10)
+  , (1970, 11, 30)
+  , (1971, 11, 19)
+  , (1972, 11, 7)
+  , (1973, 10, 27)
+  , (1974, 10, 16)
+  , (1975, 10, 6)
+  , (1976, 9, 24)
+  , (1977, 9, 14)
+  , (1978, 9, 3)
+  , (1979, 8, 23)
+  , (1980, 8, 12)
+  , (1981, 8, 1)
+  , (1982, 7, 21)
+  , (1983, 7, 11)
+  , (1984, 6, 30)
+  , (1985, 6, 19)
+  , (1986, 6, 8)
+  , (1987, 5, 28)
+  , (1988, 5, 16)
+  , (1989, 5, 6)
+  , (1990, 4, 26)
+  , (1991, 4, 15)
+  , (1992, 4, 4)
+  , (1993, 3, 24)
+  , (1994, 3, 13)
+  , (1995, 3, 2)
+  , (1996, 2, 19)
+  , (1997, 2, 8)
+  , (1998, 1, 29)
+  , (1999, 1, 18)
+  , (2000, 1, 8)
   , (2000, 12, 27)
   , (2001, 12, 16)
   , (2002, 12, 5)
@@ -1081,6 +1175,28 @@
   , (2027, 3, 9)
   , (2028, 2, 26)
   , (2029, 2, 14)
+  , (2030, 2, 05)
+  , (2031, 1, 25)
+  , (2032, 1, 14)
+  , (2033, 1, 3)
+  , (2033, 12, 23)
+  , (2034, 12, 12)
+  , (2035, 12, 2)
+  , (2036, 11, 20)
+  , (2037, 11, 10)
+  , (2038, 10, 30)
+  , (2039, 10, 19)
+  , (2040, 10, 8)
+  , (2041, 9, 27)
+  , (2042, 9, 16)
+  , (2043, 9, 6)
+  , (2044, 8, 25)
+  , (2045, 8, 15)
+  , (2046, 8, 4)
+  , (2047, 7, 24)
+  , (2048, 7, 13)
+  , (2049, 7, 2)
+  , (2050, 6, 21)
   ]
 
 rajab :: TimeData
@@ -1164,7 +1280,58 @@
 
 ramadan' :: [TimeObject]
 ramadan' = mapMaybe toTimeObjectM
-  [ (1999, 12, 9)
+  [ (1950, 6, 17)
+  , (1951, 6, 6)
+  , (1952, 5, 25)
+  , (1953, 5, 14)
+  , (1954, 5, 4)
+  , (1955, 4, 24)
+  , (1956, 4, 12)
+  , (1957, 4, 1)
+  , (1958, 3, 21)
+  , (1959, 3, 11)
+  , (1960, 2, 28)
+  , (1961, 2, 16)
+  , (1962, 2, 5)
+  , (1963, 1, 26)
+  , (1964, 1, 15)
+  , (1965, 1, 3)
+  , (1965, 12, 23)
+  , (1966, 12, 13)
+  , (1967, 12, 2)
+  , (1968, 11, 21)
+  , (1969, 11, 10)
+  , (1970, 11, 1)
+  , (1971, 10, 20)
+  , (1972, 10, 8)
+  , (1973, 9, 27)
+  , (1974, 9, 17)
+  , (1975, 9, 6)
+  , (1976, 8, 26)
+  , (1977, 8, 15)
+  , (1978, 8, 5)
+  , (1979, 7, 25)
+  , (1980, 7, 13)
+  , (1981, 7, 2)
+  , (1982, 6, 22)
+  , (1983, 6, 12)
+  , (1984, 5, 31)
+  , (1985, 5, 20)
+  , (1986, 5, 9)
+  , (1987, 4, 29)
+  , (1988, 4, 17)
+  , (1989, 4, 7)
+  , (1990, 3, 27)
+  , (1991, 3, 17)
+  , (1992, 3, 5)
+  , (1993, 2, 22)
+  , (1994, 2, 11)
+  , (1995, 1, 31)
+  , (1996, 1, 21)
+  , (1997, 1, 10)
+  , (1997, 12, 30)
+  , (1998, 12, 19)
+  , (1999, 12, 9)
   , (2000, 11, 27)
   , (2001, 11, 16)
   , (2002, 11, 6)
@@ -1195,6 +1362,28 @@
   , (2027, 2, 8)
   , (2028, 1, 28)
   , (2029, 1, 16)
+  , (2030, 1, 6)
+  , (2030, 12, 26)
+  , (2031, 12, 15)
+  , (2032, 12, 4)
+  , (2033, 11, 23)
+  , (2034, 11, 12)
+  , (2035, 11, 2)
+  , (2036, 10, 21)
+  , (2037, 10, 11)
+  , (2038, 9, 30)
+  , (2039, 9, 19)
+  , (2040, 9, 8)
+  , (2041, 8, 28)
+  , (2042, 8, 17)
+  , (2043, 8, 7)
+  , (2044, 7, 26)
+  , (2045, 7, 16)
+  , (2046, 7, 5)
+  , (2047, 6, 24)
+  , (2048, 6, 13)
+  , (2049, 6, 2)
+  , (2050, 5, 22)
   ]
 
 mawlid :: TimeData
@@ -1202,7 +1391,58 @@
 
 mawlid' :: [TimeObject]
 mawlid' = mapMaybe toTimeObjectM
-  [ (1999, 6, 26)
+  [ (1950, 1, 1)
+  , (1950, 12, 22)
+  , (1951, 12, 11)
+  , (1952, 11, 30)
+  , (1953, 11, 19)
+  , (1954, 11, 8)
+  , (1955, 10, 29)
+  , (1956, 10, 17)
+  , (1957, 10, 6)
+  , (1958, 9, 26)
+  , (1959, 9, 15)
+  , (1960, 9, 3)
+  , (1961, 8, 23)
+  , (1962, 8, 12)
+  , (1963, 8, 2)
+  , (1964, 7, 21)
+  , (1965, 7, 10)
+  , (1966, 7, 1)
+  , (1967, 6, 19)
+  , (1968, 6, 8)
+  , (1969, 5, 28)
+  , (1970, 5, 18)
+  , (1971, 5, 7)
+  , (1972, 4, 25)
+  , (1973, 4, 15)
+  , (1974, 4, 4)
+  , (1975, 3, 24)
+  , (1976, 3, 12)
+  , (1977, 3, 2)
+  , (1978, 2, 19)
+  , (1979, 2, 9)
+  , (1980, 1, 30)
+  , (1981, 1, 18)
+  , (1982, 1, 7)
+  , (1982, 12, 27)
+  , (1983, 12, 16)
+  , (1984, 12, 4)
+  , (1985, 11, 24)
+  , (1986, 11, 14)
+  , (1987, 11, 3)
+  , (1988, 10, 22)
+  , (1989, 10, 11)
+  , (1990, 10, 1)
+  , (1991, 9, 20)
+  , (1992, 9, 9)
+  , (1993, 8, 29)
+  , (1994, 8, 19)
+  , (1995, 8, 8)
+  , (1996, 7, 27)
+  , (1997, 7, 16)
+  , (1998, 7, 6)
+  , (1999, 6, 26)
   , (2000, 6, 14)
   , (2001, 6, 4)
   , (2002, 5, 24)
@@ -1457,6 +1697,82 @@
   , (2030, 8, 13)
   ]
 
+ganeshChaturthi :: TimeData
+ganeshChaturthi = computedDays ganeshChaturthi'
+
+ganeshChaturthi' :: [TimeObject]
+ganeshChaturthi' = mapMaybe toTimeObjectM
+  [ (2000, 9, 1)
+  , (2001, 8, 22)
+  , (2002, 9, 10)
+  , (2003, 8, 31)
+  , (2004, 9, 18)
+  , (2005, 9, 7)
+  , (2006, 8, 27)
+  , (2007, 9, 15)
+  , (2008, 9, 3)
+  , (2009, 8, 23)
+  , (2010, 9, 11)
+  , (2011, 9, 1)
+  , (2012, 9, 19)
+  , (2013, 9, 9)
+  , (2014, 8, 29)
+  , (2015, 9, 17)
+  , (2016, 9, 5)
+  , (2017, 8, 25)
+  , (2018, 9, 13)
+  , (2019, 9, 2)
+  , (2020, 8, 22)
+  , (2021, 9, 9)
+  , (2022, 8, 30)
+  , (2023, 9, 18)
+  , (2024, 9, 6)
+  , (2025, 8, 26)
+  , (2026, 9, 14)
+  , (2027, 9, 3)
+  , (2028, 8, 23)
+  , (2029, 9, 11)
+  , (2030, 9, 1)
+  ]
+
+mahavirJayanti :: TimeData
+mahavirJayanti = computedDays mahavirJayanti'
+
+mahavirJayanti' :: [TimeObject]
+mahavirJayanti' = mapMaybe toTimeObjectM
+  [ (2000, 4, 16)
+  , (2001, 4, 6)
+  , (2002, 4, 25)
+  , (2003, 4, 15)
+  , (2004, 4, 3)
+  , (2005, 4, 22)
+  , (2006, 4, 11)
+  , (2007, 3, 31)
+  , (2008, 4, 18)
+  , (2009, 4, 7)
+  , (2010, 3, 28)
+  , (2011, 4, 16)
+  , (2012, 4, 5)
+  , (2013, 4, 24)
+  , (2014, 4, 13)
+  , (2015, 4, 2)
+  , (2016, 4, 19)
+  , (2017, 4, 9)
+  , (2018, 3, 29)
+  , (2019, 4, 17)
+  , (2020, 4, 6)
+  , (2021, 4, 25)
+  , (2022, 4, 14)
+  , (2023, 4, 4)
+  , (2024, 4, 21)
+  , (2025, 4, 10)
+  , (2026, 3, 31)
+  , (2027, 4, 19)
+  , (2028, 4, 7)
+  , (2029, 4, 26)
+  , (2030, 4, 16)
+  ]
+
 thaiPongal :: TimeData
 thaiPongal = computedDays thaiPongal'
 
@@ -1495,6 +1811,44 @@
   , (2030, 1, 14)
   ]
 
+mahaShivaRatri :: TimeData
+mahaShivaRatri = computedDays mahaShivaRatri'
+
+mahaShivaRatri' :: [TimeObject]
+mahaShivaRatri' = mapMaybe toTimeObjectM
+   [  (2000, 3, 4)
+   ,  (2001, 2, 21)
+   ,  (2002, 3, 12)
+   ,  (2003, 3, 1)
+   ,  (2004, 2, 18)
+   ,  (2005, 3, 8)
+   ,  (2006, 2, 26)
+   ,  (2007, 2, 16)
+   ,  (2008, 3, 6)
+   ,  (2009, 2, 23)
+   ,  (2010, 2, 12)
+   ,  (2011, 3, 2)
+   ,  (2012, 2, 20)
+   ,  (2013, 3, 10)
+   ,  (2014, 2, 27)
+   ,  (2015, 2, 17)
+   ,  (2016, 3, 7)
+   ,  (2017, 2, 24)
+   ,  (2018, 2, 13)
+   ,  (2019, 3, 4)
+   ,  (2020, 2, 21)
+   ,  (2021, 3, 11)
+   ,  (2022, 3, 1)
+   ,  (2023, 2, 18)
+   ,  (2024, 3, 8)
+   ,  (2025, 2, 26)
+   ,  (2026, 2, 15)
+   ,  (2027, 3, 6)
+   ,  (2028, 2, 23)
+   ,  (2029, 2, 11)
+   ,  (2030, 3, 2)
+   ]
+
 thiruOnam :: TimeData
 thiruOnam = computedDays thiruOnam'
 
@@ -1533,6 +1887,44 @@
   , (2030, 9, 9)
   ]
 
+rathaYatra :: TimeData
+rathaYatra = computedDays rathaYatra'
+
+rathaYatra' :: [TimeObject]
+rathaYatra' = mapMaybe toTimeObjectM
+  [ (2000, 7, 2)
+  , (2001, 6, 22)
+  , (2002, 7, 11)
+  , (2003, 7, 1)
+  , (2004, 6, 19)
+  , (2005, 7, 8)
+  , (2006, 6, 27)
+  , (2007, 7, 16)
+  , (2008, 7, 4)
+  , (2009, 6, 24)
+  , (2010, 7, 13)
+  , (2011, 7, 3)
+  , (2012, 6, 21)
+  , (2013, 7, 10)
+  , (2014, 6, 29)
+  , (2015, 7, 18)
+  , (2016, 7, 6)
+  , (2017, 6, 25)
+  , (2018, 7, 14)
+  , (2019, 7, 4)
+  , (2020, 6, 23)
+  , (2021, 7, 11)
+  , (2022, 6, 30)
+  , (2023, 6, 19)
+  , (2024, 7, 7)
+  , (2025, 6, 26)
+  , (2026, 7, 15)
+  , (2027, 7, 5)
+  , (2028, 6, 24)
+  , (2029, 7, 13)
+  , (2030, 7, 2)
+  ]
+
 vasantPanchami :: TimeData
 vasantPanchami = computedDays vasantPanchami'
 
@@ -1585,6 +1977,120 @@
   , (2018, 4, 20)
   ]
 
+guruGobindSinghJayanti :: TimeData
+guruGobindSinghJayanti = computedDays guruGobindSinghJayanti'
+
+guruGobindSinghJayanti' :: [TimeObject]
+guruGobindSinghJayanti' = mapMaybe toTimeObjectM
+  [ (2000, 1, 14)
+  , (2001, 1, 2)
+  , (2002, 1, 21)
+  , (2003, 12, 29)
+  , (2004, 1, 5)
+  , (2005, 1, 16)
+  , (2006, 12, 27)
+  , (2007, 1, 5)
+  , (2008, 1, 14)
+  , (2009, 12, 23)
+  , (2010, 1, 5)
+  , (2011, 1, 5)
+  , (2012, 1, 5)
+  , (2013, 1, 18)
+  , (2014, 1, 7)
+  , (2015, 1, 5)
+  , (2016, 1, 16)
+  , (2017, 12, 25)
+  , (2018, 1, 5)
+  , (2019, 1, 13)
+  , (2020, 2, 1)
+  , (2021, 1, 19)
+  , (2022, 1, 8)
+  , (2023, 1, 5)
+  , (2024, 1, 17)
+  , (2025, 1, 5)
+  , (2026, 1, 5)
+  , (2027, 1, 14)
+  , (2028, 1, 3)
+  , (2029, 1, 5)
+  , (2030, 1, 10)
+  ]
+
+karvaChauth :: TimeData
+karvaChauth = computedDays karvaChauth'
+
+karvaChauth' :: [TimeObject]
+karvaChauth' = mapMaybe toTimeObjectM
+    [ (2000, 10, 16)
+    , (2001, 10, 4)
+    , (2002, 10, 24)
+    , (2003, 10, 13)
+    , (2004, 10, 31)
+    , (2005, 10, 20)
+    , (2006, 10, 9)
+    , (2007, 10, 28)
+    , (2008, 10, 17)
+    , (2009, 10, 7)
+    , (2010, 10, 26)
+    , (2011, 10, 15)
+    , (2012, 10, 2)
+    , (2013, 10, 22)
+    , (2014, 10, 11)
+    , (2015, 10, 30)
+    , (2016, 10, 18)
+    , (2017, 10, 8)
+    , (2018, 10, 27)
+    , (2019, 10, 17)
+    , (2020, 10, 3)
+    , (2021, 10, 23)
+    , (2022, 10, 12)
+    , (2023, 10, 31)
+    , (2024, 10, 20)
+    , (2025, 10, 9)
+    , (2026, 10, 28)
+    , (2027, 10, 18)
+    , (2028, 10, 6)
+    , (2029, 10, 25)
+    , (2030, 10, 14)
+    ]
+
+krishnaJanmashtami :: TimeData
+krishnaJanmashtami = computedDays krishnaJanmashtami'
+
+krishnaJanmashtami' :: [TimeObject]
+krishnaJanmashtami' = mapMaybe toTimeObjectM
+    [ (2000, 8, 22)
+    , (2001, 8, 12)
+    , (2002, 8, 31)
+    , (2003, 8, 20)
+    , (2004, 9, 6)
+    , (2005, 8, 26)
+    , (2006, 8, 15)
+    , (2007, 9, 3)
+    , (2008, 8, 23)
+    , (2009, 8, 13)
+    , (2010, 9, 1)
+    , (2011, 8, 21)
+    , (2012, 8, 9)
+    , (2013, 8, 28)
+    , (2014, 8, 17)
+    , (2015, 9, 5)
+    , (2016, 8, 25)
+    , (2017, 8, 14)
+    , (2018, 9, 3)
+    , (2019, 8, 23)
+    , (2020, 8, 11)
+    , (2021, 8, 30)
+    , (2022, 8, 19)
+    , (2023, 9, 6)
+    , (2024, 8, 26)
+    , (2025, 8, 16)
+    , (2026, 9, 4)
+    , (2027, 8, 25)
+    , (2028, 8, 13)
+    , (2029, 9, 1)
+    , (2030, 8, 21)
+    ]
+
 vesak :: TimeData
 vesak = computedDays vesak'
 
@@ -1621,4 +2127,395 @@
   , (2028, 5, 8)
   , (2029, 5, 27)
   , (2030, 5, 17)
+  ]
+
+vaisakhi :: TimeData
+vaisakhi = computedDays vaisakhi'
+
+vaisakhi' :: [TimeObject]
+vaisakhi' = mapMaybe toTimeObjectM
+  [ (2000, 4, 13)
+  , (2001, 4, 13)
+  , (2002, 4, 14)
+  , (2003, 4, 14)
+  , (2004, 4, 13)
+  , (2005, 4, 13)
+  , (2006, 4, 14)
+  , (2007, 4, 14)
+  , (2008, 4, 13)
+  , (2009, 4, 14)
+  , (2010, 4, 14)
+  , (2011, 4, 14)
+  , (2012, 4, 13)
+  , (2013, 4, 14)
+  , (2014, 4, 14)
+  , (2015, 4, 14)
+  , (2016, 4, 13)
+  , (2017, 4, 14)
+  , (2018, 4, 14)
+  , (2019, 4, 14)
+  , (2020, 4, 13)
+  , (2021, 4, 14)
+  , (2022, 4, 14)
+  , (2023, 4, 14)
+  , (2024, 4, 13)
+  , (2025, 4, 14)
+  , (2026, 4, 14)
+  , (2027, 4, 14)
+  , (2028, 4, 13)
+  , (2029, 4, 14)
+  , (2030, 4, 14)
+  ]
+
+purim :: TimeData
+purim = computedDays purim'
+
+purim' :: [TimeObject]
+purim' = mapMaybe toTimeObjectM
+  [ (1950, 3, 2)
+  , (1951, 3, 21)
+  , (1952, 3, 10)
+  , (1953, 2, 28)
+  , (1954, 3, 18)
+  , (1955, 3, 7)
+  , (1956, 2, 25)
+  , (1957, 3, 16)
+  , (1958, 3, 5)
+  , (1959, 3, 23)
+  , (1960, 3, 12)
+  , (1961, 3, 1)
+  , (1962, 3, 19)
+  , (1963, 3, 9)
+  , (1964, 2, 26)
+  , (1965, 3, 17)
+  , (1966, 3, 5)
+  , (1967, 3, 25)
+  , (1968, 3, 13)
+  , (1969, 3, 3)
+  , (1970, 3, 21)
+  , (1971, 3, 10)
+  , (1972, 2, 28)
+  , (1973, 3, 17)
+  , (1974, 3, 7)
+  , (1975, 2, 24)
+  , (1976, 3, 15)
+  , (1977, 3, 3)
+  , (1978, 3, 22)
+  , (1979, 3, 12)
+  , (1980, 3, 1)
+  , (1981, 3, 19)
+  , (1982, 3, 8)
+  , (1983, 2, 26)
+  , (1984, 3, 17)
+  , (1985, 3, 6)
+  , (1986, 3, 24)
+  , (1987, 3, 14)
+  , (1988, 3, 2)
+  , (1989, 3, 20)
+  , (1990, 3, 10)
+  , (1991, 2, 27)
+  , (1992, 3, 18)
+  , (1993, 3, 6)
+  , (1994, 2, 24)
+  , (1995, 3, 15)
+  , (1996, 3, 4)
+  , (1997, 3, 22)
+  , (1998, 3, 11)
+  , (1999, 3, 1)
+  , (2000, 3, 20)
+  , (2001, 3, 8)
+  , (2002, 2, 27)
+  , (2003, 3, 19)
+  , (2004, 3, 6)
+  , (2005, 3, 24)
+  , (2006, 3, 13)
+  , (2007, 3, 3)
+  , (2008, 3, 20)
+  , (2009, 3, 9)
+  , (2010, 2, 27)
+  , (2011, 3, 19)
+  , (2012, 3, 7)
+  , (2013, 2, 23)
+  , (2014, 3, 15)
+  , (2015, 3, 4)
+  , (2016, 3, 23)
+  , (2017, 3, 11)
+  , (2018, 2, 28)
+  , (2019, 3, 20)
+  , (2020, 3, 9)
+  , (2021, 2, 25)
+  , (2022, 3, 16)
+  , (2023, 3, 6)
+  , (2024, 3, 23)
+  , (2025, 3, 13)
+  , (2026, 3, 2)
+  , (2027, 3, 22)
+  , (2028, 3, 11)
+  , (2029, 2, 28)
+  , (2030, 3, 18)
+  , (2031, 3, 8)
+  , (2032, 2, 25)
+  , (2033, 3, 14)
+  , (2034, 3, 4)
+  , (2035, 3, 24)
+  , (2036, 3, 12)
+  , (2037, 2, 28)
+  , (2038, 3, 20)
+  , (2039, 3, 9)
+  , (2040, 2, 27)
+  , (2041, 3, 16)
+  , (2042, 3, 5)
+  , (2043, 3, 25)
+  , (2044, 3, 12)
+  , (2045, 3, 2)
+  , (2046, 3, 21)
+  , (2047, 3, 11)
+  , (2048, 2, 27)
+  , (2049, 3, 17)
+  , (2050, 3, 7)
+  ]
+
+saraswatiJayanti :: TimeData
+saraswatiJayanti = computedDays saraswatiJayanti'
+
+saraswatiJayanti' :: [TimeObject]
+saraswatiJayanti' = mapMaybe toTimeObjectM
+  [ (2000, 2, 29)
+  , (2001, 2, 17)
+  , (2002, 3, 8)
+  , (2003, 2, 26)
+  , (2004, 2, 15)
+  , (2005, 3, 5)
+  , (2006, 2, 23)
+  , (2007, 2, 12)
+  , (2008, 3, 2)
+  , (2009, 2, 19)
+  , (2010, 2, 8)
+  , (2011, 2, 27)
+  , (2012, 2, 16)
+  , (2013, 3, 7)
+  , (2014, 2, 24)
+  , (2015, 2, 14)
+  , (2016, 3, 4)
+  , (2017, 2, 21)
+  , (2018, 2, 10)
+  , (2019, 2, 28)
+  , (2020, 2, 18)
+  , (2021, 3, 8)
+  , (2022, 2, 26)
+  , (2023, 2, 15)
+  , (2024, 3, 5)
+  , (2025, 2, 23)
+  , (2026, 2, 12)
+  , (2027, 3 , 2)
+  , (2028, 2, 19)
+  , (2029, 2, 8)
+  , (2030, 2, 27)
+  ]
+
+rabindraJayanti :: TimeData
+rabindraJayanti = computedDays rabindraJayanti'
+
+rabindraJayanti' :: [TimeObject]
+rabindraJayanti' = mapMaybe toTimeObjectM
+  [ (2000, 5, 8)
+  , (2001, 5, 9)
+  , (2002, 5, 9)
+  , (2003, 5, 9)
+  , (2004, 5, 8)
+  , (2005, 5, 9)
+  , (2006, 5, 9)
+  , (2007, 5, 9)
+  , (2008, 5, 8)
+  , (2009, 5, 9)
+  , (2010, 5, 9)
+  , (2011, 5, 9)
+  , (2012, 5, 8)
+  , (2013, 5, 9)
+  , (2014, 5, 9)
+  , (2015, 5, 9)
+  , (2016, 5, 8)
+  , (2017, 5, 9)
+  , (2018, 5, 9)
+  , (2019, 5, 9)
+  , (2020, 5, 8)
+  , (2021, 5, 9)
+  , (2022, 5, 9)
+  , (2023, 5, 9)
+  , (2024, 5, 8)
+  , (2025, 5, 9)
+  , (2026, 5, 9)
+  , (2027, 5 ,9)
+  , (2028, 5, 9)
+  , (2029, 5, 9)
+  , (2030, 5, 9)
+  ]
+
+ravidassJayanti :: TimeData
+ravidassJayanti = computedDays ravidassJayanti'
+
+ravidassJayanti' :: [TimeObject]
+ravidassJayanti' = mapMaybe toTimeObjectM
+  [ (2000, 2, 19)
+  , (2001, 2, 8)
+  , (2002, 2, 27)
+  , (2003, 2, 16)
+  , (2004, 2, 6)
+  , (2005, 2, 24)
+  , (2006, 2, 13)
+  , (2007, 2, 2)
+  , (2008, 2, 21)
+  , (2009, 2, 9)
+  , (2010, 1, 30)
+  , (2011, 2, 18)
+  , (2012, 2, 7)
+  , (2013, 2, 25)
+  , (2014, 2, 14)
+  , (2015, 2, 3)
+  , (2016, 2, 22)
+  , (2017, 2, 10)
+  , (2018, 1, 31)
+  , (2019, 2, 19)
+  , (2020, 2, 9)
+  , (2021, 2, 27)
+  , (2022, 2, 16)
+  , (2023, 2, 5)
+  , (2024, 2, 24)
+  , (2025, 2, 12)
+  , (2026, 2, 1)
+  , (2027, 2 ,20)
+  , (2028, 2, 10)
+  , (2029, 1, 30)
+  , (2030, 2, 18)
+  ]
+
+pargatDiwas :: TimeData
+pargatDiwas = computedDays pargatDiwas'
+
+pargatDiwas' :: [TimeObject]
+pargatDiwas' = mapMaybe toTimeObjectM
+  [ (2000, 10, 12)
+  , (2001, 10, 31)
+  , (2002, 10, 20)
+  , (2003, 10, 9)
+  , (2004, 10, 27)
+  , (2005, 10, 16)
+  , (2006, 10, 6)
+  , (2007, 10, 25)
+  , (2008, 10, 14)
+  , (2009, 10, 3)
+  , (2010, 10, 22)
+  , (2011, 10, 11)
+  , (2012, 10, 29)
+  , (2013, 10, 18)
+  , (2014, 10, 7)
+  , (2015, 10, 26)
+  , (2016, 10, 15)
+  , (2017, 10, 5)
+  , (2018, 10, 24)
+  , (2019, 10, 13)
+  , (2020, 10, 30)
+  , (2021, 10, 19)
+  , (2022, 10, 9)
+  , (2023, 10, 28)
+  , (2024, 10, 16)
+  , (2025, 10, 6)
+  , (2026, 10, 25)
+  , (2027, 10, 14)
+  , (2028, 10, 2)
+  , (2029, 10, 21)
+  , (2030, 10, 10)
+  ]
+
+ugadi :: TimeData
+ugadi = computedDays ugadi'
+
+ugadi' :: [TimeObject]
+ugadi' = mapMaybe toTimeObjectM
+  [ (2000, 4, 5)
+  , (2001, 3, 26)
+  , (2002, 4, 13)
+  , (2003, 4, 2)
+  , (2004, 3, 21)
+  , (2005, 4, 9)
+  , (2006, 3, 30)
+  , (2007, 3, 19)
+  , (2008, 4, 6)
+  , (2009, 3, 27)
+  , (2010, 3, 16)
+  , (2011, 4, 4)
+  , (2012, 3, 23)
+  , (2013, 4, 11)
+  , (2014, 3, 31)
+  , (2015, 3, 21)
+  , (2016, 4, 8)
+  , (2017, 3, 28)
+  , (2018, 3, 18)
+  , (2019, 4, 6)
+  , (2020, 3, 25)
+  , (2021, 4, 13)
+  , (2022, 4, 2)
+  , (2023, 3, 22)
+  , (2024, 4, 9)
+  , (2025, 3, 30)
+  , (2026, 3, 19)
+  , (2027, 4, 7)
+  , (2028, 3, 27)
+  , (2029, 4, 14)
+  , (2030, 4, 3)
+  ]
+
+ramaNavami :: TimeData
+ramaNavami = computedDays ramaNavami'
+
+ramaNavami' :: [TimeObject]
+ramaNavami' = mapMaybe toTimeObjectM
+  [ (2000, 4, 12)
+  , (2001, 4, 2)
+  , (2002, 4, 21)
+  , (2003, 4, 11)
+  , (2004, 3, 30)
+  , (2005, 4, 18)
+  , (2006, 4, 6)
+  , (2007, 3, 27)
+  , (2008, 4, 14)
+  , (2009, 4, 3)
+  , (2010, 3, 24)
+  , (2011, 4, 12)
+  , (2012, 4, 1)
+  , (2013, 4, 19)
+  , (2014, 4, 8)
+  , (2015, 3, 28)
+  , (2016, 4, 15)
+  , (2017, 4, 5)
+  , (2018, 3, 25)
+  , (2019, 4, 14)
+  , (2020, 4, 2)
+  , (2021, 4, 21)
+  , (2022, 4, 10)
+  , (2023, 3, 30)
+  , (2024, 4, 17)
+  , (2025, 4, 6)
+  , (2026, 3, 27)
+  , (2027, 4, 15)
+  , (2028, 4, 4)
+  , (2029, 4, 23)
+  , (2030, 4, 12)
+  ]
+
+superTuesday :: TimeData
+superTuesday = computedDays superTuesday'
+
+superTuesday' :: [TimeObject]
+superTuesday' = mapMaybe toTimeObjectM
+  [ (1984, 3, 13)
+  , (1988, 3, 8)
+  , (1992, 3, 10)
+  , (1996, 3, 12)
+  , (2000, 3, 7)
+  , (2004, 3, 2)
+  , (2008, 2, 5)
+  , (2012, 3, 6)
+  , (2016, 3, 1)
+  , (2020, 3, 3)
   ]
diff --git a/Duckling/Time/Corpus.hs b/Duckling/Time/Corpus.hs
--- a/Duckling/Time/Corpus.hs
+++ b/Duckling/Time/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NamedFieldPuns #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -262,6 +261,7 @@
   , examples (datetime (2013, 2, 13, 3, 0, 0) Hour)
              [ "klokken 3"
              , "kl. 3"
+             , "kl 3"
              ]
   , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
              [ "3:18"
@@ -269,16 +269,19 @@
   , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
              [ "klokken 15"
              , "kl. 15"
+             , "kl 15"
              , "15h"
              ]
   , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
              [ "ca. kl. 15"
              , "cirka kl. 15"
+             , "cirka kl 15"
              , "omkring klokken 15"
              ]
   , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
              [ "imorgen klokken 17 sharp"
              , "imorgen kl. 17 præcis"
+             , "imorgen kl 17 præcis"
              ]
   , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
              [ "kvarter over 15"
@@ -289,6 +292,7 @@
              [ "kl. 20 over 15"
              , "klokken 20 over 15"
              , "kl. 15:20"
+             , "kl 15:20"
              , "15:20"
              ]
   , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
@@ -314,6 +318,7 @@
              ]
   , examples (datetime (2014, 9, 20, 19, 30, 0) Minute)
              [ "kl. 19:30, Lør, 20 sep"
+             , "kl 19:30, Lør, 20 sep"
              ]
   , examples (datetime (2013, 2, 12, 4, 30, 1) Second)
              [ "om 1 sekund"
@@ -552,16 +557,19 @@
   , examples (datetimeOpenInterval Before (2013, 2, 12, 14, 0, 0) Hour)
              [ "inden kl. 14"
              , "indtil kl. 14"
+             , "indtil kl 14"
              , "inden klokken 14"
              ]
   , examples (datetime (2013, 2, 12, 13, 0, 0) Minute)
              [ "@ 16 CET"
              , "kl. 16 CET"
+             , "kl 16 CET"
              , "klokken 16 CET"
              ]
   , examples (datetime (2013, 2, 14, 6, 0, 0) Minute)
              [ "torsdag kl. 8:00 GMT"
              , "torsdag kl. 8:00 gmt"
+             , "torsdag kl 8:00 gmt"
              , "torsdag klokken 8:00 GMT"
              , "torsdag klokken 8:00 gmt"
              , "torsdag 08:00 GMT"
@@ -569,23 +577,30 @@
              ]
   , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
              [ "idag kl. 14"
+             , "i dag kl. 14"
+             , "i dag kl. 14"
              , "idag klokken 14"
              , "kl. 14"
+             , "kl 14"
              , "klokken 14"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 kl. 16:00"
+             , "25/4 kl 16:00"
              , "25/4 klokken 16:00"
              , "25-04 klokken 16:00"
              , "25-4 kl. 16:00"
+             , "25-4 kl 16:00"
              ]
   , examples (datetime (2013, 2, 13, 15, 0, 0) Minute)
              [ "15:00 i morgen"
              , "kl. 15:00 i morgen"
+             , "kl 15:00 i morgen"
              , "klokken 15:00 i morgen"
              ]
   , examples (datetimeOpenInterval After (2013, 2, 12, 14, 0, 0) Hour)
              [ "efter kl. 14"
+             , "efter kl 14"
              , "efter klokken 14"
              ]
   , examples (datetimeOpenInterval After (2013, 2, 17, 4, 0, 0) Hour)
@@ -598,16 +613,20 @@
              ]
   , examples (datetimeOpenInterval After (2013, 2, 13, 14, 0, 0) Hour)
              [ "efter i morgen kl. 14"
+             , "efter i morgen kl 14"
              , "efter i morgen klokken 14"
              , "i morgen efter kl. 14"
+             , "i morgen efter kl 14"
              , "i morgen efter klokken 14"
              ]
   , examples (datetimeOpenInterval Before (2013, 2, 12, 11, 0, 0) Hour)
              [ "før kl. 11"
+             , "før kl 11"
              , "før klokken 11"
              ]
   , examples (datetimeOpenInterval Before (2013, 2, 13, 11, 0, 0) Hour)
              [ "i morgen før kl. 11"
+             , "i morgen før kl 11"
              , "i morgen før klokken 11"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
@@ -615,6 +634,7 @@
              ]
   , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
              [ "kl. 13:30"
+             , "kl 13:30"
              , "klokken 13:30"
              ]
   , examples (datetime (2013, 2, 12, 4, 45, 0) Second)
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -18,6 +17,7 @@
 import Prelude
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
 import Duckling.Time.Helpers
@@ -77,8 +77,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -90,9 +89,7 @@
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> do
-        t <- minutesBefore 15 td
-        Just $ Token Time t
+      (_:Token Time td:_) -> Token Time <$> minutesBefore 15 td
       _ -> Nothing
   }
 
@@ -104,9 +101,7 @@
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> do
-        t <- minutesBefore 30 td
-        Just $ Token Time t
+      (_:Token Time td:_) -> Token Time <$> minutesBefore 30 td
       _ -> Nothing
   }
 
@@ -260,7 +255,7 @@
   , pattern =
     [ regex "lige nu|nu|(i )?dette øjeblik"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleLastCycleOfTime :: Rule
@@ -456,7 +451,7 @@
   , pattern =
     [ regex "i dag|idag"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleThisnextDayofweek :: Rule
@@ -804,7 +799,7 @@
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "pr(æ)cis( kl\\.| klokken)?"
+    [ regex "pr(æ)cis( klokken| kl\\.?)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -895,8 +890,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -907,9 +901,8 @@
     [ regex "efter arbejde"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLastNCycle :: Rule
@@ -948,7 +941,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -990,7 +983,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "(omkring|cirka|ca\\.)( kl\\.| klokken)?"
+    [ regex "(omkring|cirka|ca\\.)( klokken| kl\\.?)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1014,7 +1007,7 @@
 ruleAtTimeofday = Rule
   { name = "at <time-of-day>"
   , pattern =
-    [ regex "klokken|kl\\.|@"
+    [ regex "klokken|kl\\.?|@"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1224,8 +1217,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1288,9 +1280,8 @@
     [ regex "efter (frokost|middag)"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleOnANamedday :: Rule
@@ -1437,9 +1428,8 @@
     [ regex "i aften"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleYear :: Rule
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -23,16 +22,20 @@
 import Duckling.Time.Types hiding (Month)
 import Duckling.TimeGrain.Types hiding (add)
 
+context :: Context
+context = testContext {locale = makeLocale DE Nothing}
+
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DE Nothing}, testOptions, allExamples)
+corpus = (context, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale DE Nothing}, testOptions, examples)
+negativeCorpus = (context, testOptions, examples)
   where
     examples =
       [ "ein Hotel"
       , "ein Angebot"
       , "nächsten 5"
+      , "so"
       ]
 
 allExamples :: [Example]
@@ -148,12 +151,18 @@
   , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
              [ "nächste woche"
              ]
+  , examples (datetime (2013, 2, 25, 0, 0, 0) Week)
+             [ "übernächste woche"
+             ]
   , examples (datetime (2013, 1, 0, 0, 0, 0) Month)
              [ "letzten monat"
              ]
   , examples (datetime (2013, 3, 0, 0, 0, 0) Month)
              [ "nächsten monat"
              ]
+  , examples (datetime (2013, 4, 0, 0, 0, 0) Month)
+             [ "übernächsten monat"
+             ]
   , examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
              [ "dieses quartal"
              ]
@@ -161,6 +170,9 @@
              [ "nächstes quartal"
              ]
   , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
+             [ "übernächstes quartal"
+             ]
+  , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
              [ "drittes quartal"
              ]
   , examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
@@ -175,6 +187,9 @@
   , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
              [ "nächstes jahr"
              ]
+  , examples (datetime (2015, 0, 0, 0, 0, 0) Year)
+             [ "übernächstes jahr"
+             ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
              [ "letzten sonntag"
              , "sonntag der letzten woche"
@@ -194,6 +209,14 @@
              , "mittwoch nächste woche"
              , "mittwoch nach dem nächsten"
              ]
+  , examples (datetime (2013, 2, 27, 0, 0, 0) Day)
+             [ "mittwoch in 2 wochen"
+             , "mittwoch in zwei wochen"
+             ]
+  , examples (datetime (2013, 1, 30, 0, 0, 0) Day)
+             [ "mittwoch vor 2 wochen"
+             , "mittwoch vor zwei wochen"
+             ]
   , examples (datetime (2013, 2, 22, 0, 0, 0) Day)
              [ "freitag nach dem nächsten"
              ]
@@ -267,11 +290,24 @@
              ]
   , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
              [ "zirka 15 uhr"
+             , "circa 15 uhr"
+             , "um circa 15 uhr"
              , "zirka 3 uhr am nachmittag"
              , "um ungefähr 15 uhr"
              , "gegen 15 uhr"
              , "ca. 15h"
+             , "ca. um 15 uhr"
              , "um ca 15h"
+             , "so gegen 15 uhr"
+             , "so um 15 uhr"
+             , "etwa um 15 uhr"
+             , "so ungefähr um 15 uhr"
+             , "etwa gegen 15 uhr"
+             , "gegen 15 uhr"
+             , "ungefähr um 15 uhr"
+             , "ungefähr gegen 15 uhr"
+             , "so circa um 15 uhr"
+             , "15 uhr in etwa"
              ]
   , examples (datetime (2013, 4, 1, 18, 0, 0) Hour)
              [ "01.04. gegen 18Uhr"
@@ -349,7 +385,7 @@
              , "in 30 minuten"
              ]
   , examples (datetime (2013, 2, 12, 7, 0, 0) Second)
-             [ "in 2.5 stunden"
+             [ "in 2,5 stunden"
              , "in zwei ein halb stunden"
              ]
   , examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
@@ -590,6 +626,7 @@
              ]
   , examples (datetime (2013, 2, 13, 15, 0, 0) Hour)
              [ "morgen um 15 Uhr"
+             , "morgen so um 15 Uhr"
              ]
   , examples (datetimeOpenInterval After (2013, 2, 12, 14, 0, 0) Hour)
              [ "nach 14 Uhr"
@@ -631,7 +668,7 @@
   , examples (datetime (2013, 12, 10, 0, 0, 0) Day)
              [ "10.12."
              ]
-  , examples (datetimeInterval ((2013, 2, 12, 18, 30, 0), (2013, 2, 12, 19, 1, 0)) Minute)
+  , examples (datetimeInterval ((2013, 2, 12, 18, 30, 0), (2013, 2, 12, 19, 1, 0)) Minute)
              [ "18:30h - 19:00h"
              , "18:30h/19:00h"
              ]
@@ -665,5 +702,460 @@
              ]
   , examples (datetime (2013, 2, 12, 17, 10, 0) Minute)
              [ "17h10"
+             ]
+  , examples (datetime (2018, 8, 31, 0, 0, 0) Day)
+             [ "2018-08-31"
+             , "2018-8-31"
+             ]
+  , examples (datetime (1980, 5, 30, 0, 0, 0) Day)
+             [ "30. Mai 1980"
+             ]
+  , examples (datetime (2013, 2, 9, 0, 0, 0) Day)
+             [ "vorvorgestern"
+             ]
+  , examples (datetime (2013, 12, 5, 0, 0, 0) Day)
+             [ "fünfter Dezember"
+             ]
+  , examples (datetime (2013, 12, 30, 0, 0, 0) Day)
+             [ "dreißigster Dezember"
+             , "dreissigster Dezember"
+             ]
+  , examples (datetime (2013, 12, 4, 0, 0, 0) Day)
+             [ "am vierten Dezember"
+             , "der vierte Dezember"
+             ]
+  , examples (datetimeHoliday (2014, 1, 31, 0, 0, 0) Day "Chinesisches Neujahr")
+             [ "Chinesisches Neujahr"
+             , "Chinesisches Frühlingsfest"
+             , "Chinesisches Neujahrsfest"
+             ]
+  , examples (datetimeHoliday (2018, 2, 16, 0, 0, 0) Day "Chinesisches Neujahr")
+             [ "Chinesisches Neujahr 2018"
+             ]
+  , examples (datetimeHoliday (2018, 9, 18, 0, 0, 0) Day "Jom Kippur")
+             [ "Jom Kippur 2018"
+             , "Yom Kippur 2018"
+             ]
+  , examples (datetimeHoliday (2018, 9, 30, 0, 0, 0) Day "Schmini Azeret")
+             [ "Schmini Azeret 2018"
+             , "Schemini Azeret 2018"
+             , "Shemini Atzeret 2018"
+             ]
+  , examples (datetimeHoliday (2018, 10, 1, 0, 0, 0) Day "Simchat Torah")
+             [ "simchat torah 2018"
+             ]
+  , examples (datetimeHoliday (2018, 7, 21, 0, 0, 0) Day "Tisha B'Av")
+             [ "tisha b'av 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 18, 0, 0, 0) Day "Jom Ha'atzmaut")
+             [ "Jom Haatzmaut 2018"
+             , "Yom Haatzmaut 2018"
+             , "Yom Ha'atzmaut 2018"
+             ]
+  , examples (datetimeHoliday (2017, 5, 13, 0, 0, 0) Day "Lag BaOmer")
+             [ "Lag BaOmer 2017"
+             , "Lag LaOmer 2017"
+             ]
+  , examples (datetimeHoliday (2018, 4, 11, 0, 0, 0) Day "Jom HaShoah")
+             [ "Jom HaShoah 2018"
+             , "Yom HaShoah 2018"
+             , "Holocaustgedenktag 2018"
+             , "Holocaust-Gedenktag 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 9, 9, 0, 0, 0), (2018, 9, 12, 0, 0, 0)) Day "Rosch haSchana")
+             [ "Rosch haSchana 2018"
+             , "Rosch ha-Schana 2018"
+             , "Rosch ha-Schanah 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 12, 2, 0, 0, 0), (2018, 12, 10, 0, 0, 0)) Day "Chanukka")
+             [ "Chanukka 2018"
+             , "Hanukkah 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 3, 30, 0, 0, 0), (2018, 4, 8, 0, 0, 0)) Day "Pessach")
+             [ "Passover 2018"
+             , "Pessach 2018"
+             , "Passa 2018"
+             , "Passah 2018"
+             , "Pascha 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 9, 23, 0, 0, 0), (2018, 10, 2, 0, 0, 0)) Day "Sukkot")
+             [ "Laubhüttenfest 2018"
+             , "Sukkot 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 5, 19, 0, 0, 0), (2018, 5, 22, 0, 0, 0)) Day "Schawuot")
+             [ "Shavuot 2018"
+             , "Schawuot 2018"
+             ]
+  , examples (datetimeHoliday (2017, 11, 30, 0, 0, 0) Day "Maulid an-Nabī")
+             [ "Mawlid al-Nabawi 2017"
+             , "Maulid an-Nabī 2017"
+             ]
+  , examples (datetimeHoliday (1950, 7, 16, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 1950"
+             ]
+  , examples (datetimeHoliday (1975, 10, 6, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 1975"
+             ]
+  , examples (datetimeHoliday (1988, 5, 16, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 1988"
+             ]
+  , examples (datetimeHoliday (2018, 6, 15, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2018"
+             ]
+  , examples (datetimeHoliday (2034, 12, 12, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2034"
+             ]
+  , examples (datetimeHoliday (2046, 8, 4, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2046"
+             ]
+  , examples (datetimeHoliday (2050, 6, 21, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2050"
+             ]
+  , examples (datetimeHoliday (2018, 8, 21, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 2018"
+             , "id ul-adha 2018"
+             , "Opferfest 2018"
+             , "Bakr Id 2018"
+             ]
+  , examples (datetimeHoliday (1980, 10, 19, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 1980"
+             , "id ul-adha 1980"
+             , "Opferfest 1980"
+             , "Bakr Id 1980"
+             ]
+  , examples (datetimeHoliday (1966, 4, 1, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 1966"
+             , "id ul-adha 1966"
+             , "Opferfest 1966"
+             , "Bakr Id 1966"
+             ]
+  , examples (datetimeHoliday (1974, 1, 3, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 1974"
+             , "id ul-adha 1974"
+             , "Opferfest 1974"
+             , "Bakr Id 1974"
+             ]
+  , examples (datetimeHoliday (2017, 6, 22, 0, 0, 0) Day "Lailat al-Qadr")
+             [ "laylat al kadr 2017"
+             , "die Nacht der Bestimmung 2017"
+             , "Laylat al-Qadr 2017"
+             , "Lailat al-Qadr 2017"
+             ]
+  , examples (datetimeHoliday (2018, 6, 11, 0, 0, 0) Day "Lailat al-Qadr")
+             [ "laylat al-qadr 2018"
+             , "die Nacht der Allmacht 2018"
+             , "Laylat al-Qadr 2018"
+             , "Lailat al-Qadr 2018"
+             ]
+  , examples (datetimeHoliday (2018, 9, 11, 0, 0, 0) Day "Islamisches Neujahr")
+             [ "Islamisches Neujahr 2018"
+             , "Amun Jadid 2018"
+             ]
+  , examples (datetimeHoliday (2017, 9, 30, 0, 0, 0) Day "Aschura")
+             [ "Aschura-Tag 2017"
+             , "Aschura 2017"
+             , "Ashura 2017"
+             ]
+  , examples (datetimeHoliday (2018, 1, 30, 0, 0, 0) Day "Tu biSchevat")
+             [ "Tu BiShvat 2018"
+             , "Tu biSchevat 2018"
+             ]
+  , examples (datetimeHoliday (2017, 6, 23, 0, 0, 0) Day "Jumu'atul-Wida")
+             [ "Jamat Ul-Vida 2017"
+             , "Jumu'atul-Wida 2017"
+             ]
+  , examples (datetimeHoliday (2018, 6, 8, 0, 0, 0) Day "Jumu'atul-Wida")
+             [ "Jamat Ul-Vida 2018"
+             , "Jumu'atul-Wida 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 13, 0, 0, 0) Day "Isra and Mi'raj")
+             [ "isra and mi'raj 2018"
+             , "Aufstieg des Propheten 2018"
+             ]
+  , examples (datetimeHoliday (2019, 4, 3, 0, 0, 0) Day "Isra and Mi'raj")
+             [ "Die Nachtreise 2019"
+             , "Aufstieg in den Himmel 2019"
+             ]
+  , examples (datetimeIntervalHoliday ((1950, 6, 17, 0, 0, 0), (1950, 7, 16, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 1950"
+             ]
+  , examples (datetimeIntervalHoliday ((1977, 8, 15, 0, 0, 0), (1977, 9, 14, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 1977"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 5, 16, 0, 0, 0), (2018, 6, 15, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2034, 11, 12, 0, 0, 0), (2034, 12, 12, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2034"
+             ]
+  , examples (datetimeIntervalHoliday ((2046, 7, 5, 0, 0, 0), (2046, 8, 4, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2046"
+             ]
+  , examples (datetimeIntervalHoliday ((2050, 5, 22, 0, 0, 0), (2050, 6, 21, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2050"
+             ]
+  , examples (datetimeHoliday (2017, 10, 17, 0, 0, 0) Day "Dhanteras")
+             [ "Dhanatrayodashi 2017"
+             ]
+  , examples (datetimeHoliday (2019, 10, 25, 0, 0, 0) Day "Dhanteras")
+             [ "Dhanteras 2019"
+             ]
+  , examples (datetimeHoliday (2019, 10, 26, 0, 0, 0) Day "Naraka Chaturdashi")
+             [ "kali chaudas 2019"
+             , "choti diwali 2019"
+             ]
+  , examples (datetimeHoliday (2019, 10, 27, 0, 0, 0) Day "Diwali")
+             [ "diwali 2019"
+             , "Deepavali 2019"
+             , "Lakshmi Puja 2019"
+             ]
+  , examples (datetimeHoliday (2019, 10, 29, 0, 0, 0) Day "Bhai Dooj")
+             [ "bhai dooj 2019"
+             ]
+  , examples (datetimeHoliday (2019, 11, 2, 0, 0, 0) Day "Chhath")
+             [ "chhath 2019"
+             , "dala puja 2019"
+             , "Surya Shashthi 2019"
+             ]
+  , examples (datetimeHoliday (2021, 10, 14, 0, 0, 0) Day "Maha Navami")
+             [ "Maha Navami 2021"
+             ]
+  , examples (datetimeHoliday (2021, 10, 12, 0, 0, 0) Day "Maha Saptami")
+             [ "Maha Saptami 2021"
+             ]
+  , examples (datetimeHoliday (2018, 10, 18, 0, 0, 0) Day "Vijayadashami")
+             [ "Dussehra 2018"
+             , "vijayadashami 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 10, 9, 0, 0, 0), (2018, 10, 19, 0, 0, 0)) Day "Navaratri")
+             [ "navaratri 2018"
+             , "durga puja 2018"
+             ]
+  , examples (datetimeHoliday (2018, 10, 27, 0, 0, 0) Day "Karva Chauth")
+             [ "karva chauth 2018"
+             , "karva chauth 2018"
+             ]
+  , examples (datetimeHoliday (2018, 8, 26, 0, 0, 0) Day "Raksha Bandhan")
+             [ "rakhi 2018"
+             ]
+  , examples (datetimeHoliday (2020, 4, 6, 0, 0, 0) Day "Mahavir Jayanti")
+             [ "mahavir jayanti 2020"
+             , "mahaveer janma kalyanak 2020"
+             ]
+  , examples (datetimeHoliday (2020, 2, 21, 0, 0, 0) Day "Maha Shivaratri")
+             [ "maha shivaratri 2020"
+             ]
+  , examples (datetimeHoliday (2018, 2, 10, 0, 0, 0) Day "Dayananda Saraswati Jayanti")
+             [ "saraswati jayanti 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 14, 0, 0, 0) Day "Thai Pongal")
+             [ "pongal 2018"
+             , "makara sankranthi 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 13, 0, 0, 0) Day "Boghi")
+             [ "bogi pandigai 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 15, 0, 0, 0) Day "Mattu Pongal")
+             [ "maattu pongal 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 16, 0, 0, 0) Day "Kaanum Pongal")
+             [ "kaanum pongal 2018"
+             , "kanni pongal 2018"
+             ]
+  , examples (datetimeHoliday (2019, 1, 15, 0, 0, 0) Day "Thai Pongal")
+             [ "makar sankranti 2019"
+             , "maghi 2019"
+             ]
+  , examples (datetimeHoliday (2018, 4, 14, 0, 0, 0) Day "Vaisakhi")
+             [ "Vaisakhi 2018"
+             , "baisakhi 2018"
+             , "Vasakhi 2018"
+             , "vaishakhi 2018"
+             ]
+  , examples (datetimeHoliday (2018, 8, 24, 0, 0, 0) Day "Thiru Onam")
+             [ "onam 2018"
+             , "Thiru Onam 2018"
+             , "Thiruvonam 2018"
+             ]
+  , examples (datetimeHoliday (2019, 2, 10, 0, 0, 0) Day "Vasant Panchami")
+             [ "vasant panchami 2019"
+             , "basant panchami 2019"
+             ]
+  , examples (datetimeHoliday (2019, 3, 20, 0, 0, 0) Day "Holika Dahan")
+             [ "chhoti holi 2019"
+             , "holika dahan 2019"
+             , "kamudu pyre 2019"
+             ]
+  , examples (datetimeHoliday (2019, 8, 23, 0, 0, 0) Day "Krishna Janmashtami")
+             [ "krishna janmashtami 2019"
+             , "gokulashtami 2019"
+             ]
+  , examples (datetimeHoliday (2019, 3, 21, 0, 0, 0) Day "Holi")
+             [ "holi 2019"
+             , "dhulandi 2019"
+             , "phagwah 2019"
+             ]
+  , examples (datetimeHoliday (2018, 8, 17, 0, 0, 0) Day "Parsi Neujahr")
+             [ "Parsi Neujahr 2018"
+             , "Jamshedi Navroz 2018"
+             ]
+  , examples (datetimeHoliday (2022, 8, 16, 0, 0, 0) Day "Parsi Neujahr")
+             [ "jamshedi Navroz 2022"
+             , "Parsi Neujahr 2022"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 4, 26, 0, 0, 0), (2013, 4, 29, 0, 0, 0)) Day "Global Youth Service-Tag")
+             [ "GYSD 2013"
+             , "Global Youth Service-Tag"
+             ]
+  , examples (datetimeHoliday (2013, 5, 24, 0, 0, 0) Day "Vesak")
+             [ "vesak"
+             , "vaisakha"
+             , "Buddha-Tag"
+             , "Buddha Purnima"
+             , "Wesakfest"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 3, 23, 20, 30, 0), (2013, 3, 23, 21, 31, 0)) Minute "Earth Hour")
+             [ "Earth Hour"
+             , "Stunde der Erde"
+             ]
+  , examples (datetimeIntervalHoliday ((2016, 3, 19, 20, 30, 0), (2016, 3, 19, 21, 31, 0)) Minute "Earth Hour")
+             [ "Earth Hour 2016"
+             , "Stunde der Erde 2016"
+             ]
+  , examples (datetimeHoliday (2013, 2, 23, 0, 0, 0) Day "Purim")
+             [ "purim"
+             ]
+  , examples (datetimeHoliday (2013, 2, 24, 0, 0, 0) Day "Shushan Purim")
+             [ "Shushan Purim"
+             ]
+  , examples (datetimeHoliday (2014, 1, 7, 0, 0, 0) Day "Guru Gobind Singh Jayanti")
+             [ "Guru Gobind Singh Geburtstag"
+             , "Guru Gobind Singh Jayanti 2014"
+             , "Guru Govind Singh Jayanti"
+             ]
+  , examples (datetimeHoliday (2018, 4, 27, 0, 0, 0) Day "Königstag")
+             [ "Koningsdag 2018"
+             , "königstag 2018"
+             ]
+  , examples (datetimeHoliday (2014, 4, 26, 0, 0, 0) Day "Königstag")
+             [ "Koningsdag 2014"
+             ]
+  , examples (datetimeHoliday (2018, 5, 9, 0, 0, 0) Day "Rabindra Jayanti")
+             [ "Rabindra Jayanti 2018"
+             , "Rabindranath Jayanti 2018"
+             ]
+  , examples (datetimeHoliday (2019, 5, 9, 0, 0, 0) Day "Rabindra Jayanti")
+             [ "Rabindra Jayanti 2019"
+             , "Rabindranath Jayanti 2019"
+             ]
+  , examples (datetimeHoliday (2018, 1, 31, 0, 0, 0) Day "Guru Ravidass Jayanti")
+             [ "Guru Ravidas Jayanti 2018"
+             , "Guru Ravidass Geburtstag 2018"
+             , "Guru Ravidass Jayanti 2018"
+             ]
+  , examples (datetimeHoliday (2019, 2, 19, 0, 0, 0) Day "Guru Ravidass Jayanti")
+             [ "Guru Ravidass Jayanti 2019"
+             , "Guru Ravidas Geburtstag 2019"
+             ]
+  , examples (datetimeHoliday (2019, 10, 13, 0, 0, 0) Day "Pargat Diwas")
+             [ "Valmiki Jayanti 2019"
+             , "Pargat Diwas 2019"
+             ]
+  , examples (datetimeHoliday (2018, 10, 24, 0, 0, 0) Day "Pargat Diwas")
+             [ "Maharishi Valmiki Jayanti 2018"
+             , "Pargat Diwas 2018"
+             ]
+  , examples (datetimeHoliday (2018, 5, 10, 0, 0, 0) Day "Christi Himmelfahrt")
+             [ "Christi Himmelfahrt 2018"
+             , "Himmelfahrt 2018"
+             , "Himmelfahrtstag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 2, 14, 0, 0, 0) Day "Aschermittwoch")
+             [ "Aschermittwoch 2018"
+             , "Aschertag 2018"
+             , "Aschetag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 2, 19, 0, 0, 0) Day "Aschermontag")
+             [ "Aschermontag 2018"
+             , "Reiner Montag 2018"
+             , "Sauberer Montag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 5, 31, 0, 0, 0) Day "Corpus Christi")
+             [ "Corpus Christi 2018"
+             , "Fronleichnam 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 2, 0, 0, 0) Day "Ostermontag")
+             [ "Ostermontag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 1, 0, 0, 0) Day "Ostersonntag")
+             [ "Ostersonntag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 11, 8, 0, 0, 0) Day "Govardhan Puja")
+             [ "Govardhan Puja 2018"
+             , "Annakut 2018"
+             ]
+  , examples (datetimeHoliday (2018, 3, 30, 0, 0, 0) Day "Karfreitag")
+             [ "Karfreitag 2018"
+             , "Stiller Freitag 2018"
+             , "Hoher Freitag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 3, 31, 0, 0, 0) Day "Karsamstag")
+             [ "Karsamstag 2018"
+             , "Stiller Samstag 2018"
+             , "Karsonnabend 2018"
+             ]
+  , examples (datetimeHoliday (2018, 3, 31, 0, 0, 0) Day "Lazarus-Samstag")
+             [ "Lazarus-Samstag 2018"
+             , "Lazarus Samstag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 3, 29, 0, 0, 0) Day "Gründonnerstag")
+             [ "Gründonnerstag 2018"
+             , "Hoher Donnerstag 2018"
+             , "Heiliger Donnerstag 2018"
+             , "Weißer Donnerstag 2018"
+             , "Palmdonnerstag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 9, 0, 0, 0) Day "Orthodoxer Ostermontag")
+             [ "Orthodoxer Ostermontag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 8, 0, 0, 0) Day "Orthodoxer Ostersonntag")
+             [ "Orthodoxer Ostersonntag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 7, 0, 0, 0) Day "Orthodoxer Karsamstag")
+             [ "Orthodoxer Karsamstag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 6, 0, 0, 0) Day "Orthodoxer Karfreitag")
+             [ "Orthodoxer Karfreitag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 1, 0, 0, 0) Day "Orthodoxer Palmsonntag")
+             [ "Orthodoxer Palmsonntag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 3, 25, 0, 0, 0) Day "Palmsonntag")
+             [ "Palmsonntag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 5, 20, 0, 0, 0) Day "Pfingsten")
+             [ "Pfingsten 2018"
+             , "pentecost 2018"
+             ]
+  , examples (datetimeHoliday (2018, 2, 13, 0, 0, 0) Day "Fastnacht")
+             [ "Fastnacht 2018"
+             , "mardi gras 2018"
+             , "Fastnachtsdienstag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 5, 27, 0, 0, 0) Day "Dreifaltigkeitssonntag")
+             [ "Dreifaltigkeitssonntag 2018"
+             , "Dreifaltigkeitsfest 2018"
+             , "Trinitatis 2018"
+             , "Goldener Sonntag 2018"
+             ]
+  , examples (datetimeHoliday (2018, 5, 21, 0, 0, 0) Day "Pfingstmontag")
+             [ "Pfingstmontag 2018"
+             , "Pentecost Montag 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 2, 19, 0, 0, 0), (2018, 3, 31, 0, 0, 0)) Day "Große Fastenzeit")
+             [ "Große Fastenzeit 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 2, 14, 0, 0, 0), (2018, 4, 1, 0, 0, 0)) Day "Fastenzeit")
+             [ "Fastenzeit 2018"
              ]
   ]
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
@@ -2,27 +2,30 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.DE.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Prelude
-import Data.Text (Text)
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Ordinal.Types (OrdinalData (..))
-import Duckling.Regex.Types
+import Duckling.Ordinal.Types (OrdinalData(..))
+import Duckling.Regex.Types (GroupMatch(..))
+import Duckling.Time.Computed
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.HolidayHelpers
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
@@ -38,6 +41,7 @@
   , ( "yesterday"       , TG.Day   , -1, "gestern" )
   , ( "after tomorrow"  , TG.Day   ,  2, "(ü)bermorgen" )
   , ( "before yesterday", TG.Day   , -2, "vorgestern" )
+  , ( "3 days ago"      , TG.Day   , -3, "vorvorgestern" )
   , ( "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)?)" )
@@ -51,7 +55,7 @@
   , ( "Donnerstag", "donn?erstag|do\\.?"           )
   , ( "Freitag"   , "freitags?|fr\\.?"             )
   , ( "Samstag"   , "samstags?|sonnabends?|sa\\.?" )
-  , ( "Sonntag"   , "sonntags?|so\\.?"             )
+  , ( "Sonntag"   , "sonntags?|so\\."             )
   ]
 
 ruleMonths :: [Rule]
@@ -110,6 +114,190 @@
     , nthDOWOfMonth 3 7 6 )
   ]
 
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Christi Himmelfahrt", "(christi\\s+)?himmelfahrt(stag)?"
+    , cycleNthAfter False TG.Day 39 easterSunday )
+  , ( "Aschermittwoch", "ascher?(tag|mittwoch)"
+    , cycleNthAfter False TG.Day (-46) easterSunday )
+  , ( "Aschura", "asc?hura(\\-?tag)?"
+    , cycleNthAfter False TG.Day 9 muharram )
+  , ( "Bhai Dooj", "bhai(ya)?\\s+d(u|oo)j|bhau\\-beej|bhai\\s+(tika|phonta)"
+    , cycleNthAfter False TG.Day 4 dhanteras )
+  , ( "Chhath", "chhathi?|chhath (parv|puja)|dala (chhath|puja)|surya shashthi"
+    , cycleNthAfter False TG.Day 8 dhanteras )
+  , ( "Boghi", "boghi|bogi\\s+pandigai"
+    , cycleNthAfter False TG.Day (-1) thaiPongal )
+  , ( "Chinesisches Neujahr", "chinesische(s|r)\\s+(neujahr(s(tag|fest))?|frühlingsfest)"
+    , chineseNewYear )
+  , ( "Aschermontag"
+    , "(orthodoxer?\\s+)?(ascher|reiner?\\s+|sauberer?\\s+)montag"
+    , cycleNthAfter False TG.Day (-48) orthodoxEaster )
+  , ( "Corpus Christi", "corpus\\s+christi|fronleichnam"
+    , cycleNthAfter False TG.Day 60 easterSunday )
+  , ( "Dhanteras", "dhanatrayodashi|dhanteras|dhanvantari\\s+trayodashi"
+    , dhanteras )
+  , ( "Diwali", "deepavali|diwali|lakshmi\\s+puja"
+    , cycleNthAfter False TG.Day 2 dhanteras )
+  , ( "Durga Ashtami", "(durga|maha)(\\s+a)?shtami"
+    , cycleNthAfter False TG.Day 7 navaratri )
+  , ( "Ostermontag", "ostermontag"
+    , cycleNthAfter False TG.Day 1 easterSunday )
+  , ( "Ostersonntag", "ostersonntag", easterSunday )
+  , ( "Eid al-Adha", "bakr[\\-\\s]e?id|e?id [au]l\\-adha|opferfest"
+    , eidalAdha )
+  , ( "Eid al-Fitr", "eid al\\-fitr", eidalFitr )
+  , ( "Govardhan Puja", "govardhan\\s+puja|annak(u|oo)t"
+    , cycleNthAfter False TG.Day 3 dhanteras )
+  , ( "Karfreitag", "(kar|stiller\\s+|hoher\\s+)freitag"
+    , cycleNthAfter False TG.Day (-2) easterSunday )
+  , ( "Guru Gobind Singh Jayanti"
+    , "guru\\s+(gobind|govind)\\s+singh\\s+(Geburtstag|jayanti)"
+    , guruGobindSinghJayanti )
+  , ( "Holi", "(rangwali )?holi|dhuleti|dhulandi|phagwah"
+    , cycleNthAfter False TG.Day 39 vasantPanchami )
+  , ( "Holika Dahan", "holika dahan|kamudu pyre|chhoti holi"
+    , cycleNthAfter False TG.Day 38 vasantPanchami )
+  , ( "Karsamstag"
+    , "(kar|stiller\\s+)samstag|karsonnabend"
+    , cycleNthAfter False TG.Day (-1) easterSunday )
+  , ( "Islamisches Neujahr", "(arabisches|hijri|islamisches) neujahr|amun jadid|muharram"
+    , muharram )
+  , ( "Isra and Mi'raj"
+    , "isra and mi'raj|aufstieg des propheten|(die\\s+)?nachtreise|aufstieg\\s+in\\s+den\\s+himmel"
+    , cycleNthAfter False TG.Day 26 rajab
+    )
+  , ( "Jumu'atul-Wida", "jumu'atul\\-widaa?'?|jamat[\\-\\s]ul[\\-\\s]vida"
+    , predNthAfter (-1) (dayOfWeek 5) eidalFitr )
+  , ( "Kaanum Pongal", "(kaanum|kanni)\\s+pongal"
+    , cycleNthAfter False TG.Day 2 thaiPongal )
+  , ( "Lag BaOmer", "lag (b|l)[a']omer", lagBaOmer )
+  , ( "Vaisakhi", "mesadi|[bv]aisakhi|vaisakhadi|vasakhi|vaishakhi", vaisakhi)
+  , ( "Lailat al-Qadr"
+    , "la[iy]lat al[\\-\\s][qk]adr|(die)? nacht der (bestimmung|allmacht)"
+    , cycleNthAfter False TG.Day 26 ramadan )
+  , ( "Lazarus-Samstag", "lazarus(\\-|\\s+)samstag"
+    , cycleNthAfter False TG.Day (-8) orthodoxEaster )
+  , ( "Maha Navami", "maha\\s+navami", cycleNthAfter False TG.Day 8 navaratri )
+  , ( "Maha Saptami", "maha\\s+saptami", cycleNthAfter False TG.Day 6 navaratri )
+  , ( "Mattu Pongal", "maa?ttu\\s+pongal"
+    , cycleNthAfter False TG.Day 1 thaiPongal )
+  , ( "Gründonnerstag"
+    , "(grün|hoher\\s+|heiliger\\s+|weißer\\s+|palm)donnerstag"
+    , cycleNthAfter False TG.Day (-3) easterSunday )
+  , ( "Maulid an-Nabī"
+    , "Maulid\\s+an\\-Nabī|mawlid(\\s+al\\-nab(awi|i\\s+al\\-sharif))?|mevli[dt]|mulud|geburtstag des propheten( muhammad)?"
+    , mawlid )
+  , ( "Naraka Chaturdashi"
+    , "naraka? (nivaran )?chaturdashi|(kali|roop) chaudas|choti diwali"
+    , cycleNthAfter False TG.Day 1 dhanteras )
+  , ( "Orthodoxer Ostermontag", "orthodoxer\\s+ostermontag"
+    , cycleNthAfter False TG.Day 1 orthodoxEaster )
+  , ( "Orthodoxer Ostersonntag", "orthodoxer\\s+ostersonntag"
+    , orthodoxEaster )
+  , ( "Orthodoxer Karsamstag", "orthodoxer\\s+karsamstag"
+    , cycleNthAfter False TG.Day (-1) orthodoxEaster )
+  , ( "Orthodoxer Karfreitag", "orthodoxer\\s+karfreitag"
+    , cycleNthAfter False TG.Day (-2) orthodoxEaster )
+  , ( "Orthodoxer Palmsonntag", "orthodoxer\\s+palmsonntag"
+    , cycleNthAfter False TG.Day (-7) orthodoxEaster )
+  , ( "Palmsonntag", "palmsonntag"
+    , cycleNthAfter False TG.Day (-7) easterSunday )
+  , ( "Pfingsten", "pfingsten|pentecost"
+    , cycleNthAfter False TG.Day 49 easterSunday )
+  , ( "Purim", "purim", purim )
+  , ( "Raksha Bandhan", "raksha(\\s+)?bandhan|rakhi", rakshaBandhan )
+  , ( "Pargat Diwas", "pargat diwas|(maharishi )?valmiki jayanti", pargatDiwas )
+  , ( "Mahavir Jayanti", "(mahavir|mahaveer) (jayanti|janma kalyanak)"
+    , mahavirJayanti )
+  , ( "Maha Shivaratri", "maha(\\s+)?shivaratri", mahaShivaRatri)
+  , ( "Dayananda Saraswati Jayanti","((maharishi|swami) )?(dayananda )?saraswati jayanti", saraswatiJayanti )
+  , ( "Karva Chauth", "karva\\s+chauth|karaka\\s+chaturthi", karvaChauth)
+  , ( "Krishna Janmashtami", "(krishna )?janmashtami|gokulashtami", krishnaJanmashtami )
+  , ( "Schmini Azeret", "sc?he?mini\\s+at?zeret"
+    , cycleNthAfter False TG.Day 21 roshHashana )
+  , ( "Fastnacht", "fastnacht(sdienstag)?|mardi gras"
+    , cycleNthAfter False TG.Day (-47) easterSunday )
+  , ( "Shushan Purim", "shushan\\s+purim", cycleNthAfter False TG.Day 1 purim )
+  , ( "Simchat Torah", "simc?hat\\s+torah"
+    , cycleNthAfter False TG.Day 22 roshHashana )
+  , ( "Thai Pongal"
+    , "(thai )?pongal|pongal pandigai|(makara? |magha )?sankranth?i|maghi"
+    , thaiPongal )
+  , ( "Thiru Onam", "(thiru(v|\\s+))?onam", thiruOnam )
+  , ( "Tisha B'Av", "tisha b'av", tishaBAv )
+  , ( "Dreifaltigkeitssonntag",
+      "trinitatis(fest)?|(dreifaltigkeits|goldener\\s+)sonntag|drei(faltigkeit|einigkeit)(sfest)?"
+    , cycleNthAfter False TG.Day 56 easterSunday )
+  , ( "Vasant Panchami", "[bv]asant\\s+panchami", vasantPanchami )
+  , ( "Vijayadashami", "dasara|duss(eh|he)ra|vijayadashami"
+    , cycleNthAfter False TG.Day 9 navaratri )
+  , ( "Tu biSchevat", "tu b[i']sc?he?vat", tuBishvat )
+  , ( "Vesak", "v(e|ai)sak(ha)?|buddha(\\-?tag|\\s+purnima)|wesakfest", vesak )
+  , ( "Jom Ha'atzmaut", "[yj]om ha'?atzmaut", yomHaatzmaut )
+  , ( "Jom HaShoah"
+    , "[yj]om hashoah|[yj]om hazikaron lashoah ve-lag'vurah|holocaust\\-?gedenktag"
+    , cycleNthAfter False TG.Day 12 passover )
+  , ( "Jom Kippur", "[yj]om\\s+kippur", cycleNthAfter False TG.Day 9 roshHashana )
+  , ( "Pfingstmontag", "pfingstmontag|(pentecost|whit)\\s+montag"
+    , cycleNthAfter False TG.Day 50 easterSunday )
+  , ( "Rabindra Jayanti", "rabindra(nath)?\\s+jayanti", rabindraJayanti )
+  , ("Guru Ravidass Jayanti", "guru\\s+ravidass?\\s+(geburtstag|jayanti)"
+    , ravidassJayanti )
+  ]
+
+ruleComputedHolidays' :: [Rule]
+ruleComputedHolidays' = mkRuleHolidays'
+  [ ( "Global Youth Service-Tag", "global youth service[\\-\\s]?tag|gysd"
+    , let start = globalYouthServiceDay
+          end = cycleNthAfter False TG.Day 2 globalYouthServiceDay
+        in interval TTime.Open start end )
+  , ( "Große Fastenzeit", "große\\s+fastenzeit"
+    , let start = cycleNthAfter False TG.Day (-48) orthodoxEaster
+          end = cycleNthAfter False TG.Day (-9) orthodoxEaster
+        in interval TTime.Open start end )
+  , ( "Chanukka", "c?hann?ukk?ah?"
+    , let start = chanukah
+          end = cycleNthAfter False TG.Day 7 chanukah
+        in interval TTime.Open start end )
+  , ( "Fastenzeit", "fastenzeit"
+    , let start = cycleNthAfter False TG.Day (-46) easterSunday
+          end = cycleNthAfter False TG.Day (-1) easterSunday
+        in interval TTime.Open start end )
+  , ( "Navaratri", "durga\\s+puja|durgotsava|nava?rath?ri"
+    , let start = navaratri
+          end = cycleNthAfter False TG.Day 9 navaratri
+        in interval TTime.Open start end )
+  , ( "Pessach", "passover|pess?a[ck]?h|pascha|Passah?"
+    , let start = passover
+          end = cycleNthAfter False TG.Day 8 passover
+        in interval TTime.Open start end )
+  , ( "Ramadan", "rama[dt]h?an|ramzaa?n"
+    , let start = ramadan
+          end = cycleNthAfter False TG.Day (-1) eidalFitr
+        in interval TTime.Open start end )
+  , ( "Rosch haSchana", "rosch ha\\-?schanah?"
+    , let start = roshHashana
+          end = cycleNthAfter False TG.Day 2 roshHashana
+        in interval TTime.Open start end )
+  , ( "Schawuot", "sc?ha[vw]u'?oth?|shovuos"
+    , let start = cycleNthAfter False TG.Day 50 passover
+          end = cycleNthAfter False TG.Day 52 passover
+        in interval TTime.Open start end )
+  , ( "Sukkot", "Laubhüttenfest|su[ck]{2}o[st]"
+    , let start = cycleNthAfter False TG.Day 14 roshHashana
+          end = cycleNthAfter False TG.Day 22 roshHashana
+        in interval TTime.Open start end )
+  -- Does not account for leap years, so every 365 days.
+  , ( "Parsi Neujahr", "parsi neujahr|jamshedi navroz"
+    , predEveryNDaysFrom 365 (2020, 8, 16)
+    )
+  , ( "Earth Hour", "earth hour|stunde der erde"
+    , computeEarthHour )
+  , ( "Königstag", "königstag|koningsdag"
+    , computeKingsDay )
+  ]
+
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
@@ -121,8 +309,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -134,9 +321,7 @@
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> do
-        t <- minutesBefore 15 td
-        Just $ Token Time t
+      (_:Token Time td:_) -> Token Time <$> minutesBefore 15 td
       _ -> Nothing
   }
 
@@ -148,9 +333,7 @@
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> do
-        t <- minutesBefore 30 td
-        Just $ Token Time t
+      (_:Token Time td:_) -> Token Time <$> minutesBefore 30 td
       _ -> Nothing
   }
 
@@ -524,12 +707,25 @@
       _ -> Nothing
   }
 
+ruleAfterNextCycle :: Rule
+ruleAfterNextCycle = Rule
+  { name = "after next <cycle>"
+  , pattern =
+    [ regex "(ü)ber ?n(ä)chste[ns]?"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 2
+      _ -> Nothing
+  }
+
 ruleTimeofdayApproximately :: Rule
 ruleTimeofdayApproximately = Rule
   { name = "<time-of-day> approximately"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(um )?zirka|ungef(ä)hr|etwa"
+    , regex "ca\\.?|circa|zirka|ungef(ä)hr|(in )?etwa"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -827,8 +1023,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Closed td (cycleNth TG.Second 0)
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed td now
       _ -> Nothing
   }
 
@@ -839,9 +1034,8 @@
     [ regex "nach (der)? arbeit|(am)? feier ?abend"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLastNCycle :: Rule
@@ -880,7 +1074,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -918,11 +1112,27 @@
       _ -> Nothing
   }
 
+
+ruleDayOfWeekIntersectDuration :: Rule
+ruleDayOfWeekIntersectDuration = Rule
+  { name = "<day-of-week> in <duration>"
+  , pattern =
+    [ Predicate isADayOfWeek
+    , regex "(in|vor)"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Time td:Token RegexMatch (GroupMatch (match:_)):Token Duration dd:_) ->
+        case Text.toLower match of
+          "vor" -> Token Time <$> intersect td (durationIntervalAgo dd)
+          _     -> Token Time <$> intersect td (inDurationInterval dd)
+      _ -> Nothing
+  }
 ruleAboutTimeofday :: Rule
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "(um )?zirka|ca\\.?|ungef(ä)hr|etwa|gegen"
+    [ regex "so( um)?|(so |um |so um )?circa|zirka|ca\\.?|ungef(ä)hr|(etwa|gegen)( so| um| so um)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1057,7 +1267,7 @@
 ruleYyyymmdd = Rule
   { name = "yyyy-mm-dd"
   , pattern =
-    [ regex "(\\d{2,4})-(0?[1-9]|10|11|12)-([012]?[1-9]|10|20|30|31)"
+    [ regex "(\\d{2,4})-(1[0-2]|0?[1-9])-(3[01]|[12]\\d|0?[1-9])"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
@@ -1147,8 +1357,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time . partOfDay <$>
-        intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1211,9 +1420,8 @@
     [ regex "nach dem mittagessen|nachmittags?"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleOnANamedday :: Rule
@@ -1299,9 +1507,7 @@
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> do
-        t <- minutesBefore 30 td
-        Just $ Token Time t
+      (_:Token Time td:_) -> Token Time <$> minutesBefore 30 td
       _ -> Nothing
   }
 
@@ -1369,9 +1575,8 @@
     [ regex "heute? (am)? abends?"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleYear :: Rule
@@ -1654,6 +1859,7 @@
   , ruleIntersect
   , ruleIntersectBy
   , ruleIntersectByOfFromS
+  , ruleDayOfWeekIntersectDuration
   , ruleLastCycle
   , ruleLastCycleOfTime
   , ruleLastDayofweekOfTime
@@ -1668,6 +1874,7 @@
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNextCycle
+  , ruleAfterNextCycle
   , ruleNextNCycle
   , ruleNextTime
   , ruleNight
@@ -1727,3 +1934,5 @@
   ++ ruleMonths
   ++ ruleSeasons
   ++ ruleHolidays
+  ++ ruleComputedHolidays
+  ++ ruleComputedHolidays'
diff --git a/Duckling/Time/EL/Corpus.hs b/Duckling/Time/EL/Corpus.hs
--- a/Duckling/Time/EL/Corpus.hs
+++ b/Duckling/Time/EL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -836,7 +835,7 @@
              , "από 3 μέχρι 4 το απόγευμα"
              , "περίπου 3-4 μμ"
              ]
-  , examples (datetimeInterval ((2013, 2, 12, 15, 30, 0), (2013, 2, 12, 19, 0, 0)) Minute)
+  , examples (datetimeInterval ((2013, 2, 12, 15, 30, 0), (2013, 2, 12, 18, 1, 0)) Minute)
              [ "3:30 μέχρι 6 μμ"
              , "3:30-6 μ.μ."
              ]
diff --git a/Duckling/Time/EL/Rules.hs b/Duckling/Time/EL/Rules.hs
--- a/Duckling/Time/EL/Rules.hs
+++ b/Duckling/Time/EL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,7 +10,8 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.EL.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.HashMap.Strict (HashMap)
 import Data.Text (Text)
@@ -20,14 +20,14 @@
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
-import Duckling.Duration.Helpers (duration)
-import Duckling.Duration.Types (DurationData (DurationData))
+import Duckling.Duration.Helpers (duration, isGrain)
+import Duckling.Duration.Types (DurationData(DurationData))
 import Duckling.Numeral.Helpers (parseInt, numeralMapEL)
-import Duckling.Numeral.Types (NumeralData (..))
-import Duckling.Ordinal.Types (OrdinalData (..), isBetween)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Ordinal.Types (OrdinalData(..), isBetween)
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -525,7 +525,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_:Token Time td1:_) ->
-        Just . Token Time $ durationAfter dd td1
+        tt $ durationAfter dd td1
       _ -> Nothing
 }
 
@@ -774,8 +774,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Closed td (cycleNth TG.Second 0)
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed td now
       _ -> Nothing
   }
 
@@ -786,9 +785,8 @@
     [ regex "μετά τη δουλειά"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLastNCycle :: Rule
@@ -815,7 +813,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -869,8 +867,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Open (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -882,8 +879,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -1132,8 +1128,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time . partOfDay <$>
-        intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1377,9 +1372,8 @@
     [ regex "απόψε"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleTomorrowNight :: Rule
diff --git a/Duckling/Time/EN/AU/Corpus.hs b/Duckling/Time/EN/AU/Corpus.hs
--- a/Duckling/Time/EN/AU/Corpus.hs
+++ b/Duckling/Time/EN/AU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/AU/Rules.hs b/Duckling/Time/EN/AU/Rules.hs
--- a/Duckling/Time/EN/AU/Rules.hs
+++ b/Duckling/Time/EN/AU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/BZ/Corpus.hs b/Duckling/Time/EN/BZ/Corpus.hs
--- a/Duckling/Time/EN/BZ/Corpus.hs
+++ b/Duckling/Time/EN/BZ/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/BZ/Rules.hs b/Duckling/Time/EN/BZ/Rules.hs
--- a/Duckling/Time/EN/BZ/Rules.hs
+++ b/Duckling/Time/EN/BZ/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/CA/Corpus.hs b/Duckling/Time/EN/CA/Corpus.hs
--- a/Duckling/Time/EN/CA/Corpus.hs
+++ b/Duckling/Time/EN/CA/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/CA/Rules.hs b/Duckling/Time/EN/CA/Rules.hs
--- a/Duckling/Time/EN/CA/Rules.hs
+++ b/Duckling/Time/EN/CA/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -13,15 +12,16 @@
   , defaultCorpus
   , negativeCorpus
   , latentCorpus
+  , diffCorpus
   ) where
 
 import Data.String
 import Prelude
 
-import Duckling.Resolve
+import Duckling.Core
 import Duckling.Testing.Types hiding (examples)
 import Duckling.Time.Corpus
-import Duckling.Time.Types hiding (Month)
+import Duckling.Time.Types hiding (Month, refTime)
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
@@ -43,9 +43,14 @@
                  , "10/31/74"
                  , "10-31-74"
                  , "10.31.1974"
+                 , "31/Oct/1974"
+                 , "31-Oct-74"
+                 , "31st Oct 1974"
                  ]
       , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
                  [ "4/25 at 4:00pm"
+                 , "4/25 at 16h00"
+                 , "4/25 at 16h"
                  ]
       , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
                  [ "thanksgiving day"
@@ -105,6 +110,8 @@
       , "4a"
       , "4a."
       , "A4 A5"
+      , "palm"
+      , "Martin Luther King' day"
       ]
 
 latentCorpus :: Corpus
@@ -122,14 +129,17 @@
       , examples (datetime (2013, 2, 12, 19, 0, 0) Hour)
                  [ "7p"
                  ]
-      --, examples (datetime (1954, 1, 1, 0, 0, 0) Year)
-      --           [ "1954"
-      --           ]
+      , examples (datetime (2013, 2, 12, 10, 30, 0) Minute)
+                 [ "ten thirty"
+                 ]
+      , examples (datetime (1974, 1, 1, 0, 0, 0) Year)
+                 [ "1974"
+                 ]
       , examples (datetime (2013, 5, 1, 0, 0, 0) Month)
                  [ "May"
                  ]
       , examples (datetimeInterval
-          ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
+          ((2013, 2, 12, 0, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
                  [ "morning"
                  ]
       , examples (datetimeInterval
@@ -144,20 +154,49 @@
           ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
                  [ "night"
                  ]
+      , examples (datetimeInterval ((2013, 2, 12, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day)
+                 [ "the week"
+                 ]
+      , examples (datetime (2013, 2, 12, 12, 3, 0) Minute)
+             [  "twelve zero three"
+             ,  "twelve o three"
+             ,  "twelve ou three"
+             ,  "twelve oh three"
+             ]
+      , examples (datetimeInterval ((1960, 1, 1, 0, 0, 0), (1962, 1, 1, 0, 0, 0)) Year)
+             [ "1960 - 1961"
+             ]
       ]
 
+diffContext :: Context
+diffContext = Context
+  { locale = makeLocale EN Nothing
+  , referenceTime = refTime (2013, 2, 15, 4, 30, 0) (-2)
+  }
+
+diffCorpus :: Corpus
+diffCorpus = (diffContext, testOptions, diffExamples)
+  where
+    diffExamples =
+      examples (datetime (2013, 3, 8, 0, 0, 0) Day)
+               [ "3 fridays from now"
+               , "three fridays from now"
+               ]
+
 allExamples :: [Example]
 allExamples = concat
   [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
              [ "now"
              , "right now"
              , "just now"
+             , "at the moment"
+             , "ATM"
              ]
   , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
              [ "today"
              , "at this time"
              ]
-  , examples (datetime (2013, 2, 1, 0, 0, 0) Day)
+  , examples (datetime (2013, 2, 1, 0, 0, 0) Month)
              [ "2/2013"
              ]
   , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
@@ -208,10 +247,17 @@
   , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
              [ "the 1st of march"
              , "first of march"
+             , "the first of march"
              , "march first"
              ]
+  , examples (datetime (2013, 3, 2, 0, 0, 0) Day)
+             [ "the 2nd of march"
+             , "second of march"
+             , "the second of march"
+             ]
   , examples (datetime (2013, 3, 3, 0, 0, 0) Day)
              [ "march 3"
+             , "the third of march"
              ]
   , examples (datetime (2013, 3, 15, 0, 0, 0) Day)
              [ "the ides of march"
@@ -247,6 +293,8 @@
              ]
   , examples (datetime (2014, 10, 1, 0, 0, 0) Month)
              [ "October 2014"
+             , "2014-10"
+             , "2014/10"
              ]
   , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
              [ "14april 2015"
@@ -275,7 +323,6 @@
   , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
              [ "this week"
              , "current week"
-             , "coming week"
              ]
   , examples (datetime (2013, 2, 4, 0, 0, 0) Week)
              [ "last week"
@@ -286,6 +333,8 @@
              [ "next week"
              , "the following week"
              , "around next week"
+             , "upcoming week"
+             , "coming week"
              ]
   , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
              [ "last month"
@@ -324,6 +373,8 @@
              [ "4th quarter 2018"
              , "4th qtr 2018"
              , "the 4th qtr of 2018"
+             , "18q4"
+             , "2018Q4"
              ]
   , examples (datetime (2012, 1, 1, 0, 0, 0) Year)
              [ "last year"
@@ -357,10 +408,7 @@
   , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
              [ "last tuesday"
              ]
-  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
-             [ "next tuesday"
-             ]
-  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
              [ "next wednesday"
              ]
   , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
@@ -452,10 +500,19 @@
              , "at 3 AM"
              , "3 oclock am"
              , "at three am"
+             , "this morning at 3"
+             , "3 in the morning"
+             , "at 3 in the morning"
+             , "early morning @ 3"
              ]
+  , examples (datetime (2013, 2, 12, 10, 0, 0) Hour)
+             [ "this morning @ 10"
+             , "this morning at 10am"
+             ]
   , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
              [ "3:18am"
              , "3:18a"
+             , "3h18"
              ]
   , examples (datetime (2016, 2, 1, 7, 0, 0) Hour)
              [ "at 7 in 3 years"
@@ -473,15 +530,25 @@
              , "at 3p"
              , "at 3p."
              ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Minute)
+             [ "15h00"
+             , "at 15h00"
+             , "15h"
+             , "at 15h"
+             ]
   , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
              [ "at 15 past 3pm"
              , "a quarter past 3pm"
+             , "for a quarter past 3pm"
              , "3:15 in the afternoon"
              , "15:15"
+             , "15h15"
              , "3:15pm"
              , "3:15PM"
              , "3:15p"
              , "at 3 15"
+             , "15 minutes past 3pm"
+             , "15 minutes past 15h"
              ]
   , examples (datetime (2013, 2, 12, 15, 20, 0) Minute)
              [ "at 20 past 3pm"
@@ -489,19 +556,38 @@
              , "3:20 in afternoon"
              , "twenty after 3pm"
              , "3:20p"
+             , "15h20"
              , "at three twenty"
+             , "20 minutes past 3pm"
+             , "this afternoon at 3:20"
+             , "tonight @ 3:20"
              ]
   , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
              [ "at half past three pm"
              , "half past 3 pm"
              , "15:30"
+             , "15h30"
              , "3:30pm"
              , "3:30PM"
              , "330 p.m."
              , "3:30 p m"
              , "3:30"
              , "half three"
+             , "30 minutes past 3 pm"
              ]
+   , examples (datetime (2013, 2, 12, 12, 15, 0) Minute)
+              [ "at 15 past noon"
+              , "a quarter past noon"
+              , "for a quarter past noon"
+              , "12:15 in the afternoon"
+              , "12:15"
+              , "12h15"
+              , "12:15pm"
+              , "12:15PM"
+              , "12:15p"
+              , "at 12 15"
+              , "15 minutes past noon"
+  ]
   , examples (datetime (2013, 2, 12, 9, 59, 0) Minute)
              [ "nine fifty nine a m"
              ]
@@ -511,10 +597,27 @@
   , examples (datetime (2013, 2, 12, 11, 45, 0) Minute)
              [ "a quarter to noon"
              , "11:45am"
+             , "11h45"
              , "15 to noon"
              ]
+  , examples (datetime (2013, 2, 12, 13, 15, 0) Minute)
+             [ "a quarter past 1pm"
+             , "for a quarter past 1pm"
+             , "1:15pm"
+             , "13h15"
+             , "15 minutes from 1pm"
+             ]
+  , examples (datetime (2013, 2, 12, 14, 15, 0) Minute)
+             [ "a quarter past 2pm"
+             , "for a quarter past 2pm"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 15, 0) Minute)
+             [ "a quarter past 8pm"
+             , "for a quarter past 8pm"
+             ]
   , examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
              [ "8 tonight"
+             , "tonight at 8 o'clock"
              , "eight tonight"
              , "8 this evening"
              , "at 8 in the evening"
@@ -522,15 +625,19 @@
              ]
   , examples (datetime (2013, 9, 20, 19, 30, 0) Minute)
              [ "at 7:30 PM on Fri, Sep 20"
+             , "at 19h30 on Fri, Sep 20"
              ]
   , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
              [ "at 9am on Saturday"
+             , "Saturday morning at 9"
              ]
   , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
              [ "on Saturday for 9am"
              ]
   , examples (datetime (2014, 7, 18, 19, 0, 0) Minute)
              [ "Fri, Jul 18, 2014 07:00 PM"
+             , "Fri, Jul 18, 2014 19h00"
+             , "Fri, Jul 18, 2014 19h"
              ]
   , examples (datetime (2013, 2, 12, 4, 30, 1) Second)
              [ "in a sec"
@@ -603,9 +710,27 @@
   , examples (datetime (2016, 2, 12, 0, 0, 0) Day)
              [ "3 years from today"
              ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "3 fridays from now"
+             , "three fridays from now"
+             ]
+  , examples (datetime (2013, 2, 24, 0, 0, 0) Day)
+             [ "2 sundays from now"
+             , "two sundays from now"
+             ]
+  , examples (datetime (2013, 3, 12, 0, 0, 0) Day)
+             [ "4 tuesdays from now"
+             , "four tuesdays from now"
+             ]
   , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
              [ "in 7 days"
              ]
+  , examples (datetime (2013, 2, 19, 17, 0, 0) Hour)
+             [ "in 7 days at 5pm"
+             ]
+  , examples (datetime (2017, 2, 1, 17, 0, 0) Hour)
+             [ "in 4 years at 5pm"
+             ]
   , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
              [ "in 1 week"
              , "in a week"
@@ -635,6 +760,12 @@
   , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
              [ "three months ago"
              ]
+  , examples (datetime (2013, 02, 04, 0, 0, 0) Day)
+             [ "the first Monday of this month"
+             , "the first Monday of the month"
+             , "the first Monday in this month"
+             , "first Monday in the month"
+             ]
   , examples (datetime (2011, 2, 1, 0, 0, 0) Month)
              [ "two years ago"
              ]
@@ -668,6 +799,12 @@
              , "from 18th Dec for 10 days"
              , "18th Dec for 10 days"
              ]
+  , examples (datetimeInterval ((2013, 2, 12, 16, 0, 0), (2013, 2, 12, 16, 31, 0)) Minute)
+             [ "for 30' starting from 4pm"
+             , "from 4pm for thirty minutes"
+             , "4pm for 30 mins"
+             , "16h for 30 mins"
+             ]
   , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
              [ "this Summer"
              , "current summer"
@@ -702,7 +839,7 @@
   , examples (datetimeHoliday (2013, 12, 25, 18, 0, 0) Hour "Christmas")
              [ "xmas at 6 pm"
              ]
-  , examples (datetimeIntervalHoliday ((2013, 12, 25, 4, 0, 0), (2013, 12, 25, 12, 0, 0)) Hour "Christmas")
+  , examples (datetimeIntervalHoliday ((2013, 12, 25, 0, 0, 0), (2013, 12, 25, 12, 0, 0)) Hour "Christmas")
              [ "morning of xmas"
              , "morning of christmas 2013"
              , "morning of this christmas day"
@@ -751,6 +888,8 @@
   , examples (datetimeHoliday (2014, 1, 20, 0, 0, 0) Day "Martin Luther King's Day")
              [ "MLK day"
              , "next Martin Luther King day"
+             , "next Martin Luther King's day"
+             , "next Martin Luther Kings day"
              , "this MLK day"
              ]
   , examples (datetimeHoliday (2013, 1, 21, 0, 0, 0) Day "Martin Luther King's Day")
@@ -804,13 +943,24 @@
              ]
   , examples (datetimeHoliday (2013, 2, 12, 0, 0, 0) Day "Shrove Tuesday")
              [ "pancake day 2013"
+             , "mardi gras"
              ]
+  , examples (datetimeHoliday (2013, 3, 17, 0, 0, 0) Day "St Patrick's Day")
+             [ "st patrick's day 2013"
+             , "st paddy's day"
+             , "saint paddy's day"
+             , "saint patricks day"
+             ]
   , examples (datetimeIntervalHoliday ((2018, 2, 14, 0, 0, 0), (2018, 4, 1, 0, 0, 0)) Day "Lent")
              [ "lent 2018"
              ]
   , examples (datetimeHoliday (2018, 4, 8, 0, 0, 0) Day "Orthodox Easter Sunday")
              [ "orthodox easter 2018"
              ]
+  , examples (datetimeHoliday (2020, 4, 17, 0, 0, 0) Day "Orthodox Good Friday")
+             [ "orthodox good friday 2020"
+             , "orthodox great friday 2020"
+             ]
   , examples (datetimeHoliday (2018, 2, 19, 0, 0, 0) Day "Clean Monday")
              [ "clean monday 2018"
              , "orthodox shrove monday two thousand eighteen"
@@ -842,10 +992,10 @@
   , examples (datetimeInterval ((2013, 2, 15, 18, 0, 0), (2013, 2, 18, 0, 0, 0)) Hour)
              [ "this week-end"
              ]
-  , examples (datetimeInterval ((2013, 2, 18, 4, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
              [ "monday mOrnIng"
              ]
-  , examples (datetimeInterval ((2013, 2, 18, 4, 0, 0), (2013, 2, 18, 9, 0, 0)) Hour)
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 2, 18, 9, 0, 0)) Hour)
              [ "monday early in the morning"
              , "monday early morning"
              , "monday in the early hours of the morning"
@@ -854,7 +1004,7 @@
              [ "late tonight"
              , "late tonite"
              ]
-  , examples (datetimeInterval ((2013, 2, 15, 4, 0, 0), (2013, 2, 15, 12, 0, 0)) Hour)
+  , examples (datetimeInterval ((2013, 2, 15, 0, 0, 0), (2013, 2, 15, 12, 0, 0)) Hour)
              [ "february the 15th in the morning"
              , "15 of february in the morning"
              , "morning of the 15th of february"
@@ -926,28 +1076,58 @@
              , "July 13 thru 15"
              , "July 13 through 15"
              , "July 13 - July 15"
-             , "from July 13-15"
+             ]
+  , examples (datetimeInterval ((2013, 7, 13, 0, 0, 0), (2013, 7, 16, 0, 0, 0)) Day)
+             [ "from July 13-15"
              , "from 13 to 15 July"
              , "from 13th to 15th July"
+             , "from the 13 to 15 July"
+             , "from the 13th to 15th July"
+             , "from the 13th to the 15th July"
+             , "from the 13 to the 15 July"
              ]
+  , examples (datetimeInterval ((2013, 7, 13, 0, 0, 0), (2013, 7, 16, 0, 0, 0)) Day)
+             [ "from 13 to 15 of July"
+             , "from 13th to 15 of July"
+             , "from 13 to 15th of July"
+             , "from 13th to 15th of July"
+             , "from 13 to the 15 of July"
+             , "from 13th to the 15 of July"
+             , "from 13 to the 15th of July"
+             , "from 13th to the 15th of July"
+             , "from the 13 to the 15 of July"
+             , "from the 13th to the 15 of July"
+             , "from the 13 to the 15th of July"
+             , "from the 13th to the 15th of July"
+             ]
   , examples (datetimeInterval ((2013, 8, 8, 0, 0, 0), (2013, 8, 13, 0, 0, 0)) Day)
              [ "Aug 8 - Aug 12"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 9, 30, 0), (2013, 2, 12, 11, 1, 0)) Minute)
              [ "9:30 - 11:00"
+             , "9h30 - 11h00"
+             , "9h30 - 11h"
              ]
+  , examples (datetimeInterval ((2013, 2, 12, 13, 30, 0), (2013, 2, 12, 15, 1, 0)) Minute)
+             [ "9:30 - 11:00 CST"
+             , "9h30 - 11h00 CST"
+             , "9h30 - 11h CST"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 13, 0, 0), (2013, 2, 12, 16, 1, 0)) Minute)
+             [ "15:00 GMT - 18:00 GMT"
+             , "15h00 GMT - 18h00 GMT"
+             , "15h GMT - 18h GMT"
+             ]
+  , examples (datetimeInterval
+      ((2015, 3, 28, 17, 00, 0), (2015, 3, 29, 21, 0, 1)) Second)
+             [ "2015-03-28 17:00:00/2015-03-29 21:00:00"
+             ]
   , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 11, 1, 0)) Minute)
              [ "from 9:30 - 11:00 on Thursday"
              , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
-             , "between 9:30 and 11:00 on thursday"
+             , "between 9h30 and 11h00 on thursday"
              , "9:30 - 11:00 on Thursday"
+             , "9h30 - 11h00 on Thursday"
              , "later than 9:30 but before 11:00 on Thursday"
              , "Thursday from 9:30 to 11:00"
              , "from 9:30 untill 11:00 on thursday"
@@ -962,10 +1142,19 @@
              , "from 3 to 4 in the PM"
              , "around 3-4pm"
              ]
-  , examples (datetimeInterval ((2013, 2, 12, 15, 30, 0), (2013, 2, 12, 19, 0, 0)) Minute)
+  , examples (datetimeInterval ((2013, 2, 12, 15, 30, 0), (2013, 2, 12, 18, 1, 0)) Minute)
              [ "3:30 to 6 PM"
              , "3:30-6 p.m."
+             , "3:30-6:00pm"
+             , "15h30-18h"
+             , "from 3:30 to six p.m."
+             , "from 3:30 to 6:00pm"
+             , "later than 3:30pm but before 6pm"
+             , "between 3:30pm and 6 pm"
              ]
+  , examples (datetimeInterval ((2013, 2, 12, 15, 0, 0), (2013, 2, 12, 18, 0, 1)) Second)
+             [ "3pm - 6:00:00pm"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 8, 0, 0), (2013, 2, 12, 14, 0, 0)) Hour)
              [ "8am - 1pm"
              ]
@@ -1019,22 +1208,43 @@
   , examples (datetime (2013, 2, 14, 6, 0, 0) Minute)
              [ "Thursday 8:00 GMT"
              , "Thursday 8:00 gmt"
+             , "Thursday 8h00 GMT"
+             , "Thursday 8h00 gmt"
+             , "Thursday 8h GMT"
+             , "Thursday 8h gmt"
              , "Thu at 8 GMT"
              , "Thu at 8 gmt"
+             , "Thursday 9 am BST"
+             , "Thursday 9 am (BST)"
              ]
   , examples (datetime (2013, 2, 14, 14, 0, 0) Minute)
              [ "Thursday 8:00 PST"
              , "Thursday 8:00 pst"
+             , "Thursday 8h00 PST"
+             , "Thursday 8h00 pst"
+             , "Thursday 8h PST"
+             , "Thursday 8h pst"
              , "Thu at 8 am PST"
              , "Thu at 8 am pst"
+             , "Thursday at 9:30pm ist"
              ]
   , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
              [ "today at 2pm"
              , "at 2pm"
+             , "this afternoon at 2"
+             , "this evening at 2"
+             , "tonight at 2"
              ]
   , examples (datetime (2013, 2, 13, 15, 0, 0) Hour)
              [ "3pm tomorrow"
              ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
+             [ "today in one hour"
+             ]
+  , examples (datetimeOpenInterval After (2013, 2, 12, 4, 30, 0) Second)
+             [ "ASAP"
+             , "as soon as possible"
+             ]
   , examples (datetimeOpenInterval Before (2013, 2, 12, 14, 0, 0) Minute)
              [ "until 2:00pm"
              , "through 2:00pm"
@@ -1067,6 +1277,8 @@
   , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
              [ "at 1:30pm"
              , "1:30pm"
+             , "at 13h30"
+             , "13h30"
              ]
   , examples (datetime (2013, 2, 12, 4, 45, 0) Second)
              [ "in 15 minutes"
@@ -1083,7 +1295,7 @@
              [ "10:30"
              , "approximately 1030"
              ]
-  , examples (datetimeInterval ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
+  , examples (datetimeInterval ((2013, 2, 12, 0, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
              [ "this morning"
              ]
   , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
@@ -1092,20 +1304,35 @@
   , examples (datetime (2013, 2, 12, 12, 0, 0) Hour)
              [ "at 12pm"
              , "at noon"
+             , "midday"
+             , "the midday"
+             , "mid day"
              ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Hour)
              [ "at 12am"
              , "at midnight"
+             , "this morning at 12"
+             , "this evening at 12"
+             , "this afternoon at 12"
              ]
+  , examples (datetime (2013, 2, 13, 9, 0, 0) Hour)
+             [ "9 tomorrow morning"
+             , "9 tomorrow"
+             ]
+  , examples (datetime (2013, 2, 13, 21, 0, 0) Hour)
+             [ "9 tomorrow evening"
+             ]
   , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
              [ "March"
              , "in March"
+             , "during March"
              ]
   , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
              [ "tomorrow afternoon at 5"
              , "at 5 tomorrow afternoon"
              , "at 5pm tomorrow"
              , "tomorrow at 5pm"
+             , "tomorrow evening at 5"
              ]
   , examples (datetimeInterval ((2013, 2, 13, 12, 0, 0), (2013, 2, 13, 19, 0, 0)) Hour)
              [ "tomorrow afternoon"
@@ -1132,6 +1359,9 @@
              ]
   , examples (datetime (2013, 2, 12, 23, 0, 0) Hour)
              [ "tonight at 11"
+             , "this evening at 11"
+             , "this afternoon at 11"
+             , "tonight at 11pm"
              ]
   , examples (datetime (2013, 2, 12, 4, 23, 0) Minute)
     -- yes, the result is in the past, we may need to revisit
@@ -1139,6 +1369,12 @@
              , "4:23am"
              , "four twenty-three a m"
              ]
+  , examples (datetime (2013, 10, 7, 0, 0, 0) Day)
+             [ "the closest Monday to Oct 5th"
+             ]
+  , examples (datetime (2013, 9, 30, 0, 0, 0) Day)
+             [ "the second closest Mon to October fifth"
+             ]
   , examples (datetimeInterval ((2013, 3, 1, 0, 0, 0), (2013, 3, 11, 0, 0, 0)) Day)
              [ "early March"
              ]
@@ -1153,6 +1389,12 @@
              , "last week-end in October"
              , "last week end of October"
              ]
+  , examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day)
+             [ "all week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day)
+             [ "rest of the week"
+             ]
   , examples (datetimeInterval ((2013, 7, 26, 18, 0, 0), (2013, 7, 29, 0, 0, 0)) Hour)
              [ "last wkend of July"
              ]
@@ -1214,9 +1456,11 @@
   , examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 14, 0, 0, 0)) Day)
              [ "beginning of this week"
              , "beginning of current week"
-             , "beginning of coming week"
              , "at the beginning of this week"
              , "at the beginning of current week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 2, 21, 0, 0, 0)) Day)
+             [ "beginning of coming week"
              , "at the beginning of coming week"
              ]
   , examples (datetimeInterval ((2013, 2, 4, 0, 0, 0), (2013, 2, 7, 0, 0, 0)) Day)
@@ -1238,9 +1482,11 @@
   , examples (datetimeInterval ((2013, 2, 15, 0, 0, 0), (2013, 2, 18, 0, 0, 0)) Day)
              [ "end of this week"
              , "end of current week"
-             , "end of coming week"
              , "at the end of this week"
              , "at the end of current week"
+             ]
+   , examples (datetimeInterval ((2013, 2, 22, 0, 0, 0), (2013, 2, 25, 0, 0, 0)) Day)
+             [ "end of coming week"
              , "at the end of coming week"
              ]
   , examples (datetimeInterval ((2013, 2, 8, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Day)
@@ -1266,6 +1512,7 @@
   , examples (datetimeHoliday (2013, 2, 10, 0, 0, 0) Day "Chinese New Year")
              [ "last chinese new year"
              , "last chinese lunar new year's day"
+             , "last chinese new years"
              ]
   , examples (datetimeHoliday (2018, 2, 16, 0, 0, 0) Day "Chinese New Year")
              [ "chinese new year's day 2018"
@@ -1315,15 +1562,51 @@
   , examples (datetimeHoliday (2017, 11, 30, 0, 0, 0) Day "Mawlid")
              [ "mawlid al-nabawi 2017"
              ]
+  , examples (datetimeHoliday (1950, 7, 16, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 1950"
+             ]
+  , examples (datetimeHoliday (1975, 10, 6, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 1975"
+             ]
+  , examples (datetimeHoliday (1988, 5, 16, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 1988"
+             ]
   , examples (datetimeHoliday (2018, 6, 15, 0, 0, 0) Day "Eid al-Fitr")
              [ "Eid al-Fitr 2018"
              ]
+  , examples (datetimeHoliday (2034, 12, 12, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2034"
+             ]
+  , examples (datetimeHoliday (2046, 8, 4, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2046"
+             ]
+  , examples (datetimeHoliday (2050, 6, 21, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2050"
+             ]
   , examples (datetimeHoliday (2018, 8, 21, 0, 0, 0) Day "Eid al-Adha")
              [ "Eid al-Adha 2018"
              , "id ul-adha 2018"
              , "sacrifice feast 2018"
              , "Bakr Id 2018"
              ]
+  , examples (datetimeHoliday (1980, 10, 19, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 1980"
+             , "id ul-adha 1980"
+             , "sacrifice feast 1980"
+             , "Bakr Id 1980"
+             ]
+  , examples (datetimeHoliday (1966, 4, 1, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 1966"
+             , "id ul-adha 1966"
+             , "sacrifice feast 1966"
+             , "Bakr Id 1966"
+             ]
+  , examples (datetimeHoliday (1974, 1, 3, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 1974"
+             , "id ul-adha 1974"
+             , "sacrifice feast 1974"
+             , "Bakr Id 1974"
+             ]
   , examples (datetimeHoliday (2017, 6, 22, 0, 0, 0) Day "Laylat al-Qadr")
              [ "laylat al kadr 2017"
              , "night of measures 2017"
@@ -1358,9 +1641,24 @@
              [ "the night journey 2019"
              , "ascension to heaven 2019"
              ]
+  , examples (datetimeIntervalHoliday ((1950, 6, 17, 0, 0, 0), (1950, 7, 16, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 1950"
+             ]
+  , examples (datetimeIntervalHoliday ((1977, 8, 15, 0, 0, 0), (1977, 9, 14, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 1977"
+             ]
   , examples (datetimeIntervalHoliday ((2018, 5, 16, 0, 0, 0), (2018, 6, 15, 0, 0, 0)) Day "Ramadan")
              [ "Ramadan 2018"
              ]
+ , examples (datetimeIntervalHoliday ((2034, 11, 12, 0, 0, 0), (2034, 12, 12, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2034"
+             ]
+ , examples (datetimeIntervalHoliday ((2046, 7, 5, 0, 0, 0), (2046, 8, 4, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2046"
+             ]
+ , examples (datetimeIntervalHoliday ((2050, 5, 22, 0, 0, 0), (2050, 6, 21, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2050"
+             ]
   , examples (datetimeHoliday (2017, 10, 17, 0, 0, 0) Day "Dhanteras")
              [ "dhanatrayodashi in 2017"
              ]
@@ -1395,9 +1693,26 @@
              [ "navaratri 2018"
              , "durga puja in 2018"
              ]
+  , examples (datetimeHoliday (2018, 10, 27, 0, 0, 0) Day "Karva Chauth")
+             [ "karva chauth 2018"
+             , "karva chauth in 2018"
+             ]
+  , examples (datetimeHoliday (2018, 7, 14, 0, 0, 0) Day "Ratha-Yatra")
+             [ "ratha-yatra 2018"
+             ]
   , examples (datetimeHoliday (2018, 8, 26, 0, 0, 0) Day "Raksha Bandhan")
              [ "rakhi 2018"
              ]
+  , examples (datetimeHoliday (2020, 4, 6, 0, 0, 0) Day "Mahavir Jayanti")
+             [ "mahavir jayanti 2020"
+             , "mahaveer janma kalyanak 2020"
+             ]
+  , examples (datetimeHoliday (2020, 2, 21, 0, 0, 0) Day "Maha Shivaratri")
+              [ "maha shivaratri 2020"
+              ]
+  , examples (datetimeHoliday (2018, 2, 10, 0, 0, 0) Day "Dayananda Saraswati Jayanti")
+             [ "saraswati jayanti 2018"
+             ]
   , examples (datetimeHoliday (2018, 1, 14, 0, 0, 0) Day "Thai Pongal")
              [ "pongal 2018"
              , "makara sankranthi 2018"
@@ -1416,6 +1731,12 @@
              [ "makar sankranti 2019"
              , "maghi in 2019"
              ]
+  , examples (datetimeHoliday (2018, 4, 14, 0, 0, 0) Day "Vaisakhi")
+             [ "Vaisakhi 2018"
+             , "baisakhi in 2018"
+             , "Vasakhi 2018"
+             , "vaishakhi 2018"
+             ]
   , examples (datetimeHoliday (2018, 8, 24, 0, 0, 0) Day "Thiru Onam")
              [ "onam 2018"
              , "Thiru Onam 2018"
@@ -1430,11 +1751,23 @@
              , "holika dahan 2019"
              , "kamudu pyre 2019"
              ]
+  , examples (datetimeHoliday (2019, 8, 23, 0, 0, 0) Day "Krishna Janmashtami")
+            [ "krishna janmashtami 2019"
+            , "gokulashtami 2019"
+            ]
   , examples (datetimeHoliday (2019, 3, 21, 0, 0, 0) Day "Holi")
              [ "holi 2019"
              , "dhulandi 2019"
              , "phagwah 2019"
              ]
+  , examples (datetimeHoliday (2018, 8, 17, 0, 0, 0) Day "Parsi New Year")
+             [ "Parsi New Year 2018"
+             , "Jamshedi Navroz 2018"
+             ]
+  , examples (datetimeHoliday (2022, 8, 16, 0, 0, 0) Day "Parsi New Year")
+             [ "jamshedi Navroz 2022"
+             , "parsi new year 2022"
+             ]
   , examples (datetimeIntervalHoliday ((2013, 4, 26, 0, 0, 0), (2013, 4, 29, 0, 0, 0)) Day "Global Youth Service Day")
              [ "GYSD 2013"
              , "global youth service day"
@@ -1451,4 +1784,155 @@
   , examples (datetimeIntervalHoliday ((2016, 3, 19, 20, 30, 0), (2016, 3, 19, 21, 31, 0)) Minute "Earth Hour")
              [ "earth hour 2016"
              ]
+  , examples (datetimeHoliday (2013, 2, 23, 0, 0, 0) Day "Purim")
+             [ "purim"
+             ]
+  , examples (datetimeHoliday (2013, 2, 24, 0, 0, 0) Day "Shushan Purim")
+             [ "Shushan Purim"
+             ]
+  , examples (datetimeHoliday (2014, 1, 7, 0, 0, 0) Day "Guru Gobind Singh Jayanti")
+             [ "guru gobind singh birthday"
+             , "guru gobind singh jayanti 2014"
+             , "guru gobind singh jayanti"
+             , "Guru Govind Singh Jayanti"
+             ]
+  , examples (datetimeHoliday (2018, 4, 27, 0, 0, 0) Day "King's Day")
+            [ "Koningsdag 2018"
+            , "koningsdag 2018"
+            , "king's day 2018"
+            , "King's Day 2018"
+            ]
+  , examples (datetimeHoliday (2014, 4, 26, 0, 0, 0) Day "King's Day")
+            [ "Koningsdag 2014"
+            , "koningsdag 2014"
+            , "King's Day 2014"
+            , "king's day 2014"
+            ]
+  , examples (datetimeHoliday (2018, 5, 9, 0, 0, 0) Day "Rabindra Jayanti")
+            [ "rabindra jayanti 2018"
+            , "Rabindranath Jayanti 2018"
+            , "Rabindra Jayanti 2018"
+            ]
+  , examples (datetimeHoliday (2019, 5, 9, 0, 0, 0) Day "Rabindra Jayanti")
+            [ "rabindra jayanti 2019"
+            , "Rabindranath Jayanti 2019"
+            , "Rabindra Jayanti 2019"
+            ]
+  , examples (datetimeHoliday (2018, 1, 31, 0, 0, 0) Day "Guru Ravidass Jayanti")
+            [ "guru Ravidas jayanti 2018"
+            , "Guru Ravidass birthday 2018"
+            , "guru ravidass Jayanti 2018"
+            ]
+  , examples (datetimeHoliday (2019, 2, 19, 0, 0, 0) Day "Guru Ravidass Jayanti")
+            [ "Guru Ravidass Jayanti 2019"
+            , "Guru Ravidas Birthday 2019"
+            , "guru ravidas jayanti 2019"
+            ]
+  , examples (datetimeHoliday (2019, 10, 13, 0, 0, 0) Day "Pargat Diwas")
+            [ "valmiki jayanti 2019"
+            , "Valmiki Jayanti 2019"
+            , "pargat diwas 2019"
+            ]
+  , examples (datetimeHoliday (2018, 10, 24, 0, 0, 0) Day "Pargat Diwas")
+            [ "maharishi valmiki jayanti 2018"
+            , "pargat diwas 2018"
+            , "Pargat Diwas 2018"
+            ]
+  , examples (datetimeHoliday (2019, 9, 2, 0, 0, 0) Day "Ganesh Chaturthi")
+            [ "ganesh chaturthi 2019"
+            ]
+  , examples (datetimeHoliday (2020, 4, 2, 0, 0, 0) Day "Rama Navami")
+            [ "rama navami 2020"
+            ]
+  , examples (datetimeHoliday (2018, 3, 18, 0, 0, 0) Day "Ugadi")
+            [ "Ugadi 2018"
+            , "ugadi 2018"
+            , "yugadi 2018"
+            , "Yugadi 2018"
+            , "samvatsaradi 2018"
+            , "chaitra sukladi 2018"
+            , "chaitra sukhladi 2018"
+            ]
+  , examples (datetimeHoliday (2012, 12, 25, 0, 0, 0) Day "Christmas")
+            [ "the closest xmas to today"
+            ]
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Christmas")
+            [ "the second closest xmas to today"
+            ]
+  , examples (datetimeHoliday (2011, 12, 25, 0, 0, 0) Day "Christmas")
+            [ "the 3rd closest xmas to today"
+            ]
+  , examples (datetime (2013, 10, 25, 0, 0, 0) Day)
+            [ "last friday of october"
+            , "last friday in october"
+            ]
+  , examples (datetime (2013, 2, 25, 0, 0, 0) Week)
+            [ "upcoming two weeks"
+            , "upcoming two week"
+            , "upcoming 2 weeks"
+            , "upcoming 2 week"
+            , "two upcoming weeks"
+            , "two upcoming week"
+            , "2 upcoming weeks"
+            , "2 upcoming week"
+            ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+            [ "upcoming two days"
+            , "upcoming two day"
+            , "upcoming 2 days"
+            , "upcoming 2 day"
+            , "two upcoming days"
+            , "two upcoming day"
+            , "2 upcoming days"
+            , "2 upcoming day"
+            ]
+  , examples (datetime (2013, 4, 1, 0, 0, 0) Month)
+            [ "upcoming two months"
+            , "upcoming two month"
+            , "upcoming 2 months"
+            , "upcoming 2 month"
+            , "two upcoming months"
+            , "two upcoming month"
+            , "2 upcoming months"
+            , "2 upcoming month"
+            ]
+  , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
+            [ "upcoming two quarters"
+            , "upcoming two quarter"
+            , "upcoming 2 quarters"
+            , "upcoming 2 quarter"
+            , "two upcoming quarters"
+            , "two upcoming quarter"
+            , "2 upcoming quarters"
+            , "2 upcoming quarter"
+            ]
+  , examples (datetime (2015, 1, 1, 0, 0, 0) Year)
+            [ "upcoming two years"
+            , "upcoming two year"
+            , "upcoming 2 years"
+            , "upcoming 2 year"
+            , "two upcoming years"
+            , "two upcoming year"
+            , "2 upcoming years"
+            , "2 upcoming year"
+            ]
+  , examples (datetime (2013, 2, 13, 13, 40, 0) Minute)
+             [ "20 minutes to 2pm tomorrow"
+             ]
+  , examples (datetime (2013, 1, 7, 0, 0, 0) Day)
+             [
+               "first monday of last month"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Day)
+             [
+               "first tuesday of last month"
+             ]
+  , examples (datetime (2013, 1, 14, 0, 0, 0) Day)
+             [
+               "second monday of last month"
+             ]
+  , examples (datetime (2013, 2, 23, 0, 0, 0) Day)
+             [ "next saturday" ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "next monday" ]
   ]
diff --git a/Duckling/Time/EN/GB/Corpus.hs b/Duckling/Time/EN/GB/Corpus.hs
--- a/Duckling/Time/EN/GB/Corpus.hs
+++ b/Duckling/Time/EN/GB/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/GB/Rules.hs b/Duckling/Time/EN/GB/Rules.hs
--- a/Duckling/Time/EN/GB/Rules.hs
+++ b/Duckling/Time/EN/GB/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/IE/Corpus.hs b/Duckling/Time/EN/IE/Corpus.hs
--- a/Duckling/Time/EN/IE/Corpus.hs
+++ b/Duckling/Time/EN/IE/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/IE/Rules.hs b/Duckling/Time/EN/IE/Rules.hs
--- a/Duckling/Time/EN/IE/Rules.hs
+++ b/Duckling/Time/EN/IE/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/IN/Corpus.hs b/Duckling/Time/EN/IN/Corpus.hs
--- a/Duckling/Time/EN/IN/Corpus.hs
+++ b/Duckling/Time/EN/IN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/IN/Rules.hs b/Duckling/Time/EN/IN/Rules.hs
--- a/Duckling/Time/EN/IN/Rules.hs
+++ b/Duckling/Time/EN/IN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/JM/Corpus.hs b/Duckling/Time/EN/JM/Corpus.hs
--- a/Duckling/Time/EN/JM/Corpus.hs
+++ b/Duckling/Time/EN/JM/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/JM/Rules.hs b/Duckling/Time/EN/JM/Rules.hs
--- a/Duckling/Time/EN/JM/Rules.hs
+++ b/Duckling/Time/EN/JM/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/NZ/Corpus.hs b/Duckling/Time/EN/NZ/Corpus.hs
--- a/Duckling/Time/EN/NZ/Corpus.hs
+++ b/Duckling/Time/EN/NZ/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/NZ/Rules.hs b/Duckling/Time/EN/NZ/Rules.hs
--- a/Duckling/Time/EN/NZ/Rules.hs
+++ b/Duckling/Time/EN/NZ/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/EN/PH/Corpus.hs b/Duckling/Time/EN/PH/Corpus.hs
--- a/Duckling/Time/EN/PH/Corpus.hs
+++ b/Duckling/Time/EN/PH/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/PH/Rules.hs b/Duckling/Time/EN/PH/Rules.hs
--- a/Duckling/Time/EN/PH/Rules.hs
+++ b/Duckling/Time/EN/PH/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -12,17 +11,16 @@
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
-module Duckling.Time.EN.Rules
-  ( rules
-  ) where
+module Duckling.Time.EN.Rules where
 
+import Control.Applicative ((<|>))
+import Control.Monad (guard)
 import Data.Maybe
-import Data.Text (Text)
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
-import Duckling.Duration.Helpers (duration)
+import Duckling.Duration.Helpers (duration, isGrain)
 import Duckling.Duration.Types (DurationData (..))
 import Duckling.Numeral.Helpers (isNatural, parseInt)
 import Duckling.Numeral.Types (NumeralData (..))
@@ -30,7 +28,8 @@
 import Duckling.Regex.Types
 import Duckling.Time.Computed
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.HolidayHelpers
+import Duckling.Time.Types (TimeData (..), TimeIntervalType (..))
 import Duckling.Types
 import qualified Duckling.Duration.Types as TDuration
 import qualified Duckling.Numeral.Types as TNumeral
@@ -42,11 +41,12 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ Predicate isNotLatent
+    [ Predicate $ isGrainFinerThan TG.Year
     , Predicate $ or . sequence [isNotLatent, isGrainOfTime TG.Year]
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td1:Token Time td2:_) ->
+      (Token Time td1:Token Time td2:_)
+        | not (TTime.latent td1) || not (TTime.latent td2) ->
         Token Time . notLatent <$> intersect td1 td2
       _ -> Nothing
   }
@@ -79,12 +79,12 @@
       _ -> Nothing
   }
 
-ruleAbsorbOnTime :: Rule
-ruleAbsorbOnTime = Rule
-  { name = "on <date>"
+ruleAbsorbOnDay :: Rule
+ruleAbsorbOnDay = Rule
+  { name = "on <day>"
   , pattern =
     [ regex "on"
-    , dimension Time
+    , Predicate $ isGrainOfTime TG.Day
     ]
   , prod = \tokens -> case tokens of
       (_:token:_) -> Just token
@@ -105,9 +105,9 @@
 
 ruleAbsorbInMonthYear :: Rule
 ruleAbsorbInMonthYear = Rule
-  { name = "in <named-month>|year"
+  { name = "in|during <named-month>|year"
   , pattern =
-    [ regex "in"
+    [ regex "in|during"
     , Predicate $ or . sequence [isAMonth, isGrainOfTime TG.Year]
     ]
   , prod = \tokens -> case tokens of
@@ -139,20 +139,37 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "now"
+    [ regex "now|at\\sthe\\smoment|atm"
     ]
   , prod = \_ -> tt now
   }
 
+ruleASAP :: Rule
+ruleASAP = Rule
+  { name = "as soon as possible"
+  , pattern =
+    [ regex "asap|as\\ssoon\\sas\\spossible"
+    ]
+  , prod = \_ -> tt $ withDirection TTime.After now
+  }
+
 ruleNextDOW :: Rule
 ruleNextDOW = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "this|next"
+    [ regex "(this|next)"
     , Predicate isADayOfWeek
     ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> tt $ predNth 0 True td
+  , prod = \case
+      (
+        Token RegexMatch (GroupMatch (match:_)):
+        Token Time dow:
+        _) -> do
+          td <- case Text.toLower match of
+                  "this" -> Just $ predNth 0 True dow
+                  "next" -> intersect dow $ cycleNth TG.Week 1
+                  _ -> Nothing
+          tt td
       _ -> Nothing
   }
 
@@ -217,18 +234,44 @@
       _ -> Nothing
   }
 
+ruleOrdinalDOWOfTime :: Rule
+ruleOrdinalDOWOfTime = Rule
+  { name = "first|second|third|fourth|fifth <day-of-week> of <time>"
+  , pattern =
+    [ Predicate $ isOrdinalBetween 1 5
+    , Predicate isADayOfWeek
+    , regex "(of|in)"
+    , dimension Time
+    ]
+  , prod = \case
+      (
+        token:
+        Token Time td1:
+        _:
+        Token Time td2:
+        _) -> do
+          ord <- getIntValue token
+          td <- Just $ predNthAfter (ord-1) td1 td2
+          tt td
+      _ -> Nothing
+  }
+
 ruleLastDOWOfTime :: Rule
 ruleLastDOWOfTime = Rule
   { name = "last <day-of-week> of <time>"
   , pattern =
     [ regex "last"
     , Predicate isADayOfWeek
-    , regex "of"
+    , regex "(of|in)"
     , dimension Time
     ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td1:_:Token Time td2:_) ->
-        tt $ predLastOf td1 td2
+  , prod = \case
+      (
+        _:
+        Token Time td1:
+        _:
+        Token Time td2:
+        _) -> tt $ predLastOf td1 td2
       _ -> Nothing
   }
 
@@ -256,9 +299,8 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         let hours = if Text.toLower match == "late " then 3 else 6
-            start = durationBefore (DurationData hours TG.Hour) end
-            end = cycleNth TG.Day 0
-        in Token Time . partOfDay . notLatent <$> interval TTime.Open start end
+            start = durationBefore (DurationData hours TG.Hour) today
+        in Token Time . partOfDay . notLatent <$> interval TTime.Open start today
       _ -> Nothing
   }
 
@@ -324,6 +366,22 @@
       _ -> Nothing
   }
 
+ruleNDOWFromTime :: Rule
+ruleNDOWFromTime = Rule
+  { name = "<integer> <day-of-week> from <time>"
+  , pattern =
+    [ dimension Numeral
+    , Predicate isADayOfWeek
+    , regex "from"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (token:Token Time td1:_:Token Time td2:_) -> do
+        n <- getIntValue token
+        tt $ predNthAfter (n - 1) td1 td2
+      _ -> Nothing
+  }
+
 ruleYearLatent :: Rule
 ruleYearLatent = Rule
   { name = "year (latent)"
@@ -331,10 +389,10 @@
       [ Predicate $
         or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 10000]
       ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (token:_) -> do
         n <- getIntValue token
-        tt . mkLatent $ year n
+        tt $ mkLatent $ year n
       _ -> Nothing
   }
 
@@ -348,7 +406,7 @@
   , prod = \case
     (token:Token RegexMatch (GroupMatch (ab:_)):_) -> do
       y <- getIntValue token
-      tt . yearADBC $ if Text.head (Text.toLower ab) == 'b' then -y else y
+      tt $ yearADBC $ if Text.head (Text.toLower ab) == 'b' then -y else y
     _ -> Nothing
   }
 
@@ -359,7 +417,7 @@
   , prod = \tokens -> case tokens of
       (token:_) -> do
         n <- getIntValue token
-        tt . mkLatent $ dayOfMonth n
+        tt $ mkLatent $ dayOfMonth n
       _ -> Nothing
   }
 
@@ -373,7 +431,7 @@
   , prod = \tokens -> case tokens of
       (_:token:_) -> do
         n <- getIntValue token
-        tt . mkLatent $ dayOfMonth n
+        tt $ mkLatent $ dayOfMonth n
       _ -> Nothing
   }
 
@@ -415,6 +473,20 @@
       _ -> Nothing
   }
 
+ruleTheDOMOfMonth :: Rule
+ruleTheDOMOfMonth = Rule
+  { name = "the <day-of-month> (ordinal or number) of <named-month>"
+  , pattern =
+    [ regex "the"
+    , Predicate isDOMValue
+    , regex "of|in"
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
 ruleDOMOfMonth :: Rule
 ruleDOMOfMonth = Rule
   { name = "<day-of-month> (ordinal or number) of <named-month>"
@@ -440,6 +512,29 @@
       _ -> Nothing
   }
 
+ruleDOMMonthYear :: Rule
+ruleDOMMonthYear = Rule
+  { name = "<day-of-month>(ordinal or number)/<named-month>/year"
+  , pattern =
+    [ Predicate isDOMValue
+    , regex "[-/\\s]"
+    , Predicate isAMonth
+    , regex "[-/\\s]"
+    , regex "(\\d{2,4})"
+    ]
+  , prod = \tokens -> case tokens of
+      (token:
+       _:
+       Token Time td:
+       _:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+         intVal <- parseInt match
+         dom <- intersectDOM td token
+         Token Time <$> intersect dom (year intVal)
+      _ -> Nothing
+  }
+
 ruleDOMOrdinalMonthYear :: Rule
 ruleDOMOrdinalMonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -479,7 +574,7 @@
   , prod = \tokens -> case tokens of
       (token:_) -> do
         n <- getIntValue token
-        tt . mkLatent $ hour True n
+        tt $ mkLatent $ hour (n < 13) n
       _ -> Nothing
   }
 
@@ -507,6 +602,28 @@
       _ -> Nothing
   }
 
+rulePODatTOD :: Rule
+rulePODatTOD = Rule
+  { name = "<part-of-day> at <time-of-day>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , regex "at|@"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData{TTime.timePred = TTime.IntersectPredicate
+        (TTime.TimeIntervalsPredicate
+          _ TTime.TimeDatePredicate{TTime.tdHour = Just (False, start)} _) _}:_:
+        Token Time tod@TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) True)}:_) ->
+        tt $ timeOfDayAMPM (start < 12 || hours == 12) tod
+      (Token Time TimeData{TTime.timePred = TTime.TimeIntervalsPredicate
+        _ TTime.TimeDatePredicate{TTime.tdHour = Just (False, start)} _}:_:
+        Token Time tod@TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) True)}:_) ->
+        tt $ timeOfDayAMPM (start < 12 || hours == 12) tod
+      _ -> Nothing
+
+  }
+
 ruleHHMM :: Rule
 ruleHHMM = Rule
   { name = "hh:mm"
@@ -515,10 +632,24 @@
       (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
         h <- parseInt hh
         m <- parseInt mm
-        tt $ hourMinute True h m
+        tt $ hourMinute (h /= 0 && h < 12) h m
       _ -> Nothing
   }
 
+ruleHHhMM :: Rule
+ruleHHhMM = Rule
+  { name = "hhhmm"
+  , pattern =
+    [ regex "(?<!/)((?:[01]?\\d)|(?:2[0-3]))h(([0-5]\\d)|(?!\\d))"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm <|> Just 0
+        tt $ hourMinute False h m
+      _ -> Nothing
+  }
+
 ruleHHMMLatent :: Rule
 ruleHHMMLatent = Rule
   { name = "hhmm (latent)"
@@ -529,7 +660,7 @@
       (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
         h <- parseInt hh
         m <- parseInt mm
-        tt . mkLatent $ hourMinute True h m
+        tt $ mkLatent $ hourMinute (h < 12) h m
       _ -> Nothing
   }
 
@@ -542,7 +673,7 @@
         h <- parseInt hh
         m <- parseInt mm
         s <- parseInt ss
-        tt $ hourMinuteSecond True h m s
+        tt $ hourMinuteSecond (h < 12) h m s
       _ -> Nothing
   }
 
@@ -559,7 +690,7 @@
        _) -> do
         h <- parseInt hh
         m <- parseInt mm
-        tt . timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True h m
+        tt $ timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True h m
       _ -> Nothing
   }
 
@@ -575,7 +706,7 @@
         (h:m:Token RegexMatch (GroupMatch (_:ap:_)):_) -> do
           hh <- getIntValue h
           mm <- getIntValue m
-          tt . timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True hh mm
+          tt $ timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True hh mm
         _ -> Nothing
   }
 
@@ -593,7 +724,7 @@
           v | v < 60 -> Just v
           _          -> Nothing
         let h = quot n 100
-        tt . timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True h m
+        tt $ timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True h m
       _ -> Nothing
   }
 
@@ -605,10 +736,13 @@
     , regex "(in the )?([ap])(\\s|\\.)?(m?)\\.?"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td@TimeData {TTime.latent = True}:
-       Token RegexMatch (GroupMatch (_:ap:_:"":_)):_) ->
-        tt . mkLatent $ timeOfDayAMPM (Text.toLower ap == "a") td
-      (Token Time td:Token RegexMatch (GroupMatch (_:ap:_)):_) ->
+      (Token Time td@TimeData{TTime.latent = True}:
+       Token RegexMatch (GroupMatch (_:ap:_:"":_)):
+       _) ->
+        tt $ mkLatent $ timeOfDayAMPM (Text.toLower ap == "a") td
+      (Token Time td@TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       Token RegexMatch (GroupMatch (_:ap:_)):
+       _) | hours < 13 ->
         tt $ timeOfDayAMPM (Text.toLower ap == "a") td
       _ -> Nothing
   }
@@ -617,18 +751,44 @@
 ruleHONumeral = Rule
   { name = "<hour-of-day> <integer>"
   , pattern =
-    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
+    [ Predicate isAnHourOfDay
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
-      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+      (Token Time TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)
+                          ,TTime.latent = isLatent}:
        token:
        _) -> do
         n <- getIntValue token
-        tt $ hourMinute is12H hours n
+        if isLatent
+          then tt $ mkLatent $ hourMinute is12H hours n
+          else tt $ hourMinute is12H hours n
       _ -> Nothing
   }
 
+ruleHONumeralAlt :: Rule
+ruleHONumeralAlt = Rule
+  { name = "<hour-of-day> zero <integer>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "(zero|o(h|u)?)"
+    , Predicate $ isIntegerBetween 1 9
+    ]
+  , prod = \case
+      (
+        Token Time TimeData{TTime.form = Just (TTime.TimeOfDay
+                                              (Just hours) is12H)
+                          , TTime.latent = isLatent}:
+        _:
+        token:
+        _) -> do
+          n <- getIntValue token
+          if isLatent
+            then tt $ mkLatent $ hourMinute is12H hours n
+            else tt $ hourMinute is12H hours n
+      _ -> Nothing
+  }
+
 ruleHODHalf :: Rule
 ruleHODHalf = Rule
   { name = "<hour-of-day> half"
@@ -637,8 +797,8 @@
     , regex "half"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
-        tt $ hourMinute is12H hours 30
+      (Token Time TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       _) -> tt $ hourMinute is12H hours 30
       _ -> Nothing
   }
 
@@ -650,8 +810,8 @@
     , regex "(a|one)? ?quarter"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
-        tt $ hourMinute is12H hours 15
+      (Token Time TimeData{TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       _) -> tt $ hourMinute is12H hours 15
       _ -> Nothing
   }
 
@@ -666,8 +826,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -706,8 +865,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesAfter n td
-        Just $ Token Time t
+        Token Time <$> minutesAfter n td
       _ -> Nothing
   }
 
@@ -727,7 +885,7 @@
 ruleQuarterAfterHOD = Rule
   { name = "quarter after|past <hour-of-day>"
   , pattern =
-    [ regex "(a|one)? ?quarter (after|past)"
+    [ regex "(for )?((a|one) )?quarter (after|past)"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -753,21 +911,35 @@
   , pattern =
     [ regex "(0?[1-9]|1[0-2])[/-](\\d{4})"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (mm:yy:_)):_) -> do
         y <- parseInt yy
         m <- parseInt mm
-        tt $ yearMonthDay y m 1
+        tt $ yearMonth y m
       _ -> Nothing
   }
 
+ruleYYYYMM :: Rule
+ruleYYYYMM = Rule
+  { name = "yyyy-mm"
+  , pattern =
+    [ regex "(\\d{4})\\s*[/-]\\s*(1[0-2]|0?[1-9])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (yy:mm:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        tt $ yearMonth y m
+      _ -> Nothing
+  }
+
 ruleYYYYMMDD :: Rule
 ruleYYYYMMDD = Rule
   { name = "yyyy-mm-dd"
   , pattern =
     [ regex "(\\d{2,4})-(0?[1-9]|1[0-2])-(3[01]|[12]\\d|0?[1-9])"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (yy:mm:dd:_)):_) -> do
         y <- parseInt yy
         m <- parseInt mm
@@ -776,14 +948,28 @@
       _ -> Nothing
   }
 
+ruleYYYYQQ :: Rule
+ruleYYYYQQ = Rule
+  { name = "yyyyqq"
+  , pattern =
+    [ regex "(\\d{2,4})q([1-4])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (yy:qq:_)):_) -> do
+        y <- parseInt yy
+        q <- parseInt qq
+        tt $ cycleNthAfter True TG.Quarter (q - 1) $ year y
+      _ -> Nothing
+  }
+
 ruleNoonMidnightEOD :: Rule
 ruleNoonMidnightEOD = Rule
   { name = "noon|midnight|EOD|end of day"
   , pattern =
     [ regex "(noon|midni(ght|te)|(the )?(EOD|end of (the )?day))"
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> tt . hour False $
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> tt $ hour False $
         if Text.toLower match == "noon" then 12 else 0
       _ -> Nothing
   }
@@ -797,14 +983,14 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         let (start, end) = case Text.toLower match of
-              "morning"  -> (hour False 4, hour False 12)
+              "morning"  -> (hour False 0, hour False 12)
               "evening"  -> (hour False 18, hour False 0)
               "night"    -> (hour False 18, hour False 0)
               "lunch"    -> (hour False 12, hour False 14)
               "at lunch" -> (hour False 12, hour False 14)
               _          -> (hour False 12, hour False 19)
         td <- interval TTime.Open start end
-        tt . partOfDay $ mkLatent td
+        tt $ partOfDay $ mkLatent td
       _ -> Nothing
   }
 
@@ -815,7 +1001,7 @@
     [ regex "early ((in|hours of) the )?morning"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
-      interval TTime.Open (hour False 4) (hour False 9)
+      interval TTime.Open (hour False 0) (hour False 9)
   }
 
 rulePODIn :: Rule
@@ -839,7 +1025,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+        intersect today td
       _ -> Nothing
   }
 
@@ -849,8 +1035,7 @@
   , pattern = [regex "(late )?toni(ght|gth|te)s?"]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
-        let today = cycleNth TG.Day 0
-            h = if Text.toLower match == "late " then 21 else 18
+        let h = if Text.toLower match == "late " then 21 else 18
         evening <- interval TTime.Open (hour False h) (hour False 0)
         Token Time . partOfDay . notLatent <$> intersect today evening
       _ -> Nothing
@@ -870,8 +1055,7 @@
           "school" -> Just (hour False 15, hour False 21)
           _        -> Nothing
         td <- interval TTime.Open start end
-        Token Time . partOfDay . notLatent <$>
-          intersect (cycleNth TG.Day 0) td
+        Token Time . partOfDay . notLatent <$> intersect today td
       _ -> Nothing
   }
 
@@ -910,6 +1094,26 @@
   , prod = \_ -> tt $ mkOkForThisNext weekend
   }
 
+ruleWeek :: Rule
+ruleWeek = Rule
+ { name = "week"
+ , pattern =
+   [ regex "(all|rest of the|the) week"
+   ]
+ , prod = \case
+     (Token RegexMatch (GroupMatch (match:_)):_) ->
+       let end = cycleNthAfter True TG.Day (-2) $ cycleNth TG.Week 1
+           period = case Text.toLower match of
+                      "all" -> interval Closed (cycleNth TG.Week 0) end
+                      "rest of the" -> interval Open today end
+                      "the" -> interval Open today end
+                      _ -> Nothing
+       in case Text.toLower match of
+         "the" -> Token Time . mkLatent <$> period
+         _ -> Token Time <$> period
+     _ -> Nothing
+ }
+
 ruleSeason :: Rule
 ruleSeason = Rule
   { name = "last|this|next <season>"
@@ -950,6 +1154,18 @@
       _ -> Nothing
   }
 
+ruleTODPOD :: Rule
+ruleTODPOD = Rule
+  { name = "<time-of-day> <part-of-day>"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , Predicate isAPartOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:Token Time pod:_) -> Token Time . notLatent <$> intersect td pod
+      _ -> Nothing
+  }
+
 rulePrecisionTOD :: Rule
 rulePrecisionTOD = Rule
   { name = "about|exactly <time-of-day>"
@@ -1029,11 +1245,11 @@
 
 ruleIntervalFromDDDDMonth :: Rule
 ruleIntervalFromDDDDMonth = Rule
-  { name = "from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)"
+  { name = "from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) <named-month> (interval)"
   , pattern =
-    [ regex "from"
+    [ regex "from( the)?"
     , Predicate isDOMValue
-    , regex "\\-|to|th?ru|through|(un)?til(l)?"
+    , regex "\\-|to( the)?|th?ru|through|(un)?til(l)?"
     , Predicate isDOMValue
     , Predicate isAMonth
     ]
@@ -1050,7 +1266,70 @@
       _ -> Nothing
   }
 
--- Blocked for :latent time. May need to accept certain latents only, like hours
+ruleIntervalFromDDDDOfMonth :: Rule
+ruleIntervalFromDDDDOfMonth = Rule
+  { name = "from the <day-of-month> (ordinal or number) to the <day-of-month> (ordinal or number) of <named-month> (interval)"
+  , pattern =
+    [ regex "from( the)?"
+    , Predicate isDOMValue
+    , regex "\\-|to( the)?|th?ru|through|(un)?til(l)?"
+    , Predicate isDOMValue
+    , regex "of"
+    , 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
+  }
+
+-- In order to support latent year ranges, e.g. "1960 - 1961", we impose
+-- the following constraints:
+--   1. Neither year can be negative.
+--   2. The first year must be less than the second year.
+--   3. The years must be within the interval [1000,10000].
+-- (1): We could try to allow negative years, but years in natural language are
+--      almost never written as negative, so it's unnecessary complication.
+-- (2): Year ranges in natural language are written
+--      <earlier year> - <later year>. No need to derive the ordering from
+--      something which is not likely a year range.
+-- (3): Four+ digits prevents phone numbers (e.g. "333-444-5555") from
+--      registering false positives.
+--      In everyday language, people are more likely to mention years closer
+--      to the present than very far in the past or future (closer times are
+--      more relevant).
+--      Of course, this means we do not have the ability to parse something like
+--      "300 - 600" as a year interval. But, prior to implementing this
+--      rule, we already did not have that ability.
+--
+-- These guidelines are not perfect, but they work. They can be iterated on and
+-- improved going forward.
+ruleIntervalYearLatent :: Rule
+ruleIntervalYearLatent = Rule
+  { name = "<year> (latent) - <year> (latent) (interval)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 1000 10000
+    , regex "\\-|to|th?ru|through|(un)?til(l)?"
+    , Predicate $ isIntegerBetween 1000 10000
+    ]
+  , prod = \case
+      (t1:_:t2:_) -> do
+        y1 <- getIntValue t1
+        y2 <- getIntValue t2
+        guard (y1 < y2)
+        Token Time <$> interval TTime.Closed (year y1) (year y2)
+      _ -> Nothing
+  }
+
+-- Blocked for :latent time.
 ruleIntervalDash :: Rule
 ruleIntervalDash = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -1059,12 +1338,26 @@
     , regex "\\-|to|th?ru|through|(un)?til(l)?"
     , Predicate isNotLatent
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Time td1:_:Token Time td2:_) ->
         Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
   }
 
+ruleIntervalSlash :: Rule
+ruleIntervalSlash = Rule
+  { name = "<datetime>/<datetime> (interval)"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "/"
+    , Predicate isNotLatent
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:_:Token Time td2:_) | sameGrain td1 td2 ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
 ruleIntervalFrom :: Rule
 ruleIntervalFrom = Rule
   { name = "from <datetime> - <datetime> (interval)"
@@ -1104,7 +1397,7 @@
     , regex "\\-|:|to|th?ru|through|(un)?til(l)?"
     , Predicate isATimeOfDay
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Time td1:_:Token Time td2:_) ->
         Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
@@ -1161,7 +1454,7 @@
     , regex "and"
     , Predicate isATimeOfDay
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (_:Token Time td1:_:Token Time td2:_) ->
         Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
@@ -1174,9 +1467,8 @@
     [ regex "by"
     , dimension Time
     ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Open (cycleNth TG.Second 0) td
+  , prod = \case
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1188,8 +1480,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -1201,7 +1492,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> tt . withDirection TTime.Before $ notLatent td
+      (_:Token Time td:_) -> tt $ withDirection TTime.Before $ notLatent td
       _ -> Nothing
   }
 
@@ -1213,7 +1504,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> tt . withDirection TTime.After $ notLatent td
+      (_:Token Time td:_) -> tt $ withDirection TTime.After $ notLatent td
       _ -> Nothing
   }
 
@@ -1299,7 +1590,7 @@
           cycleMonth = cycleNth TG.Month
           parsed = if "by" `Text.isPrefixOf` Text.toLower match
             then
-              ( Just $ cycleNth TG.Second 0
+              ( Just now
               , intersect (dayOfMonth 1) $ cycleMonth 1)
             else
               ( intersect (dayOfMonth 21) $ cycleMonth 0
@@ -1341,7 +1632,9 @@
 ruleEndOfYear :: Rule
 ruleEndOfYear = Rule
   { name = "end of year"
-  , pattern = [ regex "(by (the )?|(at )?the )?(EOY|end of (the )?year)" ]
+  , pattern =
+    [ regex "(by (the )?|(at )?the )?(EOY|end of (the )?year)"
+    ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         start <- std
@@ -1349,7 +1642,7 @@
         Token Time <$> interval TTime.Open start end
           where
             std = if "by" `Text.isPrefixOf` Text.toLower match
-              then Just $ cycleNth TG.Second 0
+              then Just now
               else intersect (month 9) $ cycleYear 0
             cycleYear = cycleNth TG.Year
       _ -> Nothing
@@ -1358,7 +1651,9 @@
 ruleBeginningOfYear :: Rule
 ruleBeginningOfYear = Rule
   { name = "beginning of year"
-  , pattern = [ regex "((at )?the )?(BOY|beginning of (the )?year)" ]
+  , pattern =
+    [ regex "((at )?the )?(BOY|beginning of (the )?year)"
+    ]
   , prod = \_ -> do
       start <- intersect (month 1) $ cycleNth TG.Year 0
       end <- intersect (month 4) $ cycleNth TG.Year 0
@@ -1384,6 +1679,39 @@
       _ -> Nothing
   }
 
+ruleClosest :: Rule
+ruleClosest = Rule
+  { name = "the closest <day> to <time>"
+  , pattern =
+    [ regex "the\\s+closest"
+    , Predicate $ isGrainOfTime TG.Day
+    , regex "to"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        tt $ predNthClosest 0 td1 td2
+      _ -> Nothing
+  }
+
+ruleNthClosest :: Rule
+ruleNthClosest = Rule
+  { name = "the <ordinal> closest <day> to <time>"
+  , pattern =
+    [ regex "the"
+    , dimension Ordinal
+    , regex "closest"
+    , Predicate $ isGrainOfTime TG.Day
+    , regex "to"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:token:_:Token Time td1:_:Token Time td2:_) -> do
+        n <- getIntValue token
+        tt $ predNthClosest (n - 1) td1 td2
+      _ -> Nothing
+  }
+
 rulePeriodicHolidays :: [Rule]
 rulePeriodicHolidays = mkRuleHolidays
   -- Fixed dates, year over year
@@ -1485,9 +1813,10 @@
   , ( "Orthodox New Year", "orthodox new year", monthDay 1 14 )
   , ( "Public Service Day", "public service day", monthDay 6 23 )
   , ( "St. George's Day", "(saint|st\\.?) george'?s day|feast of saint george", monthDay 4 23 )
-  , ( "St Patrick's Day", "st\\.? patrick'?s day", monthDay 3 17 )
-  , ( "St. Stephen's Day", "st\\.? stephen'?s day", monthDay 12 26 )
+  , ( "St Patrick's Day", "(saint|st\\.?) (patrick|paddy)'?s day", monthDay 3 17 )
+  , ( "St. Stephen's Day", "(saint|st\\.?) stephen'?s day", monthDay 12 26 )
   , ( "Time of Remembrance and Reconciliation for Those Who Lost Their Lives during the Second World War", "time of remembrance and reconciliation for those who lost their lives during the second world war", monthDay 5 8 )
+  , ( "Ugadi", "y?ugadi|samvatsaradi|chaitra sukh?ladi", ugadi)
   , ( "United Nations Day", "united nations day", monthDay 10 24 )
   , ( "United Nations' Mine Awareness Day", "united nations'? mine awareness day", monthDay 4 4 )
   , ( "United Nations' World Health Day", "united nations'? world health day", monthDay 4 7 )
@@ -1565,7 +1894,7 @@
   , ( "International Day of Cooperatives"
     , "international day of co\\-?operatives", nthDOWOfMonth 1 6 7 )
   , ( "Martin Luther King's Day"
-    , "(MLK|Martin Luther King,?)( Jr\\.?| Junior)? day|(civil|idaho human) rights day"
+    , "(MLK|Martin Luther King('?s)?,?)( Jr\\.?| Junior)? day|(civil|idaho human) rights day"
     , nthDOWOfMonth 3 1 1
     )
 
@@ -1605,7 +1934,7 @@
     , cycleNthAfter False TG.Day 8 dhanteras )
   , ( "Boghi", "boghi|bogi\\s+pandigai"
     , cycleNthAfter False TG.Day (-1) thaiPongal )
-  , ( "Chinese New Year", "chinese\\s+(lunar\\s+)?new\\s+year('s\\s+day)?"
+  , ( "Chinese New Year", "chinese\\s+(lunar\\s+)?new\\s+year('?s(\\s+day)?)?"
     , chineseNewYear )
   , ( "Clean Monday"
     , "(orthodox\\s+)?(ash|clean|green|pure|shrove)\\s+monday|monday of lent"
@@ -1628,6 +1957,9 @@
     , cycleNthAfter False TG.Day 3 dhanteras )
   , ( "Good Friday", "(good|great|holy)\\s+fri(day)?"
     , cycleNthAfter False TG.Day (-2) easterSunday )
+  , ( "Guru Gobind Singh Jayanti"
+    , "guru\\s+(gobind|govind)\\s+singh\\s+(birthday|jayanti)"
+    , guruGobindSinghJayanti )
   , ( "Holi", "(rangwali )?holi|dhuleti|dhulandi|phagwah"
     , cycleNthAfter False TG.Day 39 vasantPanchami )
   , ( "Holika Dahan", "holika dahan|kamudu pyre|chhoti holi"
@@ -1646,6 +1978,7 @@
   , ( "Kaanum Pongal", "(kaanum|kanni)\\s+pongal"
     , cycleNthAfter False TG.Day 2 thaiPongal )
   , ( "Lag BaOmer", "lag b[a']omer", lagBaOmer )
+  , ( "Vaisakhi", "mesadi|[bv]aisakhi|vaisakhadi|vasakhi|vaishakhi", vaisakhi)
   , ( "Laylat al-Qadr"
     , "laylat al[\\-\\s][qk]adr|night of (destiny|measures|power|value)"
     , cycleNthAfter False TG.Day 26 ramadan )
@@ -1670,19 +2003,34 @@
     , orthodoxEaster )
   , ( "Orthodox Holy Saturday", "orthodox\\s+holy\\s+sat(urday)?|the great sabbath"
     , cycleNthAfter False TG.Day (-1) orthodoxEaster )
-  , ( "Orthodox Great Friday", "orthodox\\s+great(\\s+and\\s+holy)?\\s+friday"
+  , ( "Orthodox Good Friday", "orthodox\\s+(great|good)(\\s+and\\s+holy)?\\s+friday"
     , cycleNthAfter False TG.Day (-2) orthodoxEaster )
-  , ( "Orthodox Palm Sunday", "orthodox\\s+(branch|palm|yew\\s+sunday)"
+  , ( "Orthodox Palm Sunday", "orthodox\\s+(branch|palm|yew)\\s+sunday"
     , cycleNthAfter False TG.Day (-7) orthodoxEaster )
-  , ( "Palm Sunday", "branch|palm|yew\\s+sunday"
+  , ( "Palm Sunday", "(branch|palm|yew)\\s+sunday"
     , cycleNthAfter False TG.Day (-7) easterSunday )
   , ( "Pentecost", "pentecost|white sunday|whitsunday"
     , cycleNthAfter False TG.Day 49 easterSunday )
+  , ( "Purim", "purim", purim )
   , ( "Raksha Bandhan", "raksha(\\s+)?bandhan|rakhi", rakshaBandhan )
+  , ( "Rama Navami", "rama\\s+navami", ramaNavami)
+  , ( "Ganesh Chaturthi", "(ganesh|vinayaka)\\s+chaturthi", ganeshChaturthi )
+  , ( "Ratha-Yatra", "ratha(\\-|\\s+)?yatra|rathjatra|chariot\\s+festival"
+    , rathaYatra )
+  , ( "Pargat Diwas", "pargat diwas|(maharishi )?valmiki jayanti", pargatDiwas )
+  , ( "Mahavir Jayanti", "(mahavir|mahaveer) (jayanti|janma kalyanak)"
+    , mahavirJayanti )
+  , ( "Maha Shivaratri", "maha(\\s+)?shivaratri", mahaShivaRatri)
+  , ( "Dayananda Saraswati Jayanti","((maharishi|swami) )?(dayananda )?saraswati jayanti"
+    , saraswatiJayanti )
+  , ( "Karva Chauth", "karva\\s+chauth|karaka\\s+chaturthi"
+    , karvaChauth)
+  , ( "Krishna Janmashtami", "(krishna )?janmashtami|gokulashtami", krishnaJanmashtami )
   , ( "Shemini Atzeret", "shemini\\s+atzeret"
     , cycleNthAfter False TG.Day 21 roshHashana )
-  , ( "Shrove Tuesday", "pancake (tues)?day|shrove tuesday"
+  , ( "Shrove Tuesday", "pancake (tues)?day|shrove tuesday|mardi gras"
     , cycleNthAfter False TG.Day (-47) easterSunday )
+  , ( "Shushan Purim", "shushan\\s+purim", cycleNthAfter False TG.Day 1 purim )
   , ( "Simchat Torah", "simc?hat\\s+torah"
     , cycleNthAfter False TG.Day 22 roshHashana )
   , ( "Thai Pongal"
@@ -1706,6 +2054,10 @@
   , ( "Yom Kippur", "yom\\s+kippur", cycleNthAfter False TG.Day 9 roshHashana )
   , ( "Whit Monday", "(pentecost|whit)\\s+monday|monday of the holy spirit"
     , cycleNthAfter False TG.Day 50 easterSunday )
+  -- Rabindra Jayanti 25th day of the Bengali month of Boishakh
+  , ( "Rabindra Jayanti", "rabindra(nath)?\\s+jayanti", rabindraJayanti )
+  , ("Guru Ravidass Jayanti", "guru\\s+ravidass?\\s+(birthday|jayanti)"
+    , ravidassJayanti )
   ]
 
 ruleComputedHolidays' :: [Rule]
@@ -1750,39 +2102,40 @@
     , let start = cycleNthAfter False TG.Day 14 roshHashana
           end = cycleNthAfter False TG.Day 22 roshHashana
         in interval TTime.Open start end )
-
-  -- Other
-  -- Last Saturday of March unless it falls on Holy Saturday
-  -- In which case it's the Saturday before
+  -- Does not account for leap years, so every 365 days.
+  , ( "Parsi New Year", "parsi new year|jamshedi navroz"
+    , predEveryNDaysFrom 365 (2020, 8, 16)
+    )
   , ( "Earth Hour", "earth hour"
-    , let holySaturday = cycleNthAfter False TG.Day (-1) easterSunday
-          tentative = predLastOf (dayOfWeek 6) (month 3)
-          alternative = cycleNthAfter False TG.Day (-7) tentative
-        in do
-          day <- intersectWithReplacement holySaturday tentative alternative
-          start <- intersect day $ hourMinute True 20 30
-          interval TTime.Closed start $ cycleNthAfter False TG.Minute 60 start )
+    , computeEarthHour )
+  , ( "King's Day", "king's day|koningsdag"
+    , computeKingsDay )
   ]
 
 ruleCycleThisLastNext :: Rule
 ruleCycleThisLastNext = Rule
   { name = "this|last|next <cycle>"
   , pattern =
-    [ regex "(this|current|coming|next|the following|last|past|previous)"
+    [ regex "(this|current|coming|next|(the( following)?)|last|past|previous|upcoming)"
     , dimension TimeGrain
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):Token TimeGrain grain:_) ->
-        case Text.toLower match of
-          "this"          -> tt $ cycleNth grain 0
-          "coming"        -> tt $ cycleNth grain 0
-          "current"       -> tt $ cycleNth grain 0
-          "last"          -> tt . cycleNth grain $ - 1
-          "past"          -> tt . cycleNth grain $ - 1
-          "previous"      -> tt . cycleNth grain $ - 1
-          "next"          -> tt $ cycleNth grain 1
-          "the following" -> tt $ cycleNth grain 1
-          _ -> Nothing
+  , prod = \case
+      (
+        Token RegexMatch (GroupMatch (match:_)):
+        Token TimeGrain grain:
+        _) ->
+          case Text.toLower match of
+            "this"          -> tt $ cycleNth grain 0
+            "coming"        -> tt $ cycleNth grain 1
+            "current"       -> tt $ cycleNth grain 0
+            "last"          -> tt $ cycleNth grain $ - 1
+            "past"          -> tt $ cycleNth grain $ - 1
+            "previous"      -> tt $ cycleNth grain $ - 1
+            "next"          -> tt $ cycleNth grain 1
+            "upcoming"      -> tt $ cycleNth grain 1
+            "the following" -> tt $ cycleNth grain 1
+            "the"           -> tt $ cycleNth grain 0
+            _ -> Nothing
       _ -> Nothing
   }
 
@@ -1866,7 +2219,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token TimeGrain grain:_:Token Time td:_) -> do
         n <- getIntValue token
-        tt . cycleNthAfter True grain (-n) . cycleNthAfter True (timeGrain td) 1 $ td
+        tt $ cycleNthAfter True grain (-n) $ cycleNthAfter True (timeGrain td) 1 td
       _ -> Nothing
   }
 
@@ -1901,10 +2254,25 @@
   , prod = \tokens -> case tokens of
       (_:token:_:Token TimeGrain grain:_:Token Time td:_) -> do
         n <- getIntValue token
-        tt . cycleNthAfter True grain (-n) . cycleNthAfter True (timeGrain td) 1 $ td
+        tt $ cycleNthAfter True grain (-n) $ cycleNthAfter True (timeGrain td) 1 td
       _ -> Nothing
   }
 
+ruleCycleTheOfTimeGrain :: Rule
+ruleCycleTheOfTimeGrain = Rule
+  { name = "the <cycle> of the <time grain>"
+  , pattern =
+    [ regex "the"
+    , dimension TimeGrain
+    , regex "of( the)?"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_:Token TimeGrain time:_) ->
+        tt $ cycleNthAfter True grain 0 $ cycleNth time 0
+      _ -> Nothing
+  }
+
 ruleCycleTheOfTime :: Rule
 ruleCycleTheOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -1963,7 +2331,7 @@
   , prod = \tokens -> case tokens of
       (token:_) -> do
         n <- getIntValue token
-        tt . cycleNthAfter True TG.Quarter (n - 1) $
+        tt $ cycleNthAfter True TG.Quarter (n - 1) $
           cycleNth TG.Year 0
       _ -> Nothing
   }
@@ -1979,7 +2347,7 @@
   , prod = \tokens -> case tokens of
       (_:token:_) -> do
         n <- getIntValue token
-        tt . cycleNthAfter True TG.Quarter (n - 1) $
+        tt $ cycleNthAfter True TG.Quarter (n - 1) $
           cycleNth TG.Year 0
       _ -> Nothing
   }
@@ -2010,9 +2378,8 @@
       (Token RegexMatch (GroupMatch (match:_)):
        Token Duration dd:
        _) -> case Text.toLower match of
-         "within" -> Token Time <$>
-           interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
-         "after"  -> tt . withDirection TTime.After $ inDuration dd
+         "within" -> Token Time <$> interval TTime.Open now (inDuration dd)
+         "after"  -> tt $ withDirection TTime.After $ inDuration dd
          "in"     -> tt $ inDuration dd
          _        -> Nothing
       _ -> Nothing
@@ -2090,7 +2457,7 @@
   , pattern =
     [ Predicate $ or . sequence [isGrainOfTime TG.Day, isGrainOfTime TG.Month]
     , regex "in"
-    , dimension Duration
+    , Predicate $ isDurationGreaterThan TG.Hour
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_:Token Duration dd:_) ->
@@ -2098,6 +2465,21 @@
       _ -> Nothing
   }
 
+ruleInDurationAtTime :: Rule
+ruleInDurationAtTime = Rule
+  { name = "in <duration> at <time-of-day>"
+  , pattern =
+    [ regex "in"
+    , Predicate $ isDurationGreaterThan TG.Hour
+    , regex "at"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Duration dd:_:Token Time td:_) ->
+        Token Time <$> intersect td (inDurationInterval dd)
+      _ -> Nothing
+  }
+
 ruleInNumeral :: Rule
 ruleInNumeral = Rule
   { name = "in <number> (implicit minutes)"
@@ -2107,16 +2489,16 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
-        tt . inDuration . duration TG.Minute $ floor v
+        tt $ inDuration $ duration TG.Minute $ floor v
       _ -> Nothing
   }
 
 ruleDurationAfterBeforeTime :: Rule
 ruleDurationAfterBeforeTime = Rule
-  { name = "<duration> after|before|from <time>"
+  { name = "<duration> after|before|from|past <time>"
   , pattern =
     [ dimension Duration
-    , regex "(after|before|from)"
+    , regex "(after|before|from|past)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -2140,7 +2522,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_:Token Time td1:_) ->
-        Token Time <$> interval TTime.Open td1 (durationAfter dd td1)
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
       _ -> Nothing
 }
 
@@ -2154,7 +2536,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Time td1:_:Token Duration dd:_) ->
-        Token Time <$> interval TTime.Open td1 (durationAfter dd td1)
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
       _ -> Nothing
 }
 
@@ -2169,16 +2551,19 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td1:_:Token Duration dd:_) ->
-        Token Time <$> interval TTime.Open td1 (durationAfter dd td1)
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
       _ -> Nothing
 }
 
+timezoneName :: String
+timezoneName = "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"
+
 ruleTimezone :: Rule
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ 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"
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay, hasNoTimezone]
+    , regex $ "\\b(" ++ timezoneName ++ ")\\b"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:
@@ -2187,12 +2572,104 @@
       _ -> Nothing
   }
 
+ruleTimezoneBracket :: Rule
+ruleTimezoneBracket = Rule
+  { name = "<time> (timezone)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay, hasNoTimezone]
+    , regex $ "\\((" ++ timezoneName ++ ")\\)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> Token Time <$> inTimezone (Text.toUpper tz) td
+      _ -> Nothing
+  }
+
+ruleIntervalDashTimezone :: Rule
+ruleIntervalDashTimezone = Rule
+  { name = "<datetime> - <datetime> (interval) timezone"
+  , pattern =
+    [ Predicate $ and . sequence [isATimeOfDay, hasNoTimezone]
+    , regex "\\-|to|th?ru|through|(un)?til(l)?"
+    , Predicate $ and . sequence [isATimeOfDay, hasNoTimezone]
+    , regex $ "\\b(" ++ timezoneName ++ ")\\b"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:
+       _:
+       Token Time td2:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> do
+        tdz1 <- inTimezone (Text.toUpper tz) td1
+        tdz2 <- inTimezone (Text.toUpper tz) td2
+        Token Time <$> interval TTime.Closed tdz1 tdz2
+      _ -> Nothing
+  }
+
+ruleMidDay :: Rule
+ruleMidDay = Rule
+  { name = "Mid-day"
+  , pattern =
+    [ regex "(the )?mid(\\s)?day"
+    ]
+  , prod = \_ -> tt $ hour False 12
+  }
+
+ruleUpcomingGrain :: Rule
+ruleUpcomingGrain = Rule
+  { name = "upcoming <integer> <cycle>"
+  , pattern =
+    [ regex "upcoming"
+    , Predicate isNatural
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      ( _:
+        Token Numeral NumeralData{ TNumeral.value = numOfTimeGrain }:
+        Token TimeGrain grain:
+        _) -> tt $ cycleNth grain $ floor numOfTimeGrain
+      _ -> Nothing
+  }
+
+ruleUpcomingGrainAlt :: Rule
+ruleUpcomingGrainAlt = Rule
+  { name = "<integer> upcoming <cycle>"
+  , pattern =
+    [ Predicate isNatural
+    , regex "upcoming"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      ( Token Numeral NumeralData{ TNumeral.value = numOfTimeGrain }:
+        _:
+        Token TimeGrain grain:
+        _) -> tt $ cycleNth grain $ floor numOfTimeGrain
+      _ -> Nothing
+  }
+
+ruleMinutesToHOD :: Rule
+ruleMinutesToHOD = Rule
+  { name = "<integer> minutes to|till|before <hour-of-day>"
+  , pattern =
+    [ Predicate $ isIntegerBetween 1 59
+    , Predicate $ isGrain TG.Minute
+    , regex "to|till|before|of"
+    , Predicate isAnHourOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_:_:Token Time td:_) -> do
+        n <- getIntValue token
+        Token Time <$> minutesBefore n td
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleIntersect
   , ruleIntersectOf
   , ruleIntersectYear
-  , ruleAbsorbOnTime
+  , ruleAbsorbOnDay
   , ruleAbsorbOnADOW
   , ruleAbsorbInMonthYear
   , ruleAbsorbCommaTOD
@@ -2201,6 +2678,7 @@
   , ruleThisTime
   , ruleLastTime
   , ruleTimeBeforeLastAfterNext
+  , ruleOrdinalDOWOfTime
   , ruleLastDOWOfTime
   , ruleLastCycleOfTime
   , ruleLastNight
@@ -2209,6 +2687,7 @@
   , ruleTheNthTimeOfTime
   , ruleNthTimeAfterTime
   , ruleTheNthTimeAfterTime
+  , ruleNDOWFromTime
   , ruleYearLatent
   , ruleYearADBC
   , ruleTheDOMNumeral
@@ -2218,12 +2697,16 @@
   , ruleMonthDOMNumeral
   , ruleDOMMonth
   , ruleDOMOfMonth
+  , ruleTheDOMOfMonth
   , ruleDOMOrdinalMonthYear
+  , ruleDOMMonthYear
   , ruleIdesOfMonth
   , ruleTODLatent
   , ruleAtTOD
   , ruleTODOClock
+  , rulePODatTOD
   , ruleHHMM
+  , ruleHHhMM
   , ruleHHMMLatent
   , ruleHHMMSS
   , ruleMilitaryAMPM
@@ -2231,6 +2714,7 @@
   , ruleMilitarySpelledOutAMPM2
   , ruleTODAMPM
   , ruleHONumeral
+  , ruleHONumeralAlt
   , ruleHODHalf
   , ruleHODQuarter
   , ruleNumeralToHOD
@@ -2240,6 +2724,8 @@
   , ruleHalfAfterHOD
   , ruleQuarterAfterHOD
   , ruleHalfHOD
+  , ruleYYYYQQ
+  , ruleYYYYMM
   , ruleYYYYMMDD
   , ruleMMYYYY
   , ruleNoonMidnightEOD
@@ -2252,13 +2738,18 @@
   , ruleTimePOD
   , rulePODofTime
   , ruleWeekend
+  , ruleWeek
   , ruleTODPrecision
+  , ruleTODPOD
   , rulePrecisionTOD
   , ruleIntervalFromMonthDDDD
   , ruleIntervalFromDDDDMonth
+  , ruleIntervalFromDDDDOfMonth
   , ruleIntervalMonthDDDD
   , ruleIntervalDDDDMonth
+  , ruleIntervalYearLatent
   , ruleIntervalDash
+  , ruleIntervalSlash
   , ruleIntervalFrom
   , ruleIntervalBetween
   , ruleIntervalTODDash
@@ -2277,6 +2768,7 @@
   , ruleCycleLastOrdinalOfTime
   , ruleCycleTheOrdinalOfTime
   , ruleCycleTheLastOrdinalOfTime
+  , ruleCycleTheOfTimeGrain
   , ruleCycleTheOfTime
   , ruleCycleOrdinalAfterTime
   , ruleCycleTheOrdinalAfterTime
@@ -2289,22 +2781,32 @@
   , ruleDurationHenceAgo
   , ruleDayDurationHenceAgo
   , ruleDayInDuration
+  , ruleInDurationAtTime
   , ruleDurationAfterBeforeTime
   , ruleIntervalForDurationFrom
   , ruleIntervalFromTimeForDuration
   , ruleIntervalTimeForDuration
   , ruleInNumeral
   , ruleTimezone
+  , ruleTimezoneBracket
+  , ruleIntervalDashTimezone
   , rulePartOfMonth
   , ruleEndOrBeginningOfMonth
   , ruleEndOrBeginningOfYear
   , ruleEndOrBeginningOfWeek
   , ruleNow
+  , ruleASAP
   , ruleSeason
   , ruleEndOfMonth
   , ruleBeginningOfMonth
   , ruleEndOfYear
   , ruleBeginningOfYear
+  , ruleClosest
+  , ruleNthClosest
+  , ruleMidDay
+  , ruleUpcomingGrain
+  , ruleUpcomingGrainAlt
+  , ruleMinutesToHOD
   ]
   ++ ruleInstants
   ++ ruleDaysOfWeek
diff --git a/Duckling/Time/EN/TT/Corpus.hs b/Duckling/Time/EN/TT/Corpus.hs
--- a/Duckling/Time/EN/TT/Corpus.hs
+++ b/Duckling/Time/EN/TT/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -16,7 +15,6 @@
 
 import Duckling.Testing.Types hiding (examples)
 import Duckling.Time.Corpus
-import Duckling.Time.Types hiding (Month)
 import Duckling.TimeGrain.Types hiding (add)
 
 allExamples :: [Example]
diff --git a/Duckling/Time/EN/TT/Rules.hs b/Duckling/Time/EN/TT/Rules.hs
--- a/Duckling/Time/EN/TT/Rules.hs
+++ b/Duckling/Time/EN/TT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -22,7 +21,6 @@
 import Duckling.Regex.Types
 import Duckling.Time.Computed
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
 import qualified Duckling.TimeGrain.Types as TG
 
diff --git a/Duckling/Time/EN/US/Corpus.hs b/Duckling/Time/EN/US/Corpus.hs
--- a/Duckling/Time/EN/US/Corpus.hs
+++ b/Duckling/Time/EN/US/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -16,7 +15,6 @@
 
 import Duckling.Testing.Types hiding (examples)
 import Duckling.Time.Corpus
-import Duckling.Time.Types hiding (Month)
 import Duckling.TimeGrain.Types hiding (add)
 
 allExamples :: [Example]
@@ -83,6 +81,7 @@
              ]
   , examples (datetimeHoliday (2013, 11, 11, 0, 0, 0) Day "Veterans Day")
              [ "veterans day"
+             , "veteran day"
              ]
   , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Loyalty Day")
              [ "law day"
@@ -192,5 +191,58 @@
              ]
   , examples (datetimeHoliday (2018, 5, 23, 0, 0, 0) Day "Emergency Medical Services for Children Day")
              [ "emsc day 2018"
+             ]
+  , examples (datetimeHoliday (2017, 3, 12, 0, 0, 0) Day "Daylight Saving Start Day")
+             [ "daylight saving start day 2017"
+             , "daylight saving start 2017"
+             , "daylight savings start day 2017"
+             , "daylight savings start 2017"
+             ]
+  , examples (datetimeHoliday (2017, 11, 5, 0, 0, 0) Day "Daylight Saving End Day")
+             [ "daylight saving end day 2017"
+             , "daylight saving end 2017"
+             , "daylight savings end day 2017"
+             , "daylight savings end 2017"
+             ]
+  , examples (datetimeHoliday (2008, 2, 5, 0, 0, 0) Day "Super Tuesday")
+             [ "super tuesday 2008"
+             , "giga Tuesday"
+             , "mega giga Tuesday"
+             , "Tsunami Tuesday in 2008"
+             , "Super Duper Tuesday"
+             ]
+  , examples (datetimeHoliday (2012, 3, 6, 0, 0, 0) Day "Super Tuesday")
+             [ "super tuesday 2012"
+             , "last super tuesday"
+             , "super tuesday last year"
+             , "the second closest super tuesday to the third Sunday of 2015"
+             ]
+  , examples (datetimeHoliday (2016, 3, 1, 0, 0, 0) Day "Super Tuesday")
+             [ "super tuesday 2016"
+             , "next super tuesday"
+             , "super tuesday"
+             ]
+  , examples (datetimeHoliday (2020, 3, 3, 0, 0, 0) Day "Super Tuesday")
+             [ "super tuesday 2020"
+             , "super tuesday in seven years"
+             , "the first super tue. after 2019"
+             , "the 2nd Super Tuesday after next year"
+             , "the closest super tuesday to 2019"
+             , "the closest super tuesday to March 6, 2019"
+             ]
+  , examples (datetimeHoliday (2004, 2, 3, 0, 0, 0) Day "Mini-Tuesday")
+             [ "mini-tuesday"
+             , "Mini - Tuesday 2004"
+             , "mini tuesday nine yrs ago"
+             ]
+  , examples (datetimeHoliday (2004, 3, 2, 0, 0, 0) Day "Super Tuesday")
+             [ "the closest super tuesday to mini-tuesday"
+             ]
+  , examples (datetimeHoliday (2000, 3, 7, 0, 0, 0) Day "Super Tuesday")
+             [ "the second closest super tuesday to mini-tuesday"
+             ]
+  , examples (datetimeHoliday (2008, 2, 5, 0, 0, 0) Day "Super Tuesday")
+             [ "the 3rd closest super tuesday to mini-tuesday"
+             , "the first closest Super Tuesday to tax day 2006"
              ]
   ]
diff --git a/Duckling/Time/EN/US/Rules.hs b/Duckling/Time/EN/US/Rules.hs
--- a/Duckling/Time/EN/US/Rules.hs
+++ b/Duckling/Time/EN/US/Rules.hs
@@ -2,18 +2,14 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
-module Duckling.Time.EN.US.Rules
-  ( rules
-  , rulesBackwardCompatible
-  ) where
+module Duckling.Time.EN.US.Rules where
 
 import Data.Maybe
 import Prelude
@@ -152,7 +148,7 @@
   , ( "Texas Independence Day", "texas independence day", monthDay 3 2 )
   , ( "Thomas Jefferson's Birthday", "thomas jefferson'?s birthday", monthDay 4 13 )
   , ( "Truman Day", "truman day", monthDay 5 8 )
-  , ( "Veterans Day", "veterans day", monthDay 11 11 )
+  , ( "Veterans Day", "veterans? day", monthDay 11 11 )
   , ( "West Virginia Day", "west virginia day", monthDay 6 20 )
   , ( "White Cane Safety Day", "white cane safety day", monthDay 10 15 )
   , ( "Women's Equality Day", "women'?s equality day", monthDay 8 26 )
@@ -164,6 +160,9 @@
   , ( "Casimir Pulaski Day", "casimir pulaski day", nthDOWOfMonth 1 1 3 )
   , ( "Child Health Day", "child health day", nthDOWOfMonth 1 1 10 )
   , ( "Columbus Day", "columbus day", nthDOWOfMonth 2 1 10 )
+  , ( "Daylight Saving Start Day", "daylight savings? start( day)?", nthDOWOfMonth 2 7 3 )
+  , ( "Daylight Saving End Day", "daylight savings? end( day)?", nthDOWOfMonth 1 7 11 )
+
   -- Saturday after Labor Day
   , ( "Carl Garner Federal Lands Cleanup Day"
     , "carl garner federal lands cleanup day"
@@ -271,6 +270,23 @@
       in intersectWithReplacement emancipationDay tentative alternative )
   ]
 
+-- duplicating "Tuesday" regex as we lost the internal info
+tuesday :: String
+tuesday = "(tuesdays?|tue?\\.?)"
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Super Tuesday", "super\\s+" ++ tuesday, superTuesday )
+  , ( "Mini-Tuesday"
+    , "mini(\\s*\\-\\s*|\\s+)" ++ tuesday
+    , yearMonthDay 2004 2 3
+    )
+  , ( "Super Tuesday"
+    , "((mega\\s+)?giga|tsunami|super\\s+duper)\\s+" ++ tuesday
+    , yearMonthDay 2008 2 5
+    )
+  ]
+
 ruleComputedHolidays' :: [Rule]
 ruleComputedHolidays' = mkRuleHolidays'
   [ ( "Global Youth Service Day", "national youth service day"
@@ -289,6 +305,7 @@
 
 rules :: [Rule]
 rules = rulesBackwardCompatible
+  ++ ruleComputedHolidays
+  ++ ruleComputedHolidays'
   ++ rulePeriodicHolidays
   ++ rulePeriodicHolidays'
-  ++ ruleComputedHolidays'
diff --git a/Duckling/Time/EN/ZA/Corpus.hs b/Duckling/Time/EN/ZA/Corpus.hs
--- a/Duckling/Time/EN/ZA/Corpus.hs
+++ b/Duckling/Time/EN/ZA/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/EN/ZA/Rules.hs b/Duckling/Time/EN/ZA/Rules.hs
--- a/Duckling/Time/EN/ZA/Rules.hs
+++ b/Duckling/Time/EN/ZA/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,14 +2,14 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.ES.Corpus
   ( corpus
+    , latentCorpus
   ) where
 
 import Data.String
@@ -21,8 +21,20 @@
 import Duckling.TimeGrain.Types hiding (add)
 import Duckling.Testing.Types hiding (examples)
 
+context :: Context
+context = testContext {locale = makeLocale ES Nothing}
+
+latentCorpus :: Corpus
+latentCorpus = (context, testOptions {withLatent = True}, xs)
+  where
+    xs = concat
+      [ examples (datetime (2013, 2, 12, 13, 0, 0) Hour)
+                 [ "una hora"
+                 ]
+      ]
+
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
+corpus = (context, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -43,8 +55,63 @@
              [ "anteayer"
              , "antier"
              ]
+  {--
+    This is intentional
+    The purpose is to steer the classifier towards "tomorrow" rule
+    instead of "morning" rule.
+  --}
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
              [ "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "manana"
+             , "mañana"
+             , "manana"
+             , "mañana"
+             , "manana"
              ]
   , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
              [ "pasado mañana"
@@ -161,6 +228,11 @@
   , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
              [ "la semana que viene"
              , "la proxima semana"
+             , "semana que viene"
+             , "proxima semana"
+             , "proximas semana"
+             , "próxima semana"
+             , "siguiente semana"
              ]
   , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
              [ "el pasado mes"
@@ -205,6 +277,8 @@
   , examples (datetime (2013, 2, 12, 12, 0, 0) Hour)
              [ "mediodía"
              , "las doce"
+             , "medio dia"
+             , "medio día"
              ]
   , examples (datetime (2013, 2, 12, 12, 15, 0) Minute)
              [ "las doce y cuarto"
@@ -324,6 +398,9 @@
              [ "ano nuevo"
              , "año nuevo"
              ]
+  , examples (datetime (2013, 2, 12, 21, 0, 0) Hour)
+             [ "nueve de la noche"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
              [ "esta noche"
              ]
@@ -413,5 +490,62 @@
              ]
   , examples (datetime (2013, 8, 15, 0, 0, 0) Day)
              [ "jue 15"
+             ]
+  , examples (datetimeHoliday (2013, 12, 18, 0, 0, 0) Day "Día Mundial de la Lengua Árabe")
+             [ "dia mundial de la lengua arabe"
+             , "día mundial de la lengua árabe"
+             ]
+  , examples (datetimeHoliday (2013, 3, 1, 0, 0, 0) Day "Día de la Cero Discriminación")
+             [ "dia de la cero discriminacion"
+             , "día de la cero discriminación"
+             ]
+  , examples (datetimeHoliday (2019, 7, 6, 0, 0, 0) Day "Día Internacional de las Cooperativas")
+             [ "día internacional de las cooperativas del 2019"
+             ]
+  , examples (datetimeHoliday (2013, 11, 17, 0, 0, 0) Day "Día de la Prematuridad Mundial")
+             [ "día de la prematuridad mundial"
+             , "día mundial del prematuro"
+             , "día mundial del niño prematuro"
+             ]
+  , examples (datetimeHoliday (2013, 4, 1, 0, 0, 0) Day "Día de los Inocentes de Abril")
+             [ "día de los inocentes"
+             , "día de los inocentes de abril"
+             , "día de las bromas de abril"
+             , "día de las bromas"
+             ]
+  , examples (datetime (2013, 3, 9, 0, 0, 0) Day)
+             [ "día nueve"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "día quince"
+             ]
+  , examples (datetime (2013, 3, 11, 0, 0, 0) Day)
+             [ "día once"
+             ]
+  , examples (datetime (2013, 2, 12, 18, 2, 0) Minute)
+             [
+               "las seis cero dos pm"
+             , "las seis zero dos pm"
+             , "para las seis cero dos pm"
+             , "para las seis zero dos pm"
+             , "a las seis cero dos pm"
+             , "a las seis zero dos pm"
+             , "al las seis cero dos pm"
+             , "al las seis zero dos pm"
+             , "para las 6 0 2 pm"
+             , "a las 6 0 2 pm"
+             , "al las 6 0 2 pm"
+             , "seis cero dos pm"
+             ]
+  , examples (datetime (2013, 2, 12, 18, 2, 0) Minute)
+             [ "seis dos de la tarde"
+             ]
+  , examples (datetime (1990, 0, 0, 0, 0, 0) Year)
+             [
+               "mil novecientos noventa"
+             ]
+  , examples (datetime (1990, 5, 4, 0, 0, 0) Day)
+             [
+               "cuatro de mayo de mil novecientos noventa"
              ]
   ]
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
@@ -2,26 +2,28 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
 
 module Duckling.Time.ES.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
@@ -157,7 +159,7 @@
   , pattern =
     [ regex "(hoy)|(en este momento)"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleUltimoDayofweekDeTime :: Rule
@@ -276,24 +278,11 @@
       _ -> Nothing
   }
 
-ruleYearLatent2 :: Rule
-ruleYearLatent2 = Rule
-  { name = "year (latent)"
-  , pattern =
-    [ Predicate $ isIntegerBetween 2101 10000
-    ]
-  , prod = \tokens -> case tokens of
-      (token:_) -> do
-        v <- getIntValue token
-        tt . mkLatent $ year v
-      _ -> Nothing
-  }
-
 ruleNoon :: Rule
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "mediod(í|i)a"
+    [ regex "medio(\\s*)d(í|i)a"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -342,8 +331,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:_:token:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -359,8 +347,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:_:token:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -372,9 +359,7 @@
     , regex "menos\\s? cuarto"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> do
-        t <- minutesBefore 15 td
-        Just $ Token Time t
+      (Token Time td:_) -> Token Time <$> minutesBefore 15 td
       _ -> Nothing
   }
 
@@ -386,9 +371,7 @@
     , regex "menos\\s? media"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> do
-        t <- minutesBefore 30 td
-        Just $ Token Time t
+      (Token Time td:_) -> Token Time <$> minutesBefore 30 td
       _ -> Nothing
   }
 
@@ -400,9 +383,7 @@
     , regex "menos\\s? (3|tres) cuartos?"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> do
-        t <- minutesBefore 45 td
-        Just $ Token Time t
+      (Token Time td:_) -> Token Time <$> minutesBefore 45 td
       _ -> Nothing
   }
 
@@ -410,14 +391,14 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
+    [ Predicate $ and . sequence [isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
-       token:
+       minutes:
        _) -> do
-        n <- getIntValue token
+        n <- getIntValue minutes
         tt $ hourMinute is12H hours n
       _ -> Nothing
   }
@@ -660,7 +641,7 @@
   , prod = \tokens -> case tokens of
       (token:_) -> do
         v <- getIntValue token
-        tt . mkLatent $ hour True v
+        tt . mkLatent $ hour (v < 13) v
       _ -> Nothing
   }
 
@@ -691,7 +672,7 @@
   , pattern =
     [ regex "ahor(it)?a|ya|en\\s?seguida|cuanto antes"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleDimTimeDeLaTarde :: Rule
@@ -708,6 +689,28 @@
       _ -> Nothing
   }
 
+ruleDimTimeDeLaTarde2 :: Rule
+ruleDimTimeDeLaTarde2 = Rule
+  { name = "<time-of-day> de la tarde"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , Predicate $ isIntegerBetween 1 59
+    , regex "(a|en|de) la tarde"
+    ]
+  , prod = \case
+      (Token Time TimeData {
+          TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)
+        }:
+        minutesToken:
+       _:
+       _) -> do
+         minutes <- getIntValue minutesToken
+         let td = hourMinute is12H hours minutes
+         tarde <- interval TTime.Open (hour False 12) (hour False 21)
+         Token Time <$> intersect td (mkLatent $ partOfDay tarde)
+      _ -> Nothing
+  }
+
 ruleIntegerInThePartofday :: Rule
 ruleIntegerInThePartofday = Rule
   { name = "<integer> in the <part-of-day>"
@@ -834,8 +837,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) ->
-        Token Time <$>
-          interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -887,7 +889,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
-        tt $ notLatent td
+        tt $ mkLatent td
       _ -> Nothing
   }
 
@@ -950,8 +952,10 @@
     , Predicate isATimeOfDay
     , regex "horas?"
     ]
-  , prod = \tokens -> case tokens of
-      (_:x:_) -> Just x
+  , prod = \case
+      ( _:
+        x:
+        _) -> Just x
       _ -> Nothing
   }
 
@@ -963,8 +967,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time . partOfDay <$>
-        intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -986,8 +989,9 @@
 ruleYearLatent = Rule
   { name = "year (latent)"
   , pattern =
-    [ Predicate $ isIntegerBetween (- 10000) 999
-    ]
+      [ Predicate $
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 10000]
+      ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
         n <- getIntValue token
@@ -1152,7 +1156,7 @@
 ruleALasTimeofday = Rule
   { name = "a las <time-of-day>"
   , pattern =
-    [ regex "(al?)( las?)?|las?"
+    [ regex "((para)|(al?))( las?)?|las?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1287,6 +1291,267 @@
       _ -> Nothing
   }
 
+ruleNextWeek :: Rule
+ruleNextWeek = Rule
+  {
+    name = "next week"
+  , pattern =
+    [ Predicate $ isGrain TG.Week
+    , regex "que viene"
+    ]
+  , prod = \_ -> tt $ cycleNth TG.Week 1
+  }
+
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Día de África", "d(í|i)a de (la (libertad|liberacion) )?(á|a)frica(na)?", monthDay 5 25 )
+  , ( "Día de la Industrialización de África", "d(í|i)a de (la )?industrializaci(ó|o)n de (á|a)frica(na)?", monthDay 11 20 )
+  , ( "Día de Todos los Santos", "d(í|i)a de todos los santos", monthDay 11 1 )
+  , ( "Día de las Almas", "d(í|i)a de las almas", monthDay 11 2 )
+  , ( "Día de los Inocentes de Abril", "d(í|i)a de (los inocentes|las bromas)( de abril)?", monthDay 4 1 )
+  , ( "Día Mundial de la Lengua Árabe", "d(í|i)a mundial de la lengua (á|a)rabe", monthDay 12 18 )
+  , ( "Asunción de María", "asunci(ó|o)n de mar(í|i)a", monthDay 8 15 )
+  , ( "Día del Boxeo", "(el )?d(í|i)a del (boxeo|boxeador)", monthDay 12 26 )
+  , ( "Día de Lengua China", "d(í|i)a de lengua china", monthDay 4 20 )
+  , ( "Nochebuena", "(la (cena de )?)?(nochebuena|noche buena)", monthDay 12 24 )
+  , ( "Día de Conmemoración de las Víctimas de la Guerra Química", "d(í|i)a (de )?(conmemorativo|conmemoraci(ó|o)n) (en recuerdo )?de las v(í|i)ctimas de la guerra qu(í|i)mica", monthDay 4 29 )
+  , ( "Día de Conmemoración de las Víctimas del Genocidio de Ruanda", "d(í|i)a (de )?(conmemorativo|conmemoraci(ó|o)n) (en recuerdo )?de las v(í|i)ctimas del genocidio de ruanda", monthDay 4 7 )
+  , ( "Día de la Marina", "d(í|i)a (de la|del) marin(a|o)", monthDay 6 25 )
+  , ( "Día de la Tierra", "d(í|i)a (internacional )?de la (madre )?tierra", monthDay 4 22 )
+  , ( "Día de la Lengua Inglesa", "d(í|i)a de la lengua inglesa", monthDay 4 23 )
+  , ( "Epifanía", "Epifan(í|i)a", monthDay 1 6 )
+  , ( "Las Fiestas de San Francisco de Asís", "(las )?fiestas de san (francisco de as(í|i)s|pacho)", monthDay 10 4 )
+  , ( "Fiesta de la Inmaculada Concepción", "(d(í|i)a|fiesta) de la inmaculada concepci(ó|o)n( de (la virgen )?mar(í|i)a)?", monthDay 12 8 )
+  , ( "Día Mundial de las Madres y de los Padres", "d(í|i)a mundial de las madres y de los padres", monthDay 6 1 )
+  , ( "Día de Todos los Santos", "(d(í|i)a|festividad) de todos los santos", monthDay 10 31 )
+  , ( "Día de los Derechos Humanos", "d(í|i)a de los derechos humanos", monthDay 12 10 )
+  , ( "Día Internacional de Sensibilización sobre el Albinismo", "d(í|i)a internacional de sensibilizaci(ó|o)n sobre el albinismo", monthDay 6 13 )
+  , ( "Día Internacional contra la Corrupción", "d(í|i)a internacional contra la corrupci(ó|o)n", monthDay 12 9 )
+  , ( "Día Internacional de los Asteroides", "d(í|i)a internacional de los asteroides", monthDay 6 30 )
+  , ( "Celebra el Día Internacional de la Bisexualidad", "celebra el d(í|i)a internacional de la bisexualidad", monthDay 9 23 )
+  , ( "Día Internacional de Recordación de Desastres de Chernóbil", "d(í|i)a internacional de recordaci(ó|o)n de desastres de chern(ó|o)bil ", monthDay 4 26 )
+  , ( "Día Internacional de la Aviacion Civil", "d(í|i)a internacional de la aviacion civil", monthDay 12 7 )
+  , ( "Día Internacional de la Aduana", "d(í|i)a internacional de la(s)? aduana(s)?", monthDay 1 26 )
+  , ( "Día Internacional de la Lucha contra el Uso Indebido y el Tráfico Ilícito de Drogas", "d(í|i)a internacional de la lucha contra el uso indebido y el tr(á|a)fico il(í|i)cito de drogas", monthDay 6 26 )
+  , ( "Día Internacional contra los Ensayos Nucleares", "d(í|i)a internacional contra los ensayos nucleares", monthDay 8 29 )
+  , ( "Día Internacional de la Diversidad Biológica", "d(í|i)a internacional de la diversidad biol(ó|o)gica", monthDay 5 22 )
+  , ( "Día Internacional de los Monumentos y Sitios", "d(í|i)a internacional de los monumentos y sitios", monthDay 4 18 )
+  , ( "Día Internacional para la Prevención de la Explotación del medio ambiente en la Guerra y los Conflictos Armados", "d(í|i)a internacional para la prevenci(ó|o)n de la explotaci(ó|o)n del medio ambiente en la guerra y los conflictos armados", monthDay 11 6 )
+  , ( "Día de las Naciones Unidas para la Cooperación Sur-Sur", "d(í|i)a de las naciones unidas para la cooperaci(ó|o)n sur(\\-|\\s)sur", monthDay 9 12 )
+  , ( "Día Internacional para la Tolerancia", "d(í|i)a internacional (de|para) la tolerancia", monthDay 11 16 )
+  , ( "Día Internacional para la Abolición de la Esclavitud", "d(í|i)a internacional para la abolici(ó|o)n de la esclavitud", monthDay 12 2 )
+  , ( "Día Internacional de la Eliminación de la Discriminación Racial", "d(í|i)a internacional de la eliminaci(ó|o)n de la discriminaci(ó|o)n racial", monthDay 3 21 )
+  , ( "Día Internacional de la Eliminación de la Violencia Sexual en los Conflictos", "d(í|i)a internacional de la eliminaci(ó|o)n de la violencia sexual en los conflictos", monthDay 6 19 )
+  , ( "Día Internacional de la Eliminación de la Violencia contra la Mujer", "d(í|i)a internacional de la eliminaci(ó|o)n de la violencia contra la mujer.", monthDay 11 25 )
+  , ( "Día Internacional para la Erradicación de la Pobreza", "d(í|i)a internacional para la erradicaci(ó|o)n de la pobreza", monthDay 10 17 )
+  , ( "Día Internacional de la Preservación de la Capa de Ozono", "d(í|i)a internacional de la preservaci(ó|o)n de la capa de ozono", monthDay 9 16 )
+  , ( "Día Internacional del Recuerdo de la Trata de Esclavos y de su Abolición", "d(í|i)a internacional del recuerdo de la trata de esclavos y de su abolici(ó|o)n", monthDay 8 23 )
+  , ( "Día Internacional del Derecho a la Verdad en relación con Violaciones Graves de los Derechos Humanos y de la Dignidad de las Víctimas de las Naciones Unidas", "d(í|i)a internacional del derecho a la verdad en relaci(ó|o)n con violaciones graves de los derechos humanos y de la dignidad de las v(í|i)ctimas de las naciones unidas", monthDay 3 24 )
+  , ( "Día Internacional para la Eliminación Total de las Armas Nucleares", "d(í|i)a internacional para la eliminaci(ó|o)n total de las armas nucleares", monthDay 9 26 )
+  , ( "Día Internacional de las Naciones Unidas en Apoyo de las Víctimas de la Tortura", "d(í|i)a internacional de las naciones unidas en apoyo de las v(í|i)ctimas de la tortura", monthDay 6 26 )
+  , ( "Día Internacional de la Beneficencia", "d(í|i)a internacional de la beneficencia", monthDay 9 5 )
+  , ( "Día Internacional de Conmemoración anual en memoria de las Víctimas del Holocausto", "d(í|i)a internacional de conmemoraci(ó|o)n anual en memoria de las v(í|i)ctimas del holocausto", monthDay 1 27 )
+  , ( "Día Internacional de la Democracia", "d(í|i)a (internacional )?de la democracia", monthDay 9 15 )
+  , ( "Día Internacional de las Personas con Discapacidad", "d(í|i)a internacional de las personas con discapacidad", monthDay 12 3 )
+  , ( "Día Internacional de la Familia", "d(í|i)a internacional de la(s)? familia(s)?", monthDay 5 15 )
+  , ( "Día Internacional de las Remesas Familiares", "d(í|i)a internacional de las remesas familiares", monthDay 6 16 )
+  , ( "Día Internacional de los Bosques", "d(í|i)a internacional de los bosques", monthDay 3 21 )
+  , ( "Día Internacional de la Amistad", "d(í|i)a internacional de la amistad", monthDay 7 30 )
+  , ( "Día Internacional de la Felicidad", "d(í|i)a (internacional|mundial) de la felicidad", monthDay 3 20 )
+  , ( "Día Internacional de los Vuelos Espaciales", "d(í|i)a internacional (de los|del) vuelos espaciales", monthDay 4 12 )
+  , ( "Día Internacional de los Niños Víctimas Inocentes de Agresión", "d(í|i)a internacional de los ni(ñ|n)os v(í|i)ctimas inocentes de agresi(ó|o)n", monthDay 6 4 )
+  , ( "Día Internacional de la no Violencia", "d(í|i)a internacional de la no violencia", monthDay 10 2 )
+  , ( "Día Internacional del Nowruz", "d(í|i)a internacional del nowruz", monthDay 3 21 )
+  , ( "Día Internacional de las Personas Mayores", "d(í|i)a internacional de las personas mayores", monthDay 10 1 )
+  , ( "Dia Internacional de la Paz", "d(í|i)a internacional de la paz", monthDay 9 21 )
+  , ( "Día Internacional de las Personas con Discapacidad", "d(í|i)a internacional de las personas con discapacidad", monthDay 12 3 )
+  , ( "Día Internacional de Recuerdo de las Víctimas de la Esclavitud y la Trata Transatlántica de Esclavos", "d(í|i)a internacional de recuerdo de las v(í|i)ctimas de la esclavitud y la trata transatl(á|a)ntica de esclavos", monthDay 3 25 )
+  , ( "Día Internacional de las Mujeres Rurales", "d(í|i)a internacional de las mujeres rurales", monthDay 10 15 )
+  , ( "Día Internacional de Solidaridad con los miembros del Personal Detenidos o Desaparecidos", "d(í|i)a internacional de solidaridad con los miembros del personal detenidos o desaparecidos", monthDay 3 25 )
+  , ( "Día Internacional de Solidaridad con el Pueblo Palestino", "d(í|i)a internacional de solidaridad con el pueblo palestino", monthDay 11 29 )
+  , ( "Día Internacional del Deporte para el Desarrollo y la Paz", "d(í|i)a internacional del deporte para el desarrollo y la paz", monthDay 4 6 )
+  , ( "Día Internacional del Personal de Paz de las Naciones Unidas", "d(í|i)a internacional del personal de paz de las naciones unidas", monthDay 5 29 )
+  , ( "Día Internacional de la Mujer y la Niña en la Ciencia", "d(í|i)a internacional de la mujer y la ni(ñ|n)a en la ciencia", monthDay 2 11 )
+  , ( "Día Internacional del Yoga", "d(í|i)a Internacional del Yoga", monthDay 6 21 )
+  , ( "Día Internacional de Tolerancia Cero con la Mutilación Genital Femenina", "d(í|i)a internacional de tolerancia cero con la mutilaci(ó|o)n genital femenina", monthDay 2 6 )
+  , ( "Día Internacional de la Niña", "d(í|i)a internacional de la ni(ñ|n)a", monthDay 10 11 )
+  , ( "Día Internacional de las Víctimas de Desapariciones Forzadas", "d(í|i)a internacional de las v(í|i)ctimas de desapariciones forzadas", monthDay 8 30 )
+  , ( "Día Internacional de los Pueblos Indígenas del Mundo", "d(í|i)a internacional de los pueblos ind(í|i)genas del mundo", monthDay 8 9 )
+  , ( "Día Internacional para poner fin a la Impunidad de los Crímenes contra Periodistas", "d(í|i)a internacional para poner fin a la impunidad de los cr(í|i)menes contra periodistas", monthDay 11 2 )
+  , ( "Día Internacional para la Erradicación de la Fístula Obstétrica", "d(í|i)a internacional para la erradicaci(ó|o)n de la f(í|i)stula obst(é|e)trica", monthDay 5 23 )
+  , ( "Día Internacional para la Reducción de los Desastres Naturales", "d(í|i)a internacional para la reducci(ó|o)n de los desastres (naturales)?", monthDay 10 13 )
+  , ( "Día Internacional de la Solidaridad Humana", "d(í|i)a internacional de la solidaridad humana", monthDay 12 20 )
+  , ( "Día Internacional del Jazz", "d(í|i)a internacional del jazz", monthDay 4 30 )
+  , ( "Día Internacional de la Alfabetización", "d(í|i)a internacional de la alfabetizaci(ó|o)n", monthDay 9 8 )
+  , ( "Día Internacional del Hombre", "d(í|i)a internacional de(l)? los hombre(s)?", monthDay 11 19 )
+  , ( "Día Internacional del Migrante", "d(í|i)a internacional del migrante", monthDay 12 18 )
+  , ( "Día Internacional de la Lengua Materna", "d(í|i)a (internacional|mundial) de la lengua materna", monthDay 2 21 )
+  , ( "Día Internacional de las Montañas", "d(í|i)a internacional de las monta(ñ|n)as", monthDay 12 11 )
+  , ( "Día Internacional de las Enfermeras", "d(í|i)a internacional de las enfermeras", monthDay 5 12 )
+  , ( "Día de la Conciencia Internacional sobre la Sobredosis", "ioad|d(í|i)a de (la )?conciencia internacional (de|sobre) la sobredosis", monthDay 8 31 )
+  , ( "Día Internacional del Voluntariado para el Desarrollo Económico y Social", "d(í|i)a internacional del voluntariado para el desarrollo econ(ó|o)mico y social", monthDay 12 5 )
+  , ( "Día Internacional de las Viudas", "d(í|i)a internacional de las viudas", monthDay 6 23 )
+  , ( "Día Internacional de la Mujer", "d(í|i)a internacional de la mujer", monthDay 3 8 )
+  , ( "Día Internacional de la Juventud", "d(í|i)a internacional de la juventud", monthDay 8 12 )
+  , ( "El Primero de Mayo", "(el )?primero de mayo", monthDay 5 1 )
+  , ( "Día Internacional de Nelson Mandela", "d(í|i)a (internacional )?de nelson mandela", monthDay 7 18 )
+  , ( "La Navidad Ortodoxa", "(la )?navidad ortodoxa", monthDay 1 7 )
+  , ( "Año Nuevo Ortodoxo", "(el )?(a(ñ|n)o nuevo viejo|a(ñ|n)o viejo ortodoxo|a(ñ|n)o nuevo ortodoxo|a(ñ|n)o nuevo juliano)", monthDay 1 14 )
+  , ( "Día Mundial de los Servicios Públicos", "d(í|i)a (mundial|nacional) de(l)? (los )?(servicios|servidor) p(ú|u)blico(s)?", monthDay 6 23 )
+  , ( "Día de San Jorge", "d(í|i)a de san jorge|fiesta de san jorge", monthDay 4 23 )
+  , ( "Día de San Patricio", "d(í|i)a de san patricio", monthDay 3 17 )
+  , ( "Dia de San Esteban", "d(í|i)a de san esteban", monthDay 12 26 )
+  , ( "Día Internacional del Tiempo del Recuerdo y la Reconciliación para Quienes Perdieron la Vida durante la Segunda Guerra Mundial", "d(í|i)a internacional del tiempo del recuerdo y la reconciliaci(ó|o)n para quienes perdieron la vida durante la segunda guerra mundial", monthDay 5 8 )
+  , ( "Día de las Naciones Unidas", "d(í|i)a de las naciones unidas", monthDay 10 24 )
+  , ( "Día Internacional de Información sobre el Peligro de las Minas y de Asistencia para las Actividades Relativas a las Minas", "d(í|i)a internacional de informaci(ó|o)n sobre el peligro de las minas y de asistencia para las actividades relativas a las minas", monthDay 4 4 )
+  , ( "Día Mundial de la Salud", "d(í|i)a mundial de la salud( de las naciones unidas)?", monthDay 4 7 )
+  , ( "Día Universal del Niño", "d(í|i)a universal del ni(ñ|n)o", monthDay 11 20 )
+  , ( "Día de San Valentín", "(el )?d(í|i)a de san valent(í|i)n", monthDay 2 14 )
+  , ( "Día Mundial de la lucha contra el SIDA", "d(í|i)a mundial de(l)? (la lucha contra el )?SIDA", monthDay 12 1 )
+  , ( "Día Mundial de Concienciación sobre el Autismo", "d(í|i)a mundial de(l)? (concienciaci(ó|o)n sobre el )?autismo", monthDay 4 2 )
+  , ( "Día Mundial de la Artritis Reumatoide", "d(í|i)a mundial de la artritis( reumatoide)?", monthDay 5 20 )
+  , ( "Día Mundial del Donante de Sangre", "d(í|i)a mundial del donante de sangre", monthDay 6 14 )
+  , ( "Día Internacional del Libro y del Derecho de Autor", "d(í|i)a internacional del libro y de(l)? (los )?derecho(s)? de autor", monthDay 4 23 )
+  , ( "Día Mundial del Braille", "d(í|i)a mundial del braille", monthDay 1 4 )
+  , ( "Día Mundial contra el Cáncer", "d(í|i)a mundial contra el c(á|a)ncer", monthDay 2 4 )
+  , ( "Día Mundial de las Ciudades", "d(í|i)a mundial de las ciudades", monthDay 10 31 )
+  , ( "Día Mundial de la PC", "d(í|i)a mundial (de la|del) (PC|Paralisia Cerebral)", monthDay 10 6 )
+  , ( "Día Mundial contra el Trabajo Infantil", "d(í|i)a mundial contra el trabajo infantil", monthDay 6 12 )
+  , ( "Día Mundial contra la Trata de Personas", "d(í|i)a mundial contra la trata de personas", monthDay 7 30 )
+  , ( "Día Mundial del Patrimonio Audiovisual", "d(í|i)a mundial (del|sobre el) patrimonio audiovisual", monthDay 10 27 )
+  , ( "Día Mundial de la Diversidad Cultural para el Diálogo y el Desarrollo", "d(í|i)a mundial de la diversidad cultural para el diálogo y el desarrollo", monthDay 5 21 )
+  , ( "Día Mundial de la Seguridad y la Salud en el Trabajo", "d(í|i)a mundial de la seguridad y la salud en el trabajo", monthDay 4 28 )
+  , ( "Día Mundial por la Abolición de la Esclavitud", "d(í|i)a (internacional|mundial) (para|por) la abolici(ó|o)n de la esclavitud", monthDay 12 2 )
+  , ( "Día Mundial de la Justicia Social", "d(í|i)a mundial de la justicia social", monthDay 2 20 )
+  , ( "Día Mundial del Enfermo", "d(í|i)a mundial (del|de los) enfermos", monthDay 2 11 )
+  , ( "Día Mundial de Lucha contra la Desertificación y la Sequía", "d(í|i)a mundial (de lucha contra|para combatir) la desertificaci(ó|o)n y la sequ(í|i)a", monthDay 6 17 )
+  , ( "Día Mundial de Información sobre el Desarrollo", "d(í|i)a mundial de informaci(ó|o)n sobre el desarrollo", monthDay 10 24 )
+  , ( "Día Mundial de la Diabetes", "d(í|i)a mundial de la diabetes", monthDay 11 14 )
+  , ( "Día Mundial del Síndrome de Down", "d(í|i)a mundial del s(í|i)ndrome de down", monthDay 3 21 )
+  , ( "Día Mundial de Toma de Conciencia del Abuso y Maltrato en la Vejez", "d(í|i)a mundial de toma de conciencia del abuso y maltrato en la vejez", monthDay 6 15 )
+  , ( "Día Mundial del Medio Ambiente", "d(í|i)a mundial del medio ambiente", monthDay 6 5 )
+  , ( "Día Mundial de la Alimentación", "d(í|i)a mundial de la alimentaci(ó|o)n", monthDay 10 16 )
+  , ( "Día para la Conmemoración y Dignificación de las Víctimas del Crimen de Genocidio y para su Prevención", "d(í|i)a para la conmemoraci(ó|o)n y dignificaci(ó|o)n de las v(í|i)ctimas del crimen de genocidio y para su prevenci(ó|o)n", monthDay 12 9 )
+  , ( "Día Mundial del Corazón", "d(í|i)a mundial del coraz(ó|o)n", monthDay 9 29 )
+  , ( "Día Mundial de la Hepatitis", "d(í|i)a mundial (contra|de) la hepatitis", monthDay 7 28 )
+  , ( "Día Mundial de la Asistencia Humanitaria", "d(í|i)a mundial de la asistencia humanitaria", monthDay 8 19 )
+  , ( "Día Internacional de la Sociedad de la Información", "d(í|i)a (internacional|mundial) de (las telecomunicaciones y )?la sociedad de la informaci(ó|o)n", monthDay 5 17 )
+  , ( "Día Mundial de la Propiedad Intelectual", "d(í|i)a mundial de la propiedad intelectual", monthDay 4 26 )
+  , ( "Día Mundial de la Malaria", "d(í|i)a mundial (de la|del) (malaria|paludismo)", monthDay 4 25 )
+  , ( "Día Mundial de la Salud Mental", "d(í|i)a mundial de la salud mental", monthDay 10 10 )
+  , ( "Día Mundial de la Meteorología", "d(í|i)a (mundial de (la )?meteorolog(í|i)a|meteorol(ó|o)gico mundial)", monthDay 3 23 )
+  , ( "Día Mundial sin Tabaco", "d(í|i)a mundial sin tabaco", monthDay 5 31 )
+  , ( "Dia Mundial de los Océanos", "d(í|i)a mundial de los oc(é|e)anos", monthDay 6 8 )
+  , ( "Día Mundial del Cáncer de Ovario", "d(í|i)a mundial del c(á|a)ncer de ovario", monthDay 5 8 )
+  , ( "Día Mundial contra la Neumonía", "d(í|i)a mundial (contra|de) la neumon(í|i)a", monthDay 11 12 )
+  , ( "Dia Mundial de la Poesia", "d(í|i)a mundial de la poesia", monthDay 3 21 )
+  , ( "Día Mundial de la Población", "d(í|i)a mundial de la poblaci(ó|o)n", monthDay 7 11 )
+  , ( "Día Mundial del Correo", "d(í|i)a mundial del correo", monthDay 10 9 )
+  , ( "Día de la Prematuridad Mundial", "d(í|i)a (de la prematuridad mundial|mundial del (ni(ñ|n)o )?prematuro)", monthDay 11 17 )
+  , ( "Día Mundial de la Libertad de Prensa", "d(í|i)a mundial de la libertad de prensa", monthDay 5 3 )
+  , ( "Día Mundial contra la Rabia", "d(í|i)a mundial (contra|de) la rabia", monthDay 9 28 )
+  , ( "Día Mundial de la Radio", "d(í|i)a mundial de la radio", monthDay 2 13 )
+  , ( "Día Mundial de los Refugiados", "d(í|i)a mundial (del|de los) refugiado(s)?", monthDay 6 20 )
+  , ( "Día Mundial de la Ciencia para la Paz y el Desarrollo", "d(í|i)a mundial de la ciencia para la paz y el desarrollo", monthDay 11 10 )
+  , ( "Día Mundial de la Salud Sexual", "dmss|d(í|i)a mundial de la salud sexual", monthDay 9 4 )
+  , ( "Día Mundial del Suelo", "d(í|i)a mundial del suelo", monthDay 12 5 )
+  , ( "Día Mundial del Accidente Cerebrovascular", "d(í|i)a mundial del (accidente cerebrovascular|acv)", monthDay 10 29 )
+  , ( "Día Mundial para la Prevención del Suicidio", "d(í|i)a mundial para la prevenci(ó|o)n del suicidio", monthDay 9 10 )
+  , ( "Día Mundial de los Docentes", "d(í|i)a mundial (de los docentes|del maestro)", monthDay 10 5 )
+  , ( "Día Mundial de la Televisión", "d(í|i)a mundial de la televisi(ó|o)n", monthDay 11 21 )
+  , ( "Día Mundial del Baño", "d(í|i)a mundial del (ba(ñ|n)o|retrete)", monthDay 11 19 )
+  , ( "Día Mundial del Turismo", "dmt|d(í|i)a mundial del turismo", monthDay 9 27 )
+  , ( "Día Mundial de la Tuberculosis", "d(í|i)a mundial de (lucha contra)?la (tuberculosis|tb)", monthDay 3 24 )
+  , ( "Día Mundial del Atun", "d(í|i)a mundial del atun", monthDay 5 2 )
+  , ( "Día Mundial del Veganismo", "d(í|i)a mundial del veganismo", monthDay 11 1 )
+  , ( "Día Mundial del Vegetarianismo", "d(í|i)a mundial del vegetarianismo", monthDay 10 1 )
+  , ( "Día Mundial del Agua", "d(í|i)a mundial del agua", monthDay 3 22 )
+  , ( "Día Mundial de los Humedales", "d(í|i)a mundial de los humedales", monthDay 2 2 )
+  , ( "Día Mundial de la Vida Silvestre", "d(í|i)a mundial de la vida silvestre", monthDay 3 3 )
+  , ( "Día Mundial de las Habilidades de la Juventud", "d(í|i)a mundial de las habilidades de la juventud", monthDay 7 15 )
+  , ( "Día de la Cero Discriminación", "d(í|i)a de la cero discriminaci(ó|o)n", monthDay 3 1 )
+
+  -- Fixed day/week/month, year over year
+  , ( "Día de la Commonwealth", "d(í|i)a de la commonwealth", nthDOWOfMonth 2 1 3 )
+  , ( "Día Mundial en Recuerdo de las Víctimas de Accidentes de Tráfico"
+    , "d(í|i)a (mundial )?en recuerdo de las v(í|i)ctimas (de accidentes )?de tr(á|a)fico"
+    , nthDOWOfMonth 3 7 11 )
+  , ( "Día Internacional de las Cooperativas"
+    , "d(í|i)a internacional de las cooperativas", nthDOWOfMonth 1 6 7 )
+  , ( "Día de Martin Luther King"
+    , "(MLK|d(í|i)a de Martin Luther King,?)( Jr\\.?| J(ú|u)nior)?|d(í|i)a de los derechos humanos en Idaho"
+    , nthDOWOfMonth 3 1 1
+    )
+
+  -- The day after Thanksgiving (not always the fourth Friday of November)
+  , ( "Viernes negro", "viernes negro"
+    , cycleNthAfter False TG.Day 1 $ nthDOWOfMonth 4 4 11
+    )
+  , ( "Día Mundial del Hábitat", "d(í|i)a mundial del h(á|a)bitat", nthDOWOfMonth 1 1 10 )
+  , ( "Día Mundial del Riñón", "d(í|i)a mundial del ri(ñ|n)(ó|o)n", nthDOWOfMonth 2 4 3 )
+  , ( "Día Mundial de la Lepra", "d(í|i)a mundial (contra|de) la lepra"
+    , predLastOf (dayOfWeek 7) (month 1) )
+  , ( "Día Marítimo Mundial", "d(í|i)a mar(í|i)timo mundial"
+    , predLastOf (dayOfWeek 4) (month 9) )
+  , ( "Día Mundial de las Aves Migratorias", "d(í|i)a mundial de las aves migratorias"
+    , nthDOWOfMonth 2 6 5 )
+  , ( "Día mundial de la filosofía", "d(í|i)a mundial de la filosof(í|i)a", nthDOWOfMonth 3 4 11 )
+  , ( "Día mundial de la religion", "d(í|i)a mundial de la(s)? religion(es)?", nthDOWOfMonth 3 7 1 )
+  , ( "Día mundial de la vista", "d(í|i)a mundial de la (vista|visi(ó|o)n)", nthDOWOfMonth 2 4 10 )
+
+  -- Other
+  , ( "Día del jefe", "(el )?d(í|i)a (nacional )?del jefe"
+    , predNthClosest 0 weekday (monthDay 10 16) )
+  ]
+
+ruleElDayofmonthNonOrdinalWithDia :: Rule
+ruleElDayofmonthNonOrdinalWithDia = Rule
+  { name = "dia <day-of-month> (non ordinal)"
+  , pattern =
+    [ regex "día"
+    , Predicate $ isIntegerBetween 1 31
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> do
+        v <- getIntValue token
+        tt $ dayOfMonth v
+      _ -> Nothing
+  }
+
+ruleNextWeekAlt :: Rule
+ruleNextWeekAlt = Rule
+  {
+    name = "next week (alt)"
+  , pattern =
+    [
+      regex "pr(ó|o)xim(o|a)s?|siguientes?"
+    , Predicate $ isGrain TG.Week
+    ]
+  , prod = \_ -> tt $ cycleNth TG.Week 1
+  }
+
+ruleYearByAddingThreeNumbers :: Rule
+ruleYearByAddingThreeNumbers = Rule
+  { name    = "year (value by adding three composing numbers together)"
+  , pattern =
+    [
+      regex "mil"
+    , Predicate $ isIntegerBetween 100 1000
+    , Predicate $ isIntegerBetween 1 100
+    ]
+  , prod    = \case
+      (
+        _:
+        t1:
+        t2:
+        _) -> do
+          v1 <- getIntValue t1
+          v2 <- getIntValue t2
+          tt $ year $ 1000 + v1 + v2
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleALasHourmintimeofday
@@ -1307,6 +1572,7 @@
   , ruleDentroDeDuration
   , ruleDimTimeDeLaManana
   , ruleDimTimeDeLaTarde
+  , ruleDimTimeDeLaTarde2
   , ruleElCycleAntesTime
   , ruleElCycleProximoqueViene
   , ruleElCycleProximoqueVieneTime
@@ -1363,7 +1629,6 @@
   , ruleWeekend
   , ruleYear
   , ruleYearLatent
-  , ruleYearLatent2
   , ruleYesterday
   , ruleYyyymmdd
   , ruleHourofdayAndThreeQuarter
@@ -1379,7 +1644,12 @@
   , ruleHourofdayMinusQuarter
   , ruleHourofdayMinusIntegerAsRelativeMinutes2
   , ruleTimezone
+  , ruleElDayofmonthNonOrdinalWithDia
+  , ruleNextWeek
+  , ruleNextWeekAlt
+  , ruleYearByAddingThreeNumbers
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
   ++ ruleSeasons
+  ++ rulePeriodicHolidays
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -709,36 +708,40 @@
              , "13 juillet au 15 juillet"
              , "13 juillet - 15 juillet"
              , "entre le 13 et le 15 juillet"
-             , "samedi 13 au dimanche 15 juillet"
+             , "samedi 13 au dimanche 15e juillet"
              , "du samedi 13 au dimanche 15 juillet"
              , "du 13 au dimanche 15 juillet"
+             , "entre le 13 et le quinze juillet"
+             , "du treize au 15 juillet"
+             , "du 13e au 15 juillet"
              ]
   , examples (datetimeInterval ((2013, 7, 1, 0, 0, 0), (2013, 7, 11, 0, 0, 0)) Day)
              [ "1er au 10 juillet"
              , "lundi 1er au mercredi 10 juillet"
-             , "lundi 1 au mercredi 10 juillet"
+             , "lundi 1 au mercredi 10e juillet"
              , "du lundi 1er au mercredi 10 juillet"
              , "du 1er au mercredi 10 juillet"
+             , "du 1er au dix juillet"
+             , "1er au dix juillet"
              ]
   , examples (datetimeInterval ((2013, 2, 13, 0, 0, 0), (2013, 2, 19, 0, 0, 0)) Day)
              [ "du 13 au 18"
-             , "entre le 13 et le 18"
+             , "entre le 13 et le dix-huit"
+             , "du 13e au dix-huit"
              ]
   , examples (datetimeInterval ((2013, 6, 10, 0, 0, 0), (2013, 7, 2, 0, 0, 0)) Day)
              [ "10 juin au 1er juillet"
              , "entre le 10 juin et le 1er juillet"
              , "du 10 juin au 1er juillet"
              ]
-  , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 12, 0, 0)) Minute)
+  , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 11, 1, 0)) Minute)
              [ "de 9h30 jusqu'à 11h jeudi"
              , "de 9 heures 30 à 11h jeudi"
              , "de 9 heures 30 a 11h jeudi"
              , "entre 9h30 et 11h jeudi"
              , "jeudi mais entre 9h30 et 11h"
              , "jeudi par exemple entre 9h30 et 11h"
-             ]
-  , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 11, 1, 0)) Minute)
-             [ "9h30 - 11h00 Jeudi"
+             , "9h30 - 11h00 Jeudi"
              ]
   , examples (datetimeOpenInterval After (2013, 3, 8, 0, 0, 0) Day)
              [ "à partir du 8"
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
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -33,7 +33,7 @@
   , pattern =
     [ regex "(aujourd'? ?hui)|(ce jour)|(dans la journ(é|e)e?)|(en ce moment)"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleDayofmonthNamedmonth :: Rule
@@ -202,7 +202,7 @@
   { name = "le lendemain du <time>"
   , pattern =
     [ regex "(le|au)? ?lendemain du"
-    , dimension Time
+    , Predicate $ isGrainCoarserThan TG.Hour
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -219,7 +219,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+        intersect today td
       _ -> Nothing
   }
 
@@ -231,8 +231,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ predNth 0 False td
+      (_:Token Time td:_) -> tt $ predNth 0 False td
       _ -> Nothing
   }
 
@@ -273,24 +272,6 @@
       _ -> Nothing
   }
 
-ruleDatetimeddMonthinterval :: Rule
-ruleDatetimeddMonthinterval = Rule
-  { name = "<datetime>-dd <month>(interval)"
-  , pattern =
-    [ dimension Time
-    , regex "\\-|au|jusqu'au"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
-    , Predicate isAMonth
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Time td1:_:Token RegexMatch (GroupMatch (match:_)):Token Time td2:_) -> do
-        n <- parseInt match
-        from <- intersect td2 td1
-        to <- intersect (dayOfMonth n) td2
-        Token Time <$> interval TTime.Closed from to
-      _ -> Nothing
-  }
-
 ruleDeTimeofdayTimeofdayInterval :: Rule
 ruleDeTimeofdayTimeofdayInterval = Rule
   { name = "de <time-of-day> - <time-of-day> (interval)"
@@ -358,31 +339,120 @@
     , regex "et"
     , dimension Time
     ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td1:_:Token Time td2:_) ->
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_)
+        | sameGrain td1 td2 ->
         Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
   }
 
+ruleDuDatetimedayofweekDdMonthinterval :: Rule
+ruleDuDatetimedayofweekDdMonthinterval = Rule
+  { name = "du <datetime>-<day-of-week> dd <month>(interval)"
+  , pattern =
+    [ regex "du"
+    , dimension Time
+    , regex "\\-|(jusqu')?au"
+    , Predicate isADayOfWeek
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:Token Time td1:_:_:token:Token Time td2:_) -> do
+        from <- intersect td2 td1
+        to <- intersectDOM td2 token
+        Token Time <$> interval TTime.Closed from to
+      _ -> Nothing
+  }
+
+ruleDuDdAuDdLatentMonthInterval :: Rule
+ruleDuDdAuDdLatentMonthInterval = Rule
+  { name = "du dd au dd (interval) (latent month)"
+  , pattern =
+    [ regex "du"
+    , Predicate isDOMValue
+    , regex "(jusqu')?au"
+    , Predicate isDOMValue
+    ]
+  , prod = \case
+      (_:token1:_:token2:_) -> do
+        n1 <- getIntValue token1
+        n2 <- getIntValue token2
+        Token Time <$> interval TTime.Closed (dayOfMonth n1) (dayOfMonth n2)
+      _ -> Nothing
+  }
+
 ruleDatetimedayofweekDdMonthinterval :: Rule
 ruleDatetimedayofweekDdMonthinterval = Rule
   { name = "<datetime>-<day-of-week> dd <month>(interval)"
   , pattern =
-    [ dimension Time
+    [ Predicate $ isGrainOfTime TG.Day
     , regex "\\-|(jusqu')?au"
     , Predicate isADayOfWeek
-    , regex "(3[01]|[12]\\d|0?[1-9])"
+    , Predicate isDOMValue
     , Predicate isAMonth
     ]
-  , prod = \tokens -> case tokens of
-      (Token Time td1:_:_:Token RegexMatch (GroupMatch (match:_)):Token Time td2:_) -> do
-        n <- parseInt match
+  , prod = \case
+      (Token Time td1:_:_:token:Token Time td2:_) -> do
         from <- intersect td2 td1
-        to <- intersect (dayOfMonth n) td2
+        to <- intersectDOM td2 token
         Token Time <$> interval TTime.Closed from to
       _ -> Nothing
   }
 
+ruleEntreDdEtDdMonthinterval :: Rule
+ruleEntreDdEtDdMonthinterval = Rule
+  { name = "entre dd et dd <month>(interval)"
+  , pattern =
+    [ regex "entre( le)?"
+    , Predicate isDOMValue
+    , regex "et( le)?"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:token1:_:token2:Token Time td:_) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
+ruleDatetimeddMonthinterval :: Rule
+ruleDatetimeddMonthinterval = Rule
+  { name = "<datetime>-dd <month>(interval)"
+  , pattern =
+    [ Predicate $ isGrainOfTime TG.Day
+    , regex "\\-|(jusqu')?au"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (Token Time td1:_:token:Token Time td2:_) -> do
+        from <- intersect td2 td1
+        to <- intersectDOM td2 token
+        Token Time <$> interval TTime.Closed from to
+      _ -> Nothing
+  }
+
+ruleDuDdAuDdMonthInterval :: Rule
+ruleDuDdAuDdMonthInterval = Rule
+  { name = "du dd/nth au dd/nth month (interval)"
+  , pattern =
+    [ regex "du"
+    , Predicate isDOMValue
+    , regex "\\-|au|jusqu'(au?|à)"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:token1:_:token2:Token Time td:_) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
 ruleHhhmmTimeofday :: Rule
 ruleHhhmmTimeofday = Rule
   { name = "hh(:|h)mm (time-of-day)"
@@ -448,8 +518,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) ->
-        Token Time <$>
-          interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -695,8 +764,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:_:token:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -708,9 +776,7 @@
     , regex "moins( le)? quart"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> do
-        t <- minutesBefore 15 td
-        Just $ Token Time t
+      (Token Time td:_) -> Token Time <$> minutesBefore 15 td
       _ -> Nothing
   }
 
@@ -786,7 +852,7 @@
 ruleNamedmonthnameddayDernierpass = Rule
   { name = "<named-month|named-day> dernier|passé"
   , pattern =
-    [ dimension Time
+    [ Predicate $ isGrainCoarserThan TG.Hour
     , regex "derni(e|é|è)re?|pass(é|e)e?"
     ]
   , prod = \tokens -> case tokens of
@@ -839,7 +905,7 @@
   { name = "dd-dd <month>(interval)"
   , pattern =
     [ regex "(3[01]|[12]\\d|0?[1-9])"
-    , regex "\\-|au|jusqu'au"
+    , regex "\\-|(jusqu')?au"
     , regex "(3[01]|[12]\\d|0?[1-9])"
     , Predicate isAMonth
     ]
@@ -872,7 +938,7 @@
   , pattern =
     [ regex "du"
     , regex "(3[01]|[12]\\d|0?[1-9])"
-    , regex "\\-|au|jusqu'au"
+    , regex "\\-|(jusqu')?au"
     , Predicate isADayOfWeek
     , regex "(3[01]|[12]\\d|0?[1-9])"
     , Predicate isAMonth
@@ -973,7 +1039,7 @@
 ruleDemain = Rule
   { name = "demain"
   , pattern =
-    [ regex "(demain)|(le lendemain)"
+    [ regex "(le len)?demain"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -982,7 +1048,7 @@
 ruleNamedmonthnameddaySuivantdaprs = Rule
   { name = "<named-month|named-day> suivant|d'après"
   , pattern =
-    [ dimension Time
+    [ Predicate $ isGrainCoarserThan TG.Hour
     , regex "suivante?s?|d'apr(e|é|è)s"
     ]
   , prod = \tokens -> case tokens of
@@ -1035,7 +1101,7 @@
 
 ruleAprsTimeofday :: Rule
 ruleAprsTimeofday = Rule
-  { name = "après <time-of-day>"
+  { name = "après <time-of-day|day>"
   , pattern =
     [ regex "(apr(e|è)s|(a|à) partir de|(un peu )?plus tard que)"
     , dimension Time
@@ -1053,9 +1119,8 @@
     [ regex "apr(e|è)s (le )?d(e|é|è)jeuner"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleIntersect :: Rule
@@ -1105,7 +1170,8 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td1:_:Token Time td2:_) ->
+      (_:Token Time td1:_:Token Time td2:_)
+        | sameGrain td1 td2 ->
         Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
   }
@@ -1139,9 +1205,8 @@
     [ regex "apr(e|è)s (le )?travail"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLeDayofmonthDatetime :: Rule
@@ -1151,7 +1216,7 @@
     [ regex "le"
     , Predicate isDOMInteger
     , regex "(a|à)"
-    , dimension Time
+    , Predicate $ isGrainFinerThan TG.Day
     ]
   , prod = \tokens -> case tokens of
       (_:token:_:Token Time td:_) -> do
@@ -1218,9 +1283,8 @@
     [ regex "avant (le )?d(e|é|è)jeuner"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 10) (hour False 12)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleDernierWeekendDeTime :: Rule
@@ -1254,7 +1318,7 @@
 ruleDimTimePartofday = Rule
   { name = "<dim time> <part-of-day>"
   , pattern =
-    [ dimension Time
+    [ Predicate $ isGrainOfTime TG.Day
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1389,43 +1453,6 @@
       _ -> Nothing
   }
 
-ruleDuDatetimedayofweekDdMonthinterval :: Rule
-ruleDuDatetimedayofweekDdMonthinterval = Rule
-  { name = "du <datetime>-<day-of-week> dd <month>(interval)"
-  , pattern =
-    [ regex "du"
-    , dimension Time
-    , regex "\\-|au|jusqu'au"
-    , Predicate isADayOfWeek
-    , regex "(3[01]|[12]\\d|0?[1-9])"
-    , Predicate isAMonth
-    ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td1:_:_:Token RegexMatch (GroupMatch (m:_)):Token Time td2:_) -> do
-        n <- parseInt m
-        from <- intersect td2 td1
-        to <- intersect (dayOfMonth n) td2
-        Token Time <$> interval TTime.Closed from to
-      _ -> Nothing
-  }
-
-ruleDuDdAuDdinterval :: Rule
-ruleDuDdAuDdinterval = Rule
-  { name = "du dd au dd(interval)"
-  , pattern =
-    [ regex "du"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
-    , regex "au|jusqu'au"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
-    ]
-  , prod = \tokens -> case tokens of
-      (_:Token RegexMatch (GroupMatch (m1:_)):_:Token RegexMatch (GroupMatch (m2:_)):_) -> do
-        n1 <- parseInt m1
-        n2 <- parseInt m2
-        Token Time <$> interval TTime.Closed (dayOfMonth n1) (dayOfMonth n2)
-      _ -> Nothing
-  }
-
 ruleMatin :: Rule
 ruleMatin = Rule
   { name = "matin"
@@ -1554,31 +1581,6 @@
       _ -> Nothing
   }
 
-ruleEntreDdEtDdMonthinterval :: Rule
-ruleEntreDdEtDdMonthinterval = Rule
-  { name = "entre dd et dd <month>(interval)"
-  , pattern =
-    [ regex "entre( le)?"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
-    , regex "et( le)?"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
-    , Predicate isAMonth
-    ]
-  , prod = \tokens -> case tokens of
-      (_:
-       Token RegexMatch (GroupMatch (m1:_)):
-       _:
-       Token RegexMatch (GroupMatch (m2:_)):
-       Token Time td:
-       _) -> do
-        n1 <- parseInt m1
-        n2 <- parseInt m2
-        from <- intersect (dayOfMonth n1) td
-        to <- intersect (dayOfMonth n2) td
-        Token Time <$> interval TTime.Closed from to
-      _ -> Nothing
-  }
-
 ruleAprsdemain :: Rule
 ruleAprsdemain = Rule
   { name = "après-demain"
@@ -1643,7 +1645,7 @@
   , pattern =
     [ regex "maintenant|tout de suite"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleDdmmyyyy :: Rule
@@ -1704,7 +1706,7 @@
   { name = "le veille du <time>"
   , pattern =
     [ regex "(la )?veille du"
-    , dimension Time
+    , Predicate $ isGrainCoarserThan TG.Hour
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -1805,7 +1807,7 @@
   , pattern =
     [ Predicate isADayOfWeek
     , regex "premier|prem\\.?|1er|1 er"
-    , regex "\\-|au|jusqu'au"
+    , regex "\\-|(jusqu')?au"
     , Predicate isADayOfWeek
     , regex "(3[01]|[12]\\d|0?[1-9])"
     , Predicate isAMonth
@@ -1974,7 +1976,8 @@
   , ruleDimTimeDuSoir
   , ruleDimTimePartofday
   , ruleDuDatetimedayofweekDdMonthinterval
-  , ruleDuDdAuDdinterval
+  , ruleDuDdAuDdLatentMonthInterval
+  , ruleDuDdAuDdMonthInterval
   , ruleDuDddayofweekDdMonthinterval
   , ruleDudansLePartofday
   , ruleDurationApresTime
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,18 +10,20 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.GA.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import qualified Duckling.TimeGrain.Types as TG
 import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleArInn :: Rule
 ruleArInn = Rule
@@ -48,7 +49,7 @@
   , pattern =
     [ regex "inniu"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleAnOrdinalCycleINdiaidhTime :: Rule
@@ -454,7 +455,7 @@
   , pattern =
     [ regex "anois|(ag an (t-?)?am seo)"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleLFhilePdraig :: Rule
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
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
@@ -2,15 +2,15 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.HE.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Maybe
 import Data.String
@@ -19,12 +19,13 @@
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Numeral.Types (NumeralData (..))
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -168,8 +169,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        tt t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -210,8 +210,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesAfter n td
-        tt t
+        Token Time <$> minutesAfter n td
       _ -> Nothing
   }
 
@@ -356,7 +355,7 @@
   , pattern =
     [ regex "עכשיו|מייד"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleCurrentDayofweek :: Rule
@@ -468,7 +467,7 @@
   , pattern =
     [ regex "היום"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleBetweenTimeofdayAndTimeofdayInterval :: Rule
@@ -678,7 +677,7 @@
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      Token Time . partOfDay <$> intersect today td
   }
 
 ruleBetweenDatetimeAndDatetimeInterval :: Rule
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -446,26 +445,26 @@
              [ "ove zime"
              , "zimus"
              ]
-  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "christmas")
              [ "Bozic"
              , "zicbo"
              ]
-  , examples (datetime (2013, 12, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 31, 0, 0, 0) Day "new year's eve")
              [ "stara godina"
              ]
-  , examples (datetime (2014, 1, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "new year's day")
              [ "nova godina"
              ]
-  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 2, 14, 0, 0, 0) Day "valentine's day")
              [ "valentinovo"
              ]
-  , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
              [ "majcin dan"
              ]
-  , examples (datetime (2013, 6, 16, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
              [ "dan oceva"
              ]
-  , examples (datetime (2013, 10, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 31, 0, 0, 0) Day "halloween day")
              [ "noc vjestica"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -20,12 +19,13 @@
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Numeral.Types (NumeralData (..))
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -59,6 +59,26 @@
   , ( "December" , "prosina?c(a|u)?|decemba?r(a|u)?|dec\\.?|pros?\\.?|dvanaest(i|a|o(ga?)?)" )
   ]
 
+ruleHolidays :: [Rule]
+ruleHolidays = mkRuleHolidays
+  [ ( "new year's eve" , "star(a|u|e) godin(a|e|u)"             , monthDay 12 31     )
+  , ( "new year's day" , "nov(a|u|e) godin(a|e|u)"              , monthDay 1 1       )
+  , ( "christmas eve"  , "badnjaka?"                            , monthDay 12 24     )
+  , ( "christmas"      , "(zi(c|ć)bo|bo(z|ž)i(c|ć))(a|u|ni|na)?", monthDay 12 25     )
+  , ( "halloween day"  , "no(c|ć) vje(s|š)tica"                 , monthDay 10 31     )
+  , ( "Mother's Day"   , "maj(c|č)in dan"                       , nthDOWOfMonth 2 7 5)
+  , ( "Father's Day"   , "dan (o(c|č)eva|tata)"                 , nthDOWOfMonth 3 7 6)
+  , ( "valentine's day", "valentinov(og?|a|)"                   , monthDay 2 14      )
+  ]
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ("summer", "ljet(os?|a)"     , monthDay 6 21 , monthDay 9 23 )
+  , ("fall"  , "jesen(i|as)?"    , monthDay 9 23 , monthDay 12 21)
+  , ("winter", "zim(a|e|us)?"    , monthDay 12 21, monthDay 3 20 )
+  , ("spring", "prolje(c|ć)(e|a)", monthDay 3 20 , monthDay 6 21 )
+  ]
+
 ruleHalfIntegerHrStyleHourofday :: Rule
 ruleHalfIntegerHrStyleHourofday = Rule
   { name = "half <integer> (HR style hour-of-day)"
@@ -82,8 +102,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -122,8 +141,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesAfter n td
-        Just $ Token Time t
+        Token Time <$> minutesAfter n td
       _ -> Nothing
   }
 
@@ -239,15 +257,6 @@
       _ -> Nothing
   }
 
-ruleValentinesDay :: Rule
-ruleValentinesDay = Rule
-  { name = "valentine's day"
-  , pattern =
-    [ regex "valentinov(og?|a|)"
-    ]
-  , prod = \_ -> Just . Token Time $ monthDay 2 14
-  }
-
 ruleSinceTimeofday :: Rule
 ruleSinceTimeofday = Rule
   { name = "since <time-of-day>"
@@ -260,25 +269,16 @@
       _ -> Nothing
   }
 
-ruleNewYearsDay :: Rule
-ruleNewYearsDay = Rule
-  { name = "new year's day"
-  , pattern =
-    [ regex "nov(a|u|e) godin(a|e|u)"
-    ]
-  , prod = \_ -> Just . Token Time $ monthDay 1 1
-  }
-
 ruleLastTime :: Rule
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
     [ regex "(prethodn(i|u|a|e|o(ga?)?)|pro(s|š)l(ih?|u|a|e|o(ga?)?))"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
-        Just . Token Time $ predNth (-1) False td
+        tt $ predNth (-1) False td
       _ -> Nothing
   }
 
@@ -306,7 +306,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_:Token Time td:_) ->
-        Just . Token Time $ cycleNthAfter False grain 1 td
+        tt $ cycleNthAfter False grain 1 td
       _ -> Nothing
   }
 
@@ -318,7 +318,7 @@
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Duration dd:_) -> Just . Token Time $ inDuration dd
+      (_:Token Duration dd:_) -> tt $ inDuration dd
       _ -> Nothing
   }
 
@@ -328,7 +328,7 @@
   , pattern =
     [ regex "((upravo|ov(aj?|og?|e|i))? ?sada?|trenutak|upravo|trenutno)|(ov(aj|og) trena?)"
     ]
-  , prod = \_ -> Just . Token Time $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleLastCycleOfTime :: Rule
@@ -342,7 +342,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_:Token Time td:_) ->
-        Just . Token Time $ cycleLastOf grain td
+        tt $ cycleLastOf grain td
       _ -> Nothing
   }
 
@@ -384,16 +384,6 @@
       _ -> Nothing
   }
 
-ruleSeason4 :: Rule
-ruleSeason4 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "prolje(c|ć)(e|a)"
-    ]
-  , prod = \_ ->
-      Token Time <$> interval TTime.Open (monthDay 3 20) (monthDay 6 21)
-  }
-
 ruleYearLatent2 :: Rule
 ruleYearLatent2 = Rule
   { name = "year (latent)"
@@ -415,7 +405,7 @@
     , regex "nakon sljede(ć|c)(i|e|a)(ga?)?"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> Just . Token Time $ predNth 1 True td
+      (Token Time td:_) -> tt $ predNth 1 True td
       _ -> Nothing
   }
 
@@ -425,7 +415,7 @@
   , pattern =
     [ regex "(u )?podne(va)?"
     ]
-  , prod = \_ -> Just . Token Time $ hour False 12
+  , prod = \_ -> tt $ hour False 12
   }
 
 ruleEarlyMorning :: Rule
@@ -444,7 +434,7 @@
   , pattern =
     [ regex "danas?|(dana(s|š)nj(i|eg) dana?) "
     ]
-  , prod = \_ -> Just . Token Time $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleThisnextDayofweek :: Rule
@@ -455,7 +445,7 @@
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ predNth 0 True td
+      (_:Token Time td:_) -> tt $ predNth 0 True td
       _ -> Nothing
   }
 
@@ -482,7 +472,7 @@
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
-      (_:Token TimeGrain grain:_) -> Just . Token Time $ cycleNth grain 1
+      (_:Token TimeGrain grain:_) -> tt $ cycleNth grain 1
       _ -> Nothing
   }
 
@@ -506,7 +496,7 @@
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Duration dd:_) -> Just . Token Time $ inDuration dd
+      (_:Token Duration dd:_) -> tt $ inDuration dd
       _ -> Nothing
   }
 
@@ -521,7 +511,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td1:_:Token Time td2:_) ->
-        Just . Token Time $ predLastOf td1 td2
+        tt $ predLastOf td1 td2
       _ -> Nothing
   }
 
@@ -533,7 +523,7 @@
     , regex "od (sada?|ovog trenutka|dana(s|š)nj(i|eg) dana?)"
     ]
   , prod = \tokens -> case tokens of
-      (Token Duration dd:_) -> Just . Token Time $ inDuration dd
+      (Token Duration dd:_) -> tt $ inDuration dd
       _ -> Nothing
   }
 
@@ -555,7 +545,7 @@
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
-      (_:Token TimeGrain grain:_) -> Just . Token Time . cycleNth grain $ - 1
+      (_:Token TimeGrain grain:_) -> tt . cycleNth grain $ - 1
       _ -> Nothing
   }
 
@@ -592,7 +582,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
-        Just . Token Time $ predNth (-2) False td
+        tt $ predNth (-2) False td
       _ -> Nothing
   }
 
@@ -618,15 +608,6 @@
       _ -> Nothing
   }
 
-ruleChristmasEve :: Rule
-ruleChristmasEve = Rule
-  { name = "christmas eve"
-  , pattern =
-    [ regex "badnjaka?"
-    ]
-  , prod = \_ -> Just . Token Time $ monthDay 12 24
-  }
-
 ruleInduringThePartofday :: Rule
 ruleInduringThePartofday = Rule
   { name = "in|during the <part-of-day>"
@@ -635,7 +616,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ notLatent td
+      (_:Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
@@ -744,26 +725,6 @@
       _ -> Nothing
   }
 
-ruleSeason3 :: Rule
-ruleSeason3 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "zim(a|e|us)?"
-    ]
-  , prod = \_ ->
-      Token Time <$> interval TTime.Open (monthDay 12 21) (monthDay 3 20)
-  }
-
-ruleSeason :: Rule
-ruleSeason = Rule
-  { name = "season"
-  , pattern =
-    [ regex "ljet(os?|a)"
-    ]
-  , prod = \_ ->
-      Token Time <$> interval TTime.Open (monthDay 6 21) (monthDay 9 23)
-  }
-
 ruleUNamedday :: Rule
 ruleUNamedday = Rule
   { name = "u <named-day>"
@@ -791,15 +752,6 @@
       _ -> Nothing
   }
 
-ruleNewYearsEve :: Rule
-ruleNewYearsEve = Rule
-  { name = "new year's eve"
-  , pattern =
-    [ regex "star(a|u|e) godin(a|e|u)"
-    ]
-  , prod = \_ -> Just . Token Time $ monthDay 12 31
-  }
-
 ruleByTheEndOfTime :: Rule
 ruleByTheEndOfTime = Rule
   { name = "by the end of <time>"
@@ -808,8 +760,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -821,8 +772,7 @@
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+      Token Time . partOfDay . notLatent <$> intersect today td
   }
 
 ruleLastDayofweekTime2 :: Rule
@@ -835,7 +785,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td1:Token Time td2:_) ->
-        Just . Token Time $ predLastOf td1 td2
+        tt $ predLastOf td1 td2
       _ -> Nothing
   }
 
@@ -863,7 +813,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -873,7 +823,7 @@
   , pattern =
     [ regex "(u )?pono(c|ć)i?|(the )?(EOD|((do )? kraja? dana))"
     ]
-  , prod = \_ -> Just . Token Time $ hour False 0
+  , prod = \_ -> tt $ hour False 0
   }
 
 ruleDayofmonthNonOrdinalNamedmonth :: Rule
@@ -920,7 +870,7 @@
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ withDirection TTime.Before td
+      (_:Token Time td:_) -> tt $ withDirection TTime.Before td
       _ -> Nothing
   }
 
@@ -932,7 +882,7 @@
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ notLatent td
+      (_:Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
@@ -969,7 +919,7 @@
   , pattern =
     [ regex "(za )?vikenda?"
     ]
-  , prod = \_ -> tt weekend
+  , prod = \_ -> tt $ mkOkForThisNext weekend
   }
 
 rulePrijeDuration :: Rule
@@ -980,7 +930,7 @@
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Duration dd:_) -> Just . Token Time $ durationAgo dd
+      (_:Token Duration dd:_) -> tt $ durationAgo dd
       _ -> Nothing
   }
 
@@ -992,7 +942,7 @@
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Duration dd:_) -> Just . Token Time $ inDuration dd
+      (_:Token Duration dd:_) -> tt $ inDuration dd
       _ -> Nothing
   }
 
@@ -1002,7 +952,7 @@
   , pattern =
     [ regex "(the )?(EOM|(do )? kraja mjeseca)"
     ]
-  , prod = \_ -> Just . Token Time $ cycleNth TG.Month 1
+  , prod = \_ -> tt $ cycleNth TG.Month 1
   }
 
 ruleNameddayDayofmonthOrdinal :: Rule
@@ -1022,10 +972,10 @@
   { name = "next <time>"
   , pattern =
     [ regex "sljede(c|ć)(i|u|a|e(ga?)?)"
-    , Predicate isNotLatent
+    , Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ predNth 0 True td
+      (_:Token Time td:_) -> tt $ predNth 0 True td
       _ -> Nothing
   }
 
@@ -1093,7 +1043,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+        intersect today td
       _ -> Nothing
   }
 
@@ -1105,7 +1055,7 @@
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
-      (_:Token TimeGrain grain:_) -> Just . Token Time $ cycleNth grain 0
+      (_:Token TimeGrain grain:_) -> tt $ cycleNth grain 0
       _ -> Nothing
   }
 
@@ -1126,10 +1076,10 @@
   { name = "this <time>"
   , pattern =
     [ regex "ov(aj?|og?|e)(sad)?"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ predNth 0 False td
+      (_:Token Time td:_) -> tt $ predNth 0 False td
       _ -> Nothing
   }
 
@@ -1166,7 +1116,7 @@
   , pattern =
     [ regex "(prekju(c|č)er)"
     ]
-  , prod = \_ -> Just . Token Time . cycleNth TG.Day $ - 2
+  , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
 
 ruleAfterLunch :: Rule
@@ -1177,8 +1127,7 @@
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+      Token Time . partOfDay . notLatent <$> intersect today td
   }
 
 ruleYearLatent :: Rule
@@ -1201,17 +1150,7 @@
   , pattern =
     [ regex "(ju(c|č)er)"
     ]
-  , prod = \_ -> Just . Token Time . cycleNth TG.Day $ - 1
-  }
-
-ruleSeason2 :: Rule
-ruleSeason2 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "jesen(i|as)?"
-    ]
-  , prod = \_ ->
-      Token Time <$> interval TTime.Open (monthDay 9 23) (monthDay 12 21)
+  , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
 
 ruleAfterTimeofday :: Rule
@@ -1222,19 +1161,10 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ withDirection TTime.After td
+      (_:Token Time td:_) -> tt $ withDirection TTime.After td
       _ -> Nothing
   }
 
-ruleChristmas :: Rule
-ruleChristmas = Rule
-  { name = "christmas"
-  , pattern =
-    [ regex "(zi(c|ć)bo|bo(z|ž)i(c|ć))(a|u|ni|na)?"
-    ]
-  , prod = \_ -> Just . Token Time $ monthDay 12 25
-  }
-
 ruleDayofmonthOrdinal :: Rule
 ruleDayofmonthOrdinal = Rule
   { name = "<day-of-month>. (ordinal)"
@@ -1260,7 +1190,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Ordinal od:Token TimeGrain grain:_:Token Time td:_) ->
-        Just . Token Time $ cycleNthAfter True grain (TOrdinal.value od - 1) td
+        tt $ cycleNthAfter True grain (TOrdinal.value od - 1) td
       _ -> Nothing
   }
 
@@ -1275,7 +1205,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Ordinal od:Token TimeGrain grain:_:Token Time td:_) ->
-        Just . Token Time $ cycleNthAfter True grain (TOrdinal.value od - 1) td
+        tt $ cycleNthAfter True grain (TOrdinal.value od - 1) td
       _ -> Nothing
   }
 
@@ -1287,7 +1217,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ predNth 1 True td
+      (_:Token Time td:_) -> tt $ predNth 1 True td
       _ -> Nothing
   }
 
@@ -1297,7 +1227,7 @@
   , pattern =
     [ regex "(preko?sutra)"
     ]
-  , prod = \_ -> Just . Token Time $ cycleNth TG.Day 2
+  , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
 ruleHhmm :: Rule
@@ -1321,7 +1251,6 @@
     [ regex "(na)?ve(c|č)er(as)?"
     ]
   , prod = \_ -> do
-      let today = cycleNth TG.Day 0
       evening <- interval TTime.Open (hour False 18) (hour False 0)
       Token Time . partOfDay . notLatent <$> intersect today evening
   }
@@ -1334,7 +1263,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Just . Token Time $ predNth (-2) False td
+      (_:Token Time td:_) -> tt $ predNth (-2) False td
       _ -> Nothing
   }
 
@@ -1365,15 +1294,6 @@
       _ -> Nothing
   }
 
-ruleHalloweenDay :: Rule
-ruleHalloweenDay = Rule
-  { name = "halloween day"
-  , pattern =
-    [ regex "no(c|ć) vje(s|š)tica"
-    ]
-  , prod = \_ -> Just . Token Time $ monthDay 10 31
-  }
-
 ruleNamedmonthDayofmonthNonOrdinal :: Rule
 ruleNamedmonthDayofmonthNonOrdinal = Rule
   { name = "<named-month> <day-of-month> (non ordinal)"
@@ -1398,15 +1318,6 @@
       _ -> Nothing
   }
 
-ruleFathersDay :: Rule
-ruleFathersDay = Rule
-  { name = "Father's Day"
-  , pattern =
-    [ regex "dan (o(c|č)eva|tata)"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 3 7 6
-  }
-
 ruleByTime :: Rule
 ruleByTime = Rule
   { name = "by <time>"
@@ -1415,8 +1326,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Open (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1430,7 +1340,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_:Token Time td:_) ->
-        Just . Token Time $ cycleNthAfter False grain (-1) td
+        tt $ cycleNthAfter False grain (-1) td
       _ -> Nothing
   }
 
@@ -1473,7 +1383,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_:Token Time td:_) ->
-        Just . Token Time $ durationAfter dd td
+        tt $ durationAfter dd td
       _ -> Nothing
   }
 
@@ -1483,7 +1393,7 @@
   , pattern =
     [ regex "(na)?ve(c|č)er(i|as)?"
     ]
-  , prod = \_ -> Token Time . partOfDay . mkLatent <$>
+  , prod = \_ -> Token Time . mkOkForThisNext . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 18) (hour False 0)
   }
 
@@ -1508,7 +1418,7 @@
   , pattern =
     [ regex "(prek\\s?prekju(c|č)er)"
     ]
-  , prod = \_ -> Just . Token Time . cycleNth TG.Day $ - 3
+  , prod = \_ -> tt . cycleNth TG.Day $ - 3
   }
 
 ruleDurationBeforeTime :: Rule
@@ -1521,7 +1431,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_:Token Time td:_) ->
-        Just . Token Time $ durationBefore dd td
+        tt $ durationBefore dd td
       _ -> Nothing
   }
 
@@ -1531,7 +1441,7 @@
   , pattern =
     [ regex "(the )?(EOY|(do )? kraja? godine)"
     ]
-  , prod = \_ -> Just . Token Time $ cycleNth TG.Year 1
+  , prod = \_ -> tt $ cycleNth TG.Year 1
   }
 
 ruleTomorrow :: Rule
@@ -1540,16 +1450,7 @@
   , pattern =
     [ regex "(sutra(dan)?)"
     ]
-  , prod = \_ -> Just . Token Time $ cycleNth TG.Day 1
-  }
-
-ruleMothersDay :: Rule
-ruleMothersDay = Rule
-  { name = "Mother's Day"
-  , pattern =
-    [ regex "maj(c|č)in dan"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 2 7 5
+  , prod = \_ -> tt $ cycleNth TG.Day 1
   }
 
 ruleTimeofdayOclock :: Rule
@@ -1560,7 +1461,7 @@
     , regex "sat(i|a)?"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> Just . Token Time $ notLatent td
+      (Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
@@ -1626,8 +1527,6 @@
   , ruleBetweenTimeofdayAndTimeofdayInterval
   , ruleByTheEndOfTime
   , ruleByTime
-  , ruleChristmas
-  , ruleChristmasEve
   , ruleCycleAfterTime
   , ruleCycleBeforeTime
   , ruleDatetimeDatetimeInterval
@@ -1650,12 +1549,10 @@
   , ruleEoyendOfYear
   , ruleEveningnight
   , ruleExactlyTimeofday
-  , ruleFathersDay
   , ruleForDuration
   , ruleFromDatetimeDatetimeInterval
   , ruleFromTimeofdayTimeofdayInterval
   , ruleHalfIntegerHrStyleHourofday
-  , ruleHalloweenDay
   , ruleHhmm
   , ruleHhmmMilitaryPrefixedWithMToAvoidAmbiguityWithYears
   , ruleHhmmss
@@ -1674,12 +1571,9 @@
   , ruleMidnighteodendOfDay
   , ruleMonthDdddInterval
   , ruleMorning
-  , ruleMothersDay
   , ruleNameddayDayofmonthOrdinal
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
-  , ruleNewYearsDay
-  , ruleNewYearsEve
   , ruleNextCycle
   , ruleNextNCycle
   , ruleNextTime
@@ -1701,10 +1595,6 @@
   , ruleHourofdayNumeral
   , ruleHourofdayQuarter
   , ruleHourofdayHalf
-  , ruleSeason
-  , ruleSeason2
-  , ruleSeason3
-  , ruleSeason4
   , ruleSinceTimeofday
   , ruleThisCycle
   , ruleThisPartofday
@@ -1724,7 +1614,6 @@
   , ruleUNamedday
   , ruleUNamedmonth
   , ruleUntilTimeofday
-  , ruleValentinesDay
   , ruleWeekend
   , ruleWithinDuration
   , ruleYear
@@ -1739,3 +1628,5 @@
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ ruleHolidays
+  ++ ruleSeasons
diff --git a/Duckling/Time/HU/Corpus.hs b/Duckling/Time/HU/Corpus.hs
--- a/Duckling/Time/HU/Corpus.hs
+++ b/Duckling/Time/HU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/HU/Rules.hs b/Duckling/Time/HU/Rules.hs
--- a/Duckling/Time/HU/Rules.hs
+++ b/Duckling/Time/HU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/Helpers.hs b/Duckling/Time/Helpers.hs
--- a/Duckling/Time/Helpers.hs
+++ b/Duckling/Time/Helpers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -13,9 +12,10 @@
 module Duckling.Time.Helpers
   ( -- Patterns
     hasNoDirection, isADayOfWeek, isAMonth, isAnHourOfDay, isAPartOfDay
-  , isATimeOfDay, isDOMInteger, isDOMOrdinal, isDOMValue, isGrain
-  , isGrainFinerThan, isGrainOfTime, isIntegerBetween, isNotLatent
-  , isOrdinalBetween, isMidnightOrNoon, isOkWithThisNext
+  , isATimeOfDay, isDurationGreaterThan, isDOMInteger, isDOMOrdinal, isDOMValue
+  , isGrainFinerThan, isGrainCoarserThan, isGrainOfTime
+  , isIntegerBetween, isNotLatent , isOrdinalBetween, isMidnightOrNoon
+  , isOkWithThisNext, sameGrain, hasTimezone, hasNoTimezone, today
     -- Production
   , cycleLastOf, cycleN, cycleNth, cycleNthAfter, dayOfMonth, dayOfWeek
   , durationAfter, durationAgo, durationBefore, mkOkForThisNext, form, hour
@@ -23,10 +23,11 @@
   , inTimezone, longWEBefore, minute, minutesAfter, minutesBefore, mkLatent
   , month, monthDay, notLatent, now, nthDOWOfMonth, partOfDay, predLastOf
   , predNth, predNthAfter, predNthClosest, season, second, timeOfDayAMPM
-  , weekday, weekend, withDirection, year, yearMonthDay, tt, durationIntervalAgo
-  , inDurationInterval, intersectWithReplacement, yearADBC
+  , weekday, weekend, workweek, withDirection, year, yearMonthDay, tt, durationIntervalAgo
+  , inDurationInterval, intersectWithReplacement, yearADBC, yearMonth
+  , predEveryNDaysFrom, timeCycle
     -- Other
-  , getIntValue, timeComputed
+  , getIntValue, timeComputed, toTimeObjectM
   -- Rule constructors
   , mkRuleInstants, mkRuleDaysOfWeek, mkRuleMonths, mkRuleMonthsWithLatent
   , mkRuleSeasons, mkRuleHolidays, mkRuleHolidays'
@@ -39,7 +40,6 @@
 import Data.Tuple.Extra (both)
 import Prelude
 import qualified Data.Time as Time
-import qualified Data.Time.Calendar.WeekDate as Time
 import qualified Data.Time.LocalTime.TimeZone.Series as Series
 
 import Duckling.Dimensions.Types
@@ -266,18 +266,28 @@
 -- -----------------------------------------------------------------
 -- Patterns
 
-isGrain :: TG.Grain -> Predicate
-isGrain value (Token TimeGrain grain) = grain == value
-isGrain _ _ = False
-
 isGrainFinerThan :: TG.Grain -> Predicate
 isGrainFinerThan value (Token Time TimeData{TTime.timeGrain = g}) = g < value
 isGrainFinerThan _ _ = False
 
+isGrainCoarserThan :: TG.Grain -> Predicate
+isGrainCoarserThan value (Token Time TimeData{TTime.timeGrain = g}) = g > value
+isGrainCoarserThan _ _ = False
+
 isGrainOfTime :: TG.Grain -> Predicate
 isGrainOfTime value (Token Time TimeData{TTime.timeGrain = g}) = g == value
 isGrainOfTime _ _ = False
 
+sameGrain :: TimeData -> TimeData -> Bool
+sameGrain TimeData{TTime.timeGrain = g} TimeData{TTime.timeGrain = h} = g == h
+
+hasTimezone :: Predicate
+hasTimezone (Token Time TimeData{TTime.hasTimezone = tz}) = tz
+hasTimezone _ = False
+
+hasNoTimezone :: Predicate
+hasNoTimezone = not . hasTimezone
+
 isADayOfWeek :: Predicate
 isADayOfWeek (Token Time td) = case TTime.form td of
   Just TTime.DayOfWeek -> True
@@ -332,6 +342,10 @@
   TOrdinal.isBetween (TOrdinal.value od) low high
 isOrdinalBetween _ _ _ = False
 
+isDurationGreaterThan :: TG.Grain -> Predicate
+isDurationGreaterThan value (Token Duration DurationData{TDuration.grain = grain}) = grain > value
+isDurationGreaterThan _ _ = False
+
 isDOMOrdinal :: Predicate
 isDOMOrdinal = isOrdinalBetween 1 31
 
@@ -358,9 +372,9 @@
 
 intersectWithReplacement :: TimeData -> TimeData -> TimeData -> Maybe TimeData
 intersectWithReplacement
-  (TimeData pred1 _ g1 _ _ _ _ h1)
-  (TimeData pred2 _ g2 _ _ _ _ h2)
-  (TimeData pred3 _ g3 _ _ _ _ h3)
+  (TimeData pred1 _ g1 _ _ _ _ h1 _)
+  (TimeData pred2 _ g2 _ _ _ _ h2 _)
+  (TimeData pred3 _ g3 _ _ _ _ h3 _)
   | g1 == g2 && g2 == g3 = Just $ TTime.timedata'
     { TTime.timePred = timeComposeWithReplacement pred1 pred2 pred3
     , TTime.timeGrain = g1
@@ -370,7 +384,7 @@
   | otherwise = Nothing
 
 intersect' :: (TimeData, TimeData) -> TimeData
-intersect' (TimeData pred1 _ g1 _ _ d1 _ h1, TimeData pred2 _ g2 _ _ d2 _ h2)
+intersect' (TimeData pred1 _ g1 _ _ d1 _ h1 _, TimeData pred2 _ g2 _ _ d2 _ h2 _)
   | g1 < g2 = TTime.timedata'
     { TTime.timePred = timeCompose pred1 pred2
     , TTime.timeGrain = g1
@@ -389,6 +403,9 @@
   where
     td = cycleNth TG.Second 0
 
+today :: TimeData
+today = cycleNth TG.Day 0
+
 hour :: Bool -> Int -> TimeData
 hour is12H n = timeOfDay (Just n) is12H $ TTime.timedata'
   {TTime.timePred = timeHour is12H n, TTime.timeGrain = TG.Hour}
@@ -426,8 +443,11 @@
 yearADBC n =
   TTime.timedata'{TTime.timePred = timeYear n, TTime.timeGrain = TG.Year}
 
+yearMonth :: Int -> Int -> TimeData
+yearMonth y m = intersect' (year y, month m)
+
 yearMonthDay :: Int -> Int -> Int -> TimeData
-yearMonthDay y m d = intersect' (intersect' (year y, month m), dayOfMonth d)
+yearMonthDay y m d = intersect' (yearMonth y m, dayOfMonth d)
 
 monthDay :: Int -> Int -> TimeData
 monthDay m d = intersect' (month m, dayOfMonth d)
@@ -496,10 +516,12 @@
 
 -- Generalized version of `cycleNthAfter` with custom predicate
 predNthAfter :: Int -> TimeData -> TimeData -> TimeData
-predNthAfter n TimeData {TTime.timePred = p, TTime.timeGrain = g} base =
+predNthAfter n TimeData
+  {TTime.timePred = p, TTime.timeGrain = g, TTime.holiday = h} base =
   TTime.timedata'
     { TTime.timePred = takeNthAfter n True p $ TTime.timePred base
     , TTime.timeGrain = g
+    , TTime.holiday = h
     }
 
 -- This function can be used to express predicates invoving "closest",
@@ -513,8 +535,32 @@
     , TTime.holiday = h
     }
 
+-- This function is used for periodic events, for example,
+-- "every 365 days" or "every 8 years".
+-- `given` is a known example of the event.
+-- Do not export
+predEveryFrom :: TG.Grain -> Int -> TTime.TimeObject -> TimeData
+predEveryFrom periodGrain period given = TTime.timedata'
+    { TTime.timePred = TTime.periodicPredicate periodGrain period given
+    , TTime.timeGrain = TTime.grain given
+    }
+
+predEveryNDaysFrom :: Int -> (Integer, Int, Int) -> Maybe TimeData
+predEveryNDaysFrom period given = do
+  date <- toTimeObjectM given
+  return $ predEveryFrom TG.Day period date
+
+toTimeObjectM :: (Integer, Int, Int) -> Maybe TTime.TimeObject
+toTimeObjectM (year, month, day) = do
+  day <- Time.fromGregorianValid year month day
+  return TTime.TimeObject
+    { TTime.start = Time.UTCTime day 0
+    , TTime.grain = TG.Day
+    , TTime.end = Nothing
+    }
+
 interval' :: TTime.TimeIntervalType -> (TimeData, TimeData) -> TimeData
-interval' intervalType (TimeData p1 _ g1 _ _ _ _ _, TimeData p2 _ g2 _ _ _ _ _) =
+interval' intervalType (TimeData p1 _ g1 _ _ _ _ _ _, TimeData p2 _ g2 _ _ _ _ _ _) =
   TTime.timedata'
     { TTime.timePred = mkTimeIntervalsPredicate intervalType' p1 p2
     , TTime.timeGrain = min g1 g2
@@ -567,7 +613,7 @@
 inTimezone :: Text -> TimeData -> Maybe TimeData
 inTimezone input td@TimeData {TTime.timePred = p} = do
   tz <- parseTimezone input
-  Just $ td {TTime.timePred = shiftTimezone (Series.TimeZoneSeries tz []) p}
+  Just $ td {TTime.timePred = shiftTimezone (Series.TimeZoneSeries tz []) p, TTime.hasTimezone = True}
 
 withHoliday :: Text -> TimeData -> TimeData
 withHoliday n td = td {TTime.holiday = Just n}
@@ -612,6 +658,12 @@
   where
     fri = intersect' (dayOfWeek 5, hour False 18)
     mon = intersect' (dayOfWeek 1, hour False 0)
+
+workweek :: TimeData
+workweek = interval' TTime.Open (mon, fri)
+  where
+    mon = intersect' (dayOfWeek 1, hour False 10)
+    fri = intersect' (dayOfWeek 5, hour False 18)
 
 -- Zero-indexed weeks, Monday is 1
 -- Use `predLastOf` for last day of week of month
diff --git a/Duckling/Time/HolidayHelpers.hs b/Duckling/Time/HolidayHelpers.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/HolidayHelpers.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.
+
+module Duckling.Time.HolidayHelpers
+  ( computeEarthHour, computeKingsDay
+  ) where
+
+import Data.Maybe
+import Prelude
+
+import Duckling.Time.Helpers
+import Duckling.Time.Computed
+import Duckling.Time.Types (TimeData (..))
+import qualified Duckling.Time.Types as TTime
+import qualified Duckling.TimeGrain.Types as TG
+
+-- Last Saturday of March unless it falls on Holy Saturday,
+-- in which case it's the Saturday before.
+computeEarthHour :: Maybe TimeData
+computeEarthHour =
+  let holySaturday = cycleNthAfter False TG.Day (-1) easterSunday
+      tentative = predLastOf (dayOfWeek 6) (month 3)
+      alternative = cycleNthAfter False TG.Day (-7) tentative
+    in do
+      day <- intersectWithReplacement holySaturday tentative alternative
+      start <- intersect day $ hourMinute True 20 30
+      interval TTime.Closed start $ cycleNthAfter False TG.Minute 60 start
+
+-- King's day is on April 27th unless it's on Sunday, in which case it's a day
+-- earlier. We intersect with the last Sunday of April. If 4/27 is a Sunday it
+-- will be the last Sunday in April.
+computeKingsDay :: Maybe TimeData
+computeKingsDay =
+  let tentative = monthDay 4 27
+      alternative = monthDay 4 26
+      lastSundayOfApril = predLastOf (dayOfWeek 7) (month 4)
+    in intersectWithReplacement lastSundayOfApril tentative alternative
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -825,5 +824,43 @@
              ]
   , examples (datetime (2013, 8, 15, 0, 0, 0) Day)
              [ "gio 15"
+             ]
+  , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
+             [ "7 giorni fa"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "una settimana fa"
+             , "1 settimana fa"
+             ]
+  , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
+             [ "tre settimane fa"
+             , "3 settimane fa"
+             ]
+  , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
+             [ "tre mesi fa"
+             , "3 mesi fa"
+             ]
+  , examples (datetime (2011, 2, 1, 0, 0, 0) Month)
+             [ "due anni fa"
+             , "2 anni fa"
+             ]
+   , examples (datetimeHoliday (2013, 12, 18, 0, 0, 0) Day "Giornata della lingua araba")
+             [ "giornata della lingua araba"
+             ]
+   , examples (datetimeHoliday (2013, 3, 1, 0, 0, 0) Day "Giornata Mondiale contro la discriminazione")
+             [ "giornata mondiale contro la discriminazione"
+             ]
+   , examples (datetimeHoliday (2019, 7, 6, 0, 0, 0) Day "Giornata Internazionale delle cooperative")
+             [ "giornata internazionale delle cooperative del 2019"
+             ]
+   , examples (datetimeHoliday (2013, 11, 17, 0, 0, 0) Day "Giornata Mondiale della Prematurità")
+             [ "giornata mondiale dei prematuri"
+             , "giornata mondiale della prematurita"
+             , "giornata mondiale della prematurità"
+             ]
+   , examples (datetimeHoliday (2013, 5, 25, 0, 0, 0) Day "Giornata dell'Africa")
+             [ "giornata della liberazione africana"
+             , "giornata dell'unità africana"
+             , "giornata dell'africa"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,19 +10,21 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.IT.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Text (Text)
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -161,9 +162,8 @@
     [ regex "stamattina"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 4) (hour False 12)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleYearNotLatent :: Rule
@@ -424,8 +424,7 @@
       (Token RegexMatch (GroupMatch (match:_)):
        Token Duration dd:
        _) -> case Text.toLower match of
-        "entro" -> Token Time <$>
-          interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        "entro" -> Token Time <$> interval TTime.Open now (inDuration dd)
         "in"    -> tt $ inDuration dd
         _       -> Nothing
       _ -> Nothing
@@ -463,7 +462,7 @@
   , pattern =
     [ regex "(subito|(immediata|attual)mente|(proprio )?adesso|(in questo|al) momento|ora)"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleToday :: Rule
@@ -472,7 +471,7 @@
   , pattern =
     [ regex "(di )?oggi|in giornata"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleLastCycleOfTime :: Rule
@@ -552,8 +551,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 ruleHourofdayMinusIntegerAsRelativeMinutes :: Rule
@@ -567,8 +565,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:_:token:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 ruleHhRelativeminutesDelPomeriggiotimeofday :: Rule
@@ -654,8 +651,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 ruleHourofdayMinusIntegerMinutes :: Rule
@@ -1034,9 +1030,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_) ->
-        let from = cycleNth TG.Second 0
-            to = cycleNth grain 1
-        in Token Time <$> interval TTime.Open from to
+        Token Time <$> interval TTime.Open now (cycleNth grain 1)
       _ -> Nothing
   }
 
@@ -1137,6 +1131,194 @@
   , ( "Dicembre" , "dicembre|dic\\.?"    )
   ]
 
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Giornata dell'Africa", "giornata (dell('((unit(à|a)|unione) )?|a (liberazione|libert(à|a)) ))?africa(na)?", monthDay 5 25 )
+  , ( "Giornata dell'Industrializzazione dell'Africa", "giornata (dell')?industrializzazione (dell')?africa(na)", monthDay 11 20 )
+  , ( "Pesce d'aprile", "pesce d'aprile", monthDay 4 1 )
+  , ( "Giornata della lingua araba", "giornata della lingua araba", monthDay 12 18 )
+  , ( "Assunzione di Maria", "assunzione di maria", monthDay 8 15 )
+  , ( "Boxing Day", "boxing day", monthDay 12 26 )
+  , ( "Giornata della lingua cinese", "giornata della lingua cinese", monthDay 4 20 )
+  , ( "Giornata della memoria per tutte le vittime della guerra chimica", "Giornata della memoria per tutte le vittime della guerra chimica", monthDay 4 29 )
+  , ( "Giornata Internazionale della memoria delle vittime del genocidio del Rwanda", "giornata internazionale della (memoria|riflessione) (delle vittime )?del genocidio del rwanda", monthDay 4 7 )
+  , ( "Giorno della gente di mare", "giornata (mondiale )? del( marittimo|la gente di mare)", monthDay 6 25 )
+  , ( "Giornata della Terra", "giornata della terra", monthDay 4 22 )
+  , ( "Giornata della lingua inglese", "giornata della lingua inglese", monthDay 4 23 )
+  , ( "San Francesco d'Assisi", "san francesco d'assisi", monthDay 10 4 )
+  , ( "Giorno dei genitori", "giorno dei genitori", monthDay 6 1 )
+  , ( "Giornata Mondiale dei diritti umani", "giornata (mondiale )?dei diritti umani", monthDay 12 10 )
+  , ( "Giornata Internazionale di sensibilizzazione sull'albinismo", "giornata internazionale di sensibilizzazione sull'albinismo", monthDay 6 13 )
+  , ( "Giornata Internazionale Anticorruzione", "giornata internazionale anticorruzione", monthDay 12 9 )
+  , ( "Giornata Internazionale Asteroid Day", "international asteroid day", monthDay 6 30 )
+  , ( "Giornata Mondiale dell'orgoglio bisessuale", "giornata mondiale dell('orgoglio|a visibilit(a|à)) bisessuale", monthDay 9 23 )
+  , ( "Giornata Internazionale della memoria sul disastro di Chernobyl", "giornata internazionale della memoria del disastro di chernobyl", monthDay 4 26 )
+  , ( "Giornata Internazionale dell'aviazione civile", "giornata internazionale dell'aviazione civile", monthDay 12 7 )
+  , ( "Giornata Internazionale delle dogane", "giornata internazionale delle dogane", monthDay 1 26 )
+  , ( "Giornata Internazionale contro l'abuso di droghe e il traffico illecito", "giornata internazionale contro l'abuso di droghe e il traffico illecito", monthDay 6 26 )
+  , ( "Giornata Internazionale contro i test nucleari", "giornata internazionale contro i test nucleari", monthDay 8 29 )
+  , ( "Giornata Mondiale della biodiversità", "giornata mondiale della biodiversit(a|à)", monthDay 5 22 )
+  , ( "Giornata Internazionale dei Monumenti e dei Siti", "giornata internazionale dei monumenti e dei siti", monthDay 4 18 )
+  , ( "Giornata Internazionale per prevenire lo sfruttamento dell'ambiente in guerra e conflitti armati", "giornata internazionale per prevenire lo sfruttamento dell'ambiente in guerra e conflitti armati", monthDay 11 6 )
+  , ( "Giornata Internazionale per la Cooperazione Sud-Sud", "giornata internazionale per la Cooperazione sud(\\-|\\s)sud", monthDay 9 12 )
+  , ( "Giornata Internazionale della tolleranza", "giornata internazionale della tolleranza", monthDay 11 16 )
+  , ( "Giornata Internazionale per l'abolizione della schiavitù", "giornata internazionale per l'abolizione della schiavit(u|ù)", monthDay 12 2 )
+  , ( "Giornata Internazionale per l'eliminazione della discriminazione razziale", "giornata internazionale per l'eliminazione della discriminazione razziale", monthDay 3 21 )
+  , ( "Giornata Internazionale contro la violenza sessuale nei conflitti armati", "giornata internazionale contro la violenza sessuale nei conflitti( armati)?", monthDay 6 19 )
+  , ( "Giornata Internazionale per l'eliminazione della violenza contro le donne", "giornata internazionale per l'eliminazione della violenza contro le donne", monthDay 11 25 )
+  , ( "Giornata Internazionale contro la Povertà", "giornata internazionale (contro |per l'e(radic|limin)azione del)la povert(a|à)", monthDay 10 17 )
+  , ( "Giornata Internazionale per la preservazione dello strato di ozono", "giornata internazionale per la preservazione dello strato di ozono", monthDay 9 16 )
+  , ( "Giornata Internazionale per la Commemorazione della Tratta degli Schiavi e la sua abolizione", "giornata internazionale per la commemorazione della tratta degli schiavi e la sua abolizione", monthDay 8 23 )
+  , ( "Giornata Internazionale per il diritto alla verità sulle gravi violazioni dei diritti umani e per la dignità delle vittime", "giornata internazionale per il diritto alla verit(a|à) sulle gravi violazioni dei diritti umani e per la dignit(a|à) delle vittime", monthDay 3 24 )
+  , ( "Giornata Internazionale per l'eliminazione totale delle armi nucleari", "giornata internazionale per l'eliminazione totale delle armi nucleari", monthDay 9 26 )
+  , ( "Giornata Internazionale a sostegno delle vittime di tortura", "giornata Internazionale a sostegno delle vittime di tortura", monthDay 6 26 )
+  , ( "Giornata Internazionale della Carità", "giornata internazionale della carit(a|à)", monthDay 9 5 )
+  , ( "Giornata Internazionale di commemorazione in memoria delle vittime dell'Olocausto", "giornata internazionale di commemorazione in memoria delle vittime dell'olocausto", monthDay 1 27 )
+  , ( "Giornata Internazionale della Democrazia", "giornata internazionale della democrazia", monthDay 9 15 )
+  , ( "Giornata Internazionale delle persone con disabilità", "giornata internazionale delle persone con disabilit(a|à)", monthDay 12 3 )
+  , ( "Giornata Internazionale della Famiglia", "giornata internazionale dell(a|e) famigli(a|e)", monthDay 5 15 )
+  , ( "Giornata Internazionale delle Rimesse Familiari", "giornata Internazionale delle rimesse familiari", monthDay 6 16 )
+  , ( "Giornata Internazionale delle foreste", "giornata internazionale delle foreste", monthDay 3 21 )
+  , ( "Giornata Internazionale dell'amicizia", "giornata internazionale dell'amicizia", monthDay 7 30 )
+  , ( "Giornata Internazionale della Felicità", "giornata internazionale della felicit(a|à)", monthDay 3 20 )
+  , ( "Giornata Mondiale del volo umano nello spazio", "giornata mondiale del volo umano nello spazio", monthDay 4 12 )
+  , ( "Giornata Internazionale dei bambini innocenti vittime di aggressioni", "giornata internazionale dei bambini innocenti vittime di aggressioni", monthDay 6 4 )
+  , ( "Giornata Internazionale della nonviolenza", "giornata internazionale della nonviolenza", monthDay 10 2 )
+  , ( "Giornata Internazionale di Nowruz", "giornata internazionale di nowruz", monthDay 3 21 )
+  , ( "Giornata Internazionale delle Persone Anziane", "giornata internazionale delle persone anziane", monthDay 10 1 )
+  , ( "Giornata Internazionale della pace", "giornata internazionale della pace", monthDay 9 21 )
+  , ( "Giornata Internazionale in ricordo delle vittime delle schiavitù e della tratta transatlantica degli schiavi", "giornata internazionale in ricordo delle vittime delle schiavitù e della tratta transatlantica degli schiavi", monthDay 3 25 )
+  , ( "Giornata Internazionale delle donne rurali", "giornata internazionale delle donne rurali", monthDay 10 15 )
+  , ( "Giornata di solidarietà con i funzionari detenuti o scomparsi", "giornata di solidariet(a|à) con i funzionari detenuti o scomparsi", monthDay 3 25 )
+  , ( "Giornata Internazionale di solidarietà per il popolo palestinese", "giornata internazionale della solidariet(a|à) con il popolo palestinese", monthDay 11 29 )
+  , ( "Giornata Internazionale dello sport per lo sviluppo e la pace", "giornata internazionale dello sport per lo sviluppo e la pace", monthDay 4 6 )
+  , ( "Giornata Internazionale dei Peacekeepers delle Nazioni Unite", "giornata internazionale dei peacekeepers delle nazioni unite", monthDay 5 29 )
+  , ( "Giornata Mondiale per le donne e le ragazze nella scienza", "giornata mondiale per le donne e le ragazze nella scienza", monthDay 2 11 )
+  , ( "Giornata Internazionale dello Yoga", "giornata internazionale dello yoga", monthDay 6 21 )
+  , ( "Giornata Internazionale sulla tolleranza zero nei confronti delle mutilazioni genitali femminili", "giornata internazionale sulla tolleranza zero nei confronti delle mutilazioni genitali femminili", monthDay 2 6 )
+  , ( "Giornata Mondiale delle bambine e delle ragazze", "giornata mondiale delle bambine e delle ragazze", monthDay 10 11 )
+  , ( "Giornata Internazionale vittime sparizione forzata", "giornata internazionale vittime sparizione forzata", monthDay 8 30 )
+  , ( "Giornata Internazionale dei popoli indigeni del mondo", "giornata internazionale dei popoli indigeni( del mondo)?", monthDay 8 9 )
+  , ( "Giornata Internazionale per mettere fine all'impunità per i crimini contro i giornalisti", "giornata internazionale per mettere fine all'impunit(a|à) per i crimini contro i giornalisti", monthDay 11 2 )
+  , ( "Giornata Internazionale per l'Eliminazione della Fistola Ostetrica", "giornata internazionale per l'eliminazione della fistola ostetrica", monthDay 5 23 )
+  , ( "Giornata Internazionale per la Riduzione dei Disastri Naturali", "giornata internazionale per la riduzione dei disastri naturali", monthDay 10 13 )
+  , ( "Giornata Internazionale della solidarietà umana", "giornata internazionale della solidarietà umana", monthDay 12 20 )
+  , ( "Giornata Internazionale Jazz Day", "international jazz day", monthDay 4 30 )
+  , ( "Giornata Internazionale dell'alfabetizzazione", "giornata internazionale dell'alfabetizzazione", monthDay 9 8 )
+  , ( "Giornata Internazionale dell'uomo", "giornata internazionale dell'uomo", monthDay 11 19 )
+  , ( "Giornata Internazionale del Migrante", "giornata internazionale del migrante", monthDay 12 18 )
+  , ( "Giornata Internazionale della lingua madre", "giornata internazionale della lingua madre", monthDay 2 21 )
+  , ( "Giornata Internazionale della Montagna", "giornata internazionale della montagna", monthDay 12 11 )
+  , ( "Giornata Internazionale dell'infermiere", "giornata internazionale dell'infermiere", monthDay 5 12 )
+  , ( "Giornata Internazionale contro l'Overdose", "giornata internazionale contro l'overdose", monthDay 8 31 )
+  , ( "Giornata Internazionale del Volontariato per lo Sviluppo Economico e Sociale", "giornata internazionale del volontariato per lo sviluppo economico e sociale", monthDay 12 5 )
+  , ( "Giornata Internazionale delle Vedove", "giornata internazionale delle vedove", monthDay 6 23 )
+  , ( "Giornata Internazionale della donna", "giornata internazionale della donna", monthDay 3 8 )
+  , ( "Giornata Mondiale della gioventù", "giornata mondiale della giovent(u|ù)", monthDay 8 12 )
+  , ( "Giornata Internazionale Nelson Mandela", "giornata (internazionale )?nelson mandela", monthDay 7 18 )
+  , ( "Natale Ortodosso", "natale ortodosso", monthDay 1 7 )
+  , ( "Capodanno ortodosso", "capodanno ortodosso", monthDay 1 14 )
+  , ( "Giornata del servizio pubblico", "giornata del servizio pubblico", monthDay 6 23 )
+  , ( "Giorno di San Giorgio", "(giorno di )?san giorgio", monthDay 4 23 )
+  , ( "Festa di San Patrizio", "((festa|giorno) di )?san patrizio", monthDay 3 17 )
+  , ( "Ricordo e Riconciliazione per Coloro che Hanno Perso la Vita Durante la Seconda Guerra Mondiale", "ricordo e riconciliazione per coloro che hanno perso la vita durante la seconda guerra mondiale", monthDay 5 8 )
+  , ( "Giornata delle Nazioni Unite", "giornata delle nazioni unite", monthDay 10 24 )
+  , ( "United Nations' Mine Awareness Day", "united nations'? mine awareness day", monthDay 4 4 )
+  , ( "United Nations' World Health Day", "united nations'? world health day", monthDay 4 7 )
+  , ( "Universal Children's Day", "universal children'?s day", monthDay 11 20 )
+  , ( "Giornata Mondiale contro l'AIDS", "giornata mondiale contro l'aids", monthDay 12 1 )
+  , ( "Giornata Mondiale per la consapevolezza sull'autismo", "giornata mondiale per la consapevolezza sull'autismo", monthDay 4 2 )
+  , ( "Giornata Mondiale del Lupus", "giornata mondiale del lupus", monthDay 5 10 )
+  , ( "Giornata Mondiale del donatore di sangue", "giornata mondiale del donatore di sangue", monthDay 6 14 )
+  , ( "Giornata Mondiale del libro e del diritto d'autore", "giornata mondiale del libro e del( diritto d'autore|le rose)", monthDay 4 23 )
+  , ( "Giornata Mondiale dell'alfabeto braille", "giornata mondiale del(l'alfabeto)? braille", monthDay 1 4 )
+  , ( "Giornata Mondiale contro il cancro", "giornata mondiale contro il cancro", monthDay 2 4 )
+  , ( "Giornata Mondiale della città", "giornata mondiale della citt(a|à)", monthDay 10 31 )
+  , ( "Giornata Mondiale della paralisi cerebrale infantile", "giornata mondiale della paralisi cerebrale( infantile)?", monthDay 10 6 )
+  , ( "World Day Against Child Labour", "world day against child labour", monthDay 6 12 )
+  , ( "Giornata Mondiale contro la tratta di esseri umani", "giornata mondiale contro la tratta di esseri umani", monthDay 7 30 )
+  , ( "Giornata Mondiale del Patrimonio Audiovisivo", "giornata mondiale del patrimonio audiovisivo", monthDay 10 27 )
+  , ( "Giornata Mondiale della diversità culturale per il dialogo e lo sviluppo", "giornata mondiale della diversit(a|à) culturale per il dialogo e lo sviluppo", monthDay 5 21 )
+  , ( "Giornata Mondiale per la salute e sicurezza sul lavoro", "giornata mondiale per la salute e sicurezza sul lavoro", monthDay 4 28 )
+  , ( "Giornata Internazionale per l'abolizione della schiavitù", "giornata internazionale per l'abolizione della schiavit(u|û)", monthDay 12 2 )
+  , ( "Giornata Mondiale della giustizia sociale", "giornata mondiale della giustizia sociale", monthDay 2 20 )
+  , ( "Giornata Mondiale del malato", "giornata mondiale del malato", monthDay 2 11 )
+  , ( "Giornata Mondiale per la lotta alla desertificazione e alla siccità", "giornata mondiale per la lotta alla desertificazione e alla siccit(a|à)", monthDay 6 17 )
+  , ( "Giornata Mondiale dell'informazione sullo Sviluppo", "giornata mondiale dell'informazione sullo sviluppo", monthDay 10 24 )
+  , ( "Giornata Mondiale del diabete", "giornata mondiale del diabete", monthDay 11 14 )
+  , ( "Giornata Mondiale sulla Sindrome di Down", "giornata mondiale (de|su)lla sindrome di down", monthDay 3 21 )
+  , ( "Giornata Mondiale contro gli abusi sugli anziani", "giornata mondiale contro gli abusi sugli anziani", monthDay 6 15 )
+  , ( "Giornata Mondiale dell'ambiente", "giornata mondiale dell'ambiente", monthDay 6 5 )
+  , ( "Giornata Mondiale dell'alimentazione", "giornata mondiale dell'alimentazione", monthDay 10 16 )
+  , ( "Giornata Internazionale per la Commemorazione e la Dignità delle vittime di Genocidio e della prevenzione di questo crimine", "giornata internazionale per la commemorazione (e la dignit(a|à) )?delle vittime di genocidio( e della prevenzione di questo crimine)?", monthDay 12 9 )
+  , ( "Giornata Mondiale del cuore", "giornata mondiale del cuore", monthDay 9 29 )
+  , ( "Giornata Mondiale dell'epatitey", "giornata mondiale dell'epatite", monthDay 7 28 )
+  , ( "Giornata Mondiale dell'aiuto umanitario", "giornata mondiale dell'aiuto umanitario", monthDay 8 19 )
+  , ( "Giornata Mondiale delle Telecomunicazioni e della società dell'informazione", "giornata mondiale (delle Telecomunicazioni e )?della societ(a|à) dell'informazione", monthDay 5 17 )
+  , ( "Giornata Mondiale della proprietà intellettuale", "giornata mondiale della propriet(a|à) intellettuale", monthDay 4 26 )
+  , ( "Giornata Mondiale contro la malaria", "giornata mondiale contro la malaria", monthDay 4 25 )
+  , ( "Giornata Mondiale della salute mentale", "giornata mondiale della salute mentale", monthDay 10 10 )
+  , ( "Giornata Mondiale della meteorologia", "giornata mondiale della meteorologia", monthDay 3 23 )
+  , ( "Giornata Mondiale senza tabacco", "giornata mondiale senza tabacco", monthDay 5 31 )
+  , ( "Giornata Mondiale degli oceani", "giornata mondiale degli oceani", monthDay 6 8 )
+  , ( "Giornata Mondiale sul Tumore Ovarico", "giornata mondiale sul tumore ovarico", monthDay 5 8 )
+  , ( "Giornata Mondiale contro la polmonite", "giornata mondiale contro la polmonite", monthDay 11 12 )
+  , ( "Giornata Mondiale della Poesia", "giornata mondiale della poesia", monthDay 3 21 )
+  , ( "Giornata Mondiale della popolazione", "giornata mondiale della popolazione", monthDay 7 11 )
+  , ( "Giornata Mondiale della Posta", "giornata mondiale della posta", monthDay 10 9 )
+  , ( "Giornata Mondiale della Prematurità", "giornata mondiale de(lla|i) (prematuri(t(a|à))?)", monthDay 11 17 )
+  , ( "Giornata Mondiale della libertà di stampa", "giornata mondiale della libert(a|à) di stampa", monthDay 5 3 )
+  , ( "Giornata Mondiale contro la rabbia", "giornata mondiale contro la rabbia", monthDay 9 28 )
+  , ( "Giornata Mondiale della radio", "giornata mondiale della radio", monthDay 2 13 )
+  , ( "Giornata Mondiale dei profughi", "giornata mondiale de(i profughi|l rifugiato)", monthDay 6 20 )
+  , ( "Giornata Mondiale della scienza per pace e sviluppo", "giornata mondiale della scienza per pace e sviluppo", monthDay 11 10 )
+  , ( "Giornata Mondiale del Benessere Sessuale", "giornata mondiale del benessere sessuale", monthDay 9 4 )
+  , ( "Giornata Mondiale del Suolo", "giornata mondiale del suolo", monthDay 12 5 )
+  , ( "Giornata Mondiale dell'Ictus", "giornata mondiale dell'icuts", monthDay 10 29 )
+  , ( "Giornata Mondiale per la Prevenzione del Suicidio", "giornata mondiale per la prevenzione del suicidio", monthDay 9 10 )
+  , ( "Giornata Mondiale dell'insegnante", "giornata mondiale de(gli |ll')insegnant(e|i)", monthDay 10 5 )
+  , ( "Giornata Mondiale Della Televisione", "giornata mondiale della televisione", monthDay 11 21 )
+  , ( "Giornata Mondiale del gabinetto", "giornata mondiale del gabinetto", monthDay 11 19 )
+  , ( "Giornata Mondiale del turismo", "giornata mondiale del turismo", monthDay 9 27 )
+  , ( "Giornata Mondiale della tubercolosi", "giornata mondiale della tubercolosi", monthDay 3 24 )
+  , ( "Giornata Mondiale del Tonno", "giornata mondiale del tonno", monthDay 5 2 )
+  , ( "Giornata Mondiale dei Vegani", "giornata mondiale (de(i|l) )?vegan(i|o|ismo)?", monthDay 11 1 )
+  , ( "Giornata Mondiale dei Vegetariani", "giornata mondiale de(i|l) vegetari(smo|ani)", monthDay 10 1 )
+  , ( "Giornata Mondiale dell'acqua", "giornata mondiale dell'acqua", monthDay 3 22 )
+  , ( "Giornata Mondiale delle zone umide", "giornata mondiale delle zone umide", monthDay 2 2 )
+  , ( "Giornata Mondiale della Vita Selvatica", "giornata mondiale della (fauna|vita) selvatica", monthDay 3 3 )
+  , ( "Giornata Internazionale delle competenze giovanili", "giornata internazionale delle competenze giovanili", monthDay 7 15 )
+  , ( "Giornata Mondiale contro la discriminazione", "giornata mondiale contro la discriminazione", monthDay 3 1 )
+
+  -- Fixed day/week/month, year over year
+  , ( "Giornata Mondiale in memoria delle vittime della strada"
+    , "Giornata (Mondiale )?in memoria delle vittime della strada"
+    , nthDOWOfMonth 3 7 11 )
+  , ( "Giornata Internazionale delle cooperative"
+    , "giornata internazionale delle cooperative", nthDOWOfMonth 1 6 7 )
+  , ( "Martin Luther King's Day"
+    , "((MLK|martin luther king,?)( jr\\.?| junior)? day|giornata dei diritti civili)"
+    , nthDOWOfMonth 3 1 1
+    )
+
+  -- -- The day after Thanksgiving (not always the fourth Friday of November)
+  , ( "Black Friday", "black friday"
+    , cycleNthAfter False TG.Day 1 $ nthDOWOfMonth 4 4 11
+    )
+  , ( "Giornata Mondiale dell'Habitat", "giornata mondiale dell'habitat", nthDOWOfMonth 1 1 10 )
+  , ( "Giornata Mondiale del Rene", "giornata mondiale del rene", nthDOWOfMonth 2 4 3 )
+  , ( "Giornata Mondiale per i malati di lebbra", "giornata mondiale per i malati di lebbra"
+    , predLastOf (dayOfWeek 7) (month 1) )
+  , ( "Giornata Mondiale del Mare", "giornata mondiale del mare"
+    , predLastOf (dayOfWeek 4) (month 9) )
+  , ( "Giornata Mondiale degli uccelli migratori", "giornata mondiale degli uccelli migratori"
+    , nthDOWOfMonth 2 6 5 )
+  , ( "Giornata Mondiale della filosofia", "giornata mondiale della filosofia", nthDOWOfMonth 3 4 11 )
+  , ( "Giornata Mondiale della religione", "giornata mondiale della religione", nthDOWOfMonth 3 7 1 )
+  , ( "Giornata Mondiale della vista", "giornata mondiale della vista", nthDOWOfMonth 2 4 10 )
+  ]
+
 ruleTheCycleOfTime :: Rule
 ruleTheCycleOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -1309,9 +1491,8 @@
     [ regex "stasera"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleSeason3 :: Rule
@@ -1392,7 +1573,7 @@
     , regex "fa"
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Duration dd:_) ->
+      (Token Duration dd:_) ->
         tt $ durationAgo dd
       _ -> Nothing
   }
@@ -1460,9 +1641,7 @@
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        let now = cycleNth TG.Second 0
-        in Token Time <$> interval TTime.Open now td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1827,8 +2006,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -2404,3 +2582,4 @@
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/KA/Corpus.hs b/Duckling/Time/KA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/KA/Corpus.hs
@@ -0,0 +1,468 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- /Note/: All commented-out tests are failing due to https://github.com/facebook/duckling/issues/541
+module Duckling.Time.KA.Corpus
+  ( corpus
+  , defaultCorpus
+  , latentCorpus
+  ) where
+
+import Data.String
+import Prelude
+
+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
+import Duckling.Resolve
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale KA Nothing},
+  testOptions, allExamples)
+
+defaultCorpus :: Corpus
+defaultCorpus = (testContext {locale = makeLocale KA Nothing},
+  testOptions, allExamples)
+
+latentCorpus :: Corpus
+latentCorpus = (testContext {locale = makeLocale KA Nothing},
+  testOptions {withLatent = True}, xs)
+  where
+    xs = concat
+      [ examples (datetime (2013, 2, 24, 0, 0, 0) Day)
+                 [ "24 თებერვალს"
+                 ]
+      , examples (datetime (2013, 2, 12, 7, 0, 0) Hour)
+                 [ "7 საათზე"
+                 ]
+      , examples (datetime (2013, 5, 1, 0, 0, 0) Month)
+                 [ "მაისი"
+                 ]
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
+             [ "ახლა"
+             , "ახლავე"
+             , "ეხლა"
+             ]
+  , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "დღეს"
+             ]
+  , examples (datetime (2013, 2, 1, 0, 0, 0) Day)
+             [ "2/2013"
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
+             [ "2014-ში"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "გუშინ"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "ხვალ"
+             , "ხვალე"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "ორშაბათი"
+             , "ამ ორშაბათს"
+             , "ეს ორშაბათი"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "სამშაბათი"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "ხუთშაბათი"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "პარასკევი"
+             ]
+  , examples (datetime (2013, 2, 16, 0, 0, 0) Day)
+             [ "შაბათი"
+             ]
+  , examples (datetime (2013, 2, 17, 0, 0, 0) Day)
+             [ "კვირა"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "1-ლი მარტი"
+             , "პირველი მარტი"
+             ]
+  , examples (datetime (2013, 3, 3, 0, 0, 0) Day)
+             [ "3 მარტი"
+             ]
+  , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
+             [ "3 მარტი 2015"
+             , "2015 წლის მე-3 მარტი"
+             , "2015-3-3"
+             , "2015-03-03"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "15 თებერვალი"
+             , "თებერვლის მეთხუთმეტე დღეს"
+             , "თხუთმეტი თებერვალი"
+             ]
+  , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
+             [ "8 აგვისტო"
+             ]
+  , examples (datetime (2014, 10, 1, 0, 0, 0) Month)
+             [ "2014 წლის ოქტომბერი"
+             ]
+  , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
+             [ "14 აპრილი 2015"
+             , "2015 წლის 14 აპრილი"
+             , "2015 წლის 14 აპრილს"
+             ]
+  , examples (datetime (2013, 2, 26, 0, 0, 0) Day)
+             [ "შემდეგ სამშაბათს"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "შემდეგის შემდეგი პარასკევი"
+             ]
+  , examples (datetime (2014, 3, 1, 0, 0, 0) Month)
+             [ "შემდეგი მარტი"
+             ]
+  , examples (datetime (2015, 3, 1, 0, 0, 0) Month)
+             [ "შემდეგის შემდეგი მარტი"
+             ]
+  , examples (datetimeInterval ((2013, 1, 1, 0, 0, 0), (2013, 2, 1, 0, 0, 0)) Month)
+             [ "წინა თვე"
+             ]
+  , examples (datetimeInterval ((2013, 3, 1, 0, 0, 0), (2013, 4, 1, 0, 0, 0)) Month)
+             [ "შემდეგი თვე"
+             ]
+  , examples (datetimeInterval ((2013, 4, 1, 0, 0, 0), (2013, 7, 1, 0, 0, 0)) Quarter)
+             [ "შემდეგ კვარტალში"
+             ]
+  , examples (datetimeInterval ((2012, 1, 1, 0, 0, 0), (2013, 1, 1, 0, 0, 0)) Year)
+             [ "შარშან"
+             , "წინა წელს"
+             ]
+  , examples (datetimeInterval ((2014, 1, 1, 0, 0, 0), (2015, 1, 1, 0, 0, 0)) Year)
+             [ "მომავალი წელი"
+             , "შემდეგ წელს"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "წინა კვირის კვირას"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "ბოლო სამშაბათს"
+             ]
+  , examples (datetime (2013, 2, 26, 0, 0, 0) Day)
+             [ "შემდეგ სამშაბათს"
+             ]
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
+             [ "შემდეგი ოთხშაბათი"
+             ]
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
+             [ "შემდეგი კვირის ოთხშაბათი"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "შემდეგის შემდეგი პარასკევი"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "გუშინწინ"
+             ]
+  , examples (datetime (2013, 2, 10, 8, 0, 0) Hour)
+             [ "გუშინწინ8-ზე"
+             ]
+  , examples (datetime (2013, 3, 25, 0, 0, 0) Day)
+             [ "მარტის ბოლო ორშაბათი"
+             ]
+  , examples (datetime (2013, 10, 3, 0, 0, 0) Day)
+             [ "ოქტომბრის მესამე დღე"
+             , "ოქტომბრის მე-3 დღე"
+             ]
+  , examples (datetime (2013, 10, 1, 0, 0, 0) Day)
+             [ "ოქტომბრის პირველი სამშაბათი"
+             , "ოქტომბრის 1-ლი სამშაბათი"
+             ]
+  , examples (datetime (2013, 9, 17, 0, 0, 0) Day)
+             [ "სექტემბრის მესამე სამშაბათი"
+             , "სექტემბრის მე-3 სამშაბათი"
+             ]
+  , examples (datetime (2013, 10, 2, 0, 0, 0) Day)
+             [ "ოქტომბრის პირველი ოთხშაბათი"
+             , "ოქტომბრის 1-ლი ოთხშაბათი"
+             ]
+  , examples (datetime (2013, 10, 9, 0, 0, 0) Day)
+             [ "ოქტომბრის მეორე ოთხშაბათი"
+             , "ოქტომბრის მე-2 ოთხშაბათი"
+             ]
+  , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
+             [ "3:18am"
+             , "3:18a"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "15 საათზე"
+             , "3PM"
+             , "3pm"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
+             [ "4-ის 15 წუთზე"
+             , "3 საათსა და 15 წუთზე"
+             , "15:15"
+             , "3:15pm"
+             , "3:15PM"
+             , "3:15p"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 20, 0) Minute)
+             [ "15 საათსა და 20 წუთზე"
+             , "4-ის 20 წუთზე"
+             , "3:20p"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
+             [ "4-ის ნახევარზე"
+             , "15 საათსა და 30 წუთზე"
+             , "15:30"
+             , "3:30pm"
+             , "3:30PM"
+             , "330 p.m."
+             , "3:30 p m"
+             , "3:30"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 23, 24) Second)
+             [ "15:23:24"
+             ]
+  , examples (datetime (2013, 2, 12, 11, 45, 0) Minute)
+             [ "11 საათსა და 45 წუთზე"
+             , "11:45am"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
+             [ "20 საათი"
+             , "20 საათზე"
+             ]
+  , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
+             [ "შაბათს 9-ზე"
+             ]
+  , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
+             [ "შაბათს 9 საათზე"
+             ]
+  , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
+             [ "7 დღის წინ"
+             , "შვიდი დღის წინ"
+             ]
+  , examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
+             [ "14 დღის წინ"
+             , "თოთხმეტი დღის წინ"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "1 კვირის წინ"
+             , "ერთი კვირის წინ"
+             ]
+  , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
+             [ "3 კვირის წინ"
+             , "სამი კვირის წინ"
+             ]
+  , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
+             [ "სამი თვის წინ"
+             , "3 თვის წინ"
+             ]
+  , examples (datetime (2011, 2, 1, 0, 0, 0) Month)
+             [ "ორი წლის წინ"
+             , "ორი წლის წინ"
+             ]
+  , examples (datetimeInterval ((2013, 6, 1, 0, 0, 0), (2013, 9, 1, 0, 0, 0)) Day)
+             [ "ამ ზაფხულს"
+             , "ამ ზაფხულში"
+             ]
+  , examples (datetimeInterval ((2012, 12, 1, 0, 0, 0), (2013, 3, 1, 0, 0, 0)) Day)
+             [ "ამ ზამთარს"
+             , "ამ ზამთარში"
+             ]
+  , examples (datetimeInterval ((2012, 9, 23, 0, 0, 0), (2012, 12, 20, 0, 0, 0)) Day)
+             [ "წინა სეზონზე"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "გუშინ ღამე"
+             , "გუშინ ღამით"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 21, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "გუშინ გვიან ღამე"
+             , "გუშინ გვიან ღამით"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "დღეს საღამოს"
+             , "დღეს ღამე"
+             ]
+  , examples (datetimeInterval ((2013, 2, 9, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Day)
+             [ "გასულ უქმეებზე"
+             , "გასულ შაბათ-კვირას"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 18, 0, 0), (2013, 2, 14, 0, 0, 0)) Hour)
+             [ "ხვალ საღამოს"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "გუშინ საღამოს"
+             ]
+  , examples (datetimeInterval ((2013, 2, 16, 0, 0, 0), (2013, 2, 18, 0, 0, 0)) Day)
+             [ "ამ შაბათკვირას"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 4, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
+             [ "ორშაბათს დილას"
+             , "ორშაბათს დილა"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 4, 0, 0), (2013, 2, 15, 12, 0, 0)) Hour)
+             [ "15 თებერვალი დილა"
+             , "15 თებერვალს დილას"
+             , "15 თებერვლის დილა"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 29, 58), (2013, 2, 12, 4, 30, 1)) Second)
+             [ "ბოლო 2 წამი"
+             , "ბოლო 2 წამში"
+             ]
+  , examples (datetimeInterval ((2013, 7, 13, 0, 0, 0), (2013, 7, 16, 0, 0, 0)) Day)
+             [ "ივლისი 13-15"
+             , "13-15 ივლისი"
+             ]
+  , examples (datetimeInterval ((2013, 8, 8, 0, 0, 0), (2013, 8, 13, 0, 0, 0)) Day)
+             [ "8-12 აგვისტო"
+             ]
+  , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 11, 1, 0)) Minute)
+             [ "ხუთშაბათი 9:30-დან 11:00-მდე"
+             -- , "ხუთშაბათს 10-ის ნახევრიდან 11:00-მდე"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 26, 0, 0, 0)) Second)
+             [ "ორი კვირის განმავლობაში"
+             , "2 კვირის განმავლობაში"
+             ]
+  , examples (datetimeInterval ((2013, 2, 21, 0, 0, 0), (2013, 3, 1, 0, 0, 0)) Day)
+             [ "თვის ბოლო"
+             , "თვის ბოლოსთვის"
+             , "თვის ბოლოსკენ"
+             , "ამ თვის ბოლო"
+             , "ამ თვის ბოლოსთვის"
+             , "ამ თვის ბოლოსკენ"
+             ]
+  , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
+             [ "დღეს შუადღის 2-ზე"
+             , "დღეს დღის 2-ზე"
+             -- , "დღეს შუადღის ორზე"
+             ]
+  , examples (datetime (2013, 2, 13, 15, 0, 0) Hour)
+             [ "ხვალ დღის 3-ზე"
+             -- , "ხვალ დღის სამზე"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "საღამოს"
+             , "დღეს საღამოს"
+             , "დღეს ღამე"
+             , "ღამე"
+             , "ღამით"
+             ]
+  , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
+             [ "1 საათსა და 30 წუთზე"
+             , "2-ის ნახევარზე"
+             , "2-ის ნახევარი"
+             , "1 საათი და 30 წუთი"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 45, 0) Second)
+             [ "15 წუთში"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
+             [ "დღეს დილას"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "ორშაბათი"
+             , "ორშაბათს"
+             ]
+  , examples (datetime (2013, 2, 12, 12, 0, 0) Hour)
+             [ "12 საათი"
+             , "12 საათზე"
+             , "დღის 12 საათზე"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "მარტი"
+             ]
+  , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
+             [ "ხვალ დღის 5"
+             , "ხვალ შუადღის 5"
+             , "ხვალ დღის 5-ზე"
+             , "ხვალ შუადღის 5-ზე"
+             , "ხვალ დღის 5 საათი"
+             , "ხვალ შუადღის 5 საათი"
+             , "ხვალ დღის 5 საათზე"
+             , "ხვალ შუადღის 5 საათზე"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 30, 0) Minute)
+             [ "დილის 10:30"
+             , "დილის 10 საათსა და 30 წუთზე"
+             , "დილის 10 საათი და 30 წუთი"
+             ]
+  , examples (datetime (2013, 2, 12, 23, 0, 0) Hour)
+             [ "დღეს ღამის 11"
+             , "დღეს ღამის 11-ზე"
+             , "დღეს ღამის 11 საათი"
+             , "დღეს ღამის 11 საათზე"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 23, 0) Minute)
+             [ "4:23-ზე"
+             ]
+  , examples (datetimeInterval ((2013, 3, 1, 0, 0, 0), (2013, 3, 11, 0, 0, 0)) Day)
+             [ "მარტის დასაწყისი"
+             , "მარტის დასაწყისში"
+             ]
+  , examples (datetimeInterval ((2013, 3, 11, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
+             [ "მარტის შუა"
+             ]
+  , examples (datetimeInterval ((2013, 3, 21, 0, 0, 0), (2013, 4, 1, 0, 0, 0)) Day)
+             [ "მარტის ბოლო"
+             ]
+  , examples (datetimeInterval ((2013, 10, 26, 0, 0, 0), (2013, 10, 28, 0, 0, 0)) Day)
+             [ "ოქტომბრის ბოლო უქმეები"
+             , "ოქტომბრის ბოლო შაბათ-კვირა"
+             ]
+  , examples (datetimeInterval ((2017, 12, 23, 0, 0, 0), (2017, 12, 25, 0, 0, 0)) Day)
+             [ "2017 წლის დეკემბრის ბოლო უქმეები"
+             ]
+  , examples (datetimeInterval ((2013, 8, 27, 0, 0, 0), (2013, 8, 30, 0, 0, 0)) Day)
+             [ "27-29 აგვისტო"
+             ]
+  , examples (datetimeInterval ((2013, 10, 23, 0, 0, 0), (2013, 10, 27, 0, 0, 0)) Day)
+             [ "23-26 ოქტომბერი"
+             ]
+  , examples (datetimeInterval ((2013, 9, 1, 0, 0, 0), (2013, 9, 9, 0, 0, 0)) Day)
+             [ "1-8 სექტემბერი"
+             ]
+  , examples (datetimeInterval ((2013, 9, 12, 0, 0, 0), (2013, 9, 17, 0, 0, 0)) Day)
+             [ "12-16 სექტემბერი"
+             ]
+  , examples (datetimeInterval ((2013, 8, 19, 0, 0, 0), (2013, 8, 22, 0, 0, 0)) Day)
+             [ "19-21 აგვისტო"
+             ]
+  , examples (datetimeInterval ((2013, 4, 21, 0, 0, 0), (2013, 5, 1, 0, 0, 0)) Day)
+             [ "აპრილის ბოლო"
+             ]
+  , examples (datetimeInterval ((2014, 1, 1, 0, 0, 0), (2014, 1, 11, 0, 0, 0)) Day)
+             [ "იანვრის დასაწყისი"
+             ]
+  , examples (datetimeInterval ((2013, 1, 1, 0, 0, 0), (2013, 4, 1, 0, 0, 0)) Month)
+             [ "წლის დასაწყისი"
+             , "ამ წლის დასაწყისი"
+             ]
+  , examples (datetimeInterval ((2012, 12, 1, 0, 0, 0), (2013, 2, 1, 0, 0, 0)) Month)
+             [ "გასულ ორ თვეში"
+             , "გასულ 2 თვეში"
+             , "გასულ 2 თვეს"
+             ]
+  , examples (datetimeInterval ((2013, 1, 21, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Week)
+             [ "გასული 3 კვირა"
+             ]
+{-
+  , examples (datetimeInterval ((2013, 5, 1, 0, 0, 0), (2013, 6, 1, 0, 0, 0)) Month)
+             [ "მიმდინარე წლის მაისში"
+             , "წელს მაისში"
+             ]
+-}
+  , examples (datetimeInterval ((2013, 4, 1, 0, 0, 0), (2013, 7, 1, 0, 0, 0)) Quarter)
+             [ "წელს მეორე კვარტალში"
+             ]
+  ]
diff --git a/Duckling/Time/KA/Rules.hs b/Duckling/Time/KA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/KA/Rules.hs
@@ -0,0 +1,1669 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.KA.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Data.Text (Text)
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (duration, isGrain)
+import Duckling.Duration.Types (DurationData(..))
+import Duckling.Numeral.Helpers (isNatural, parseInt)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Ordinal.Types (OrdinalData(..))
+import Duckling.Regex.Types
+import Duckling.Time.Computed
+import Duckling.Time.Helpers
+import Duckling.Time.Types (TimeData(..))
+import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
+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
+
+-- Georgian weekend
+geoWeekend :: TimeData
+geoWeekend = case interval TTime.Open fri mon of
+  Just td -> td
+  Nothing -> weekend
+  where
+    fri = dayOfWeek 6
+    mon = dayOfWeek 7
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate $ or . sequence [isNotLatent, isGrainOfTime TG.Year]
+    , Predicate $ or . sequence [isNotLatent, isGrainOfTime TG.Year]
+    ]
+  , prod = \case
+    (Token Time td1:Token Time td2:_)
+      | (not $ TTime.latent td1) || (not $ TTime.latent td2) ->
+      Token Time . notLatent <$> intersect td1 td2
+    _ -> Nothing
+  }
+
+ruleAbsorbInYear :: Rule
+ruleAbsorbInYear = Rule
+  { name = "in year"
+  , pattern =
+    [ Predicate $ isGrainOfTime TG.Year
+    , regex " ?წელს| ?წელი| ?წლის|-ში|ში"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleYearInterval :: Rule
+ruleYearInterval = Rule
+  { name = "<integer> year"
+  , pattern =
+    [ Predicate isNatural
+    , regex "წელიწად(ის|ი|ში)?|წლ(ის)?|წელ(შ?ი|ს)"
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        Token Time <$> interval TTime.Open (year n) (year $ n + 1)
+      _ -> Nothing
+  }
+
+ruleInstants :: [Rule]
+ruleInstants = mkRuleInstants
+  [ ("ახლა", TG.Second, 0, "ახლავე|ეხლავე|ეხლა|ახლა|ამ წამს|ამ წუთას|ამ მომენტისთვი")
+  , ("დღეს", TG.Day, 0, "დღეს")
+  , ("ხვალ", TG.Day, 1, "ხვალე?")
+  , ("ზეგ", TG.Day, 2, "ზეგ")
+  , ("მაზეგ", TG.Day, 3, "მაზეგ")
+  , ("გუშინ", TG.Day, -1, "გუშინ?")
+  , ("გუშინწინ", TG.Day, -2, "გუშინ ?წინ")
+  ]
+
+ruleNow :: Rule
+ruleNow = Rule
+  { name = "now"
+  , pattern =
+    [ regex "ახლავე|ახლა|ამწუთას|ამ მომენტისთვის"
+    ]
+  , prod = const $ tt now
+  }
+
+ruleNextDOW :: Rule
+ruleNextDOW = Rule
+  { name = "this|next <day-of-week>"
+  , pattern =
+    [ regex "შემდეგი|მომავალი"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 1 True td
+      _ -> Nothing
+  }
+
+ruleThisTime :: Rule
+ruleThisTime = Rule
+  { name = "this <time>"
+  , pattern =
+    [ regex "ამ|ეს|ახლანდელი|მიმდინარე"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 0 False td
+      _ -> Nothing
+  }
+
+ruleNextTime :: Rule
+ruleNextTime = Rule
+  { name = "next <time>"
+  , pattern =
+    [ regex "შემდეგი?|მომავალი?"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 1 True td
+      _ -> Nothing
+  }
+
+ruleLastTime :: Rule
+ruleLastTime = Rule
+  { name = "last <time>"
+  , pattern =
+    [ regex "(წინა|ბოლო|გასული?)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth (- 1) False td
+      _ -> Nothing
+  }
+
+ruleLastWeekendOfMonth :: Rule
+ruleLastWeekendOfMonth = Rule
+  { name = "last weekend of <named-month>"
+  , pattern =
+    [ regex "ბოლო უიქ?კ? ?ენდი|ვიქ?კ? ?ენდი|შაბ?ფ?ათკვირა|შაბ?ფ?ათ-კვირა|უქმეები"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:Token Time td2:_) -> tt $ predLastOf geoWeekend td2
+      _ -> Nothing
+  }
+
+ruleLastWorkweekOfMonth :: Rule
+ruleLastWorkweekOfMonth = Rule
+  { name = "last workweek of <named-month>"
+  , pattern =
+    [ regex "ბოლო სამუშაო ?კვირას?(ში)?"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (_:Token Time td2:_) -> tt $ predLastOf workweek td2
+      _ -> Nothing
+  }
+
+ruleLastWeekendOfMonth1 :: Rule
+ruleLastWeekendOfMonth1 = Rule
+  { name = "last weekend of <named-month>"
+  , pattern =
+    [ Predicate isAMonth
+    , regex "(ს? ?ბოლო უიქ?კ? ?ენდი ?|ს? ბოლო ?ვიქ?კ? ?ენდი ?|ს? ბოლო ?შაბ?ფ?ათკვირა ?|ს? ბოლო ?შაბ?ფ?ათ-კვირა ?)| ს?უქმეები ?"
+    ]
+  , prod = \case
+      (Token Time td2:_) -> tt $ predLastOf geoWeekend td2
+      _ -> Nothing
+  }
+
+ruleLastWorkweekOfMonth1 :: Rule
+ruleLastWorkweekOfMonth1 = Rule
+  { name = "last workweek of <named-month>"
+  , pattern =
+    [ Predicate isAMonth
+    , regex "(ს? ბოლო სამუშაო ?კვირას?(ში)?)"
+    ]
+  , prod = \case
+      (Token Time td2:_) -> tt $ predLastOf workweek td2
+      _ -> Nothing
+  }
+
+ruleTimeAfterNext :: Rule
+ruleTimeAfterNext = Rule
+  { name = "<time> after next"
+  , pattern =
+    [ regex "(შემდეგის შემდეგი? ?)"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):Token Time td:_) ->
+        tt $ predNth 2 (Text.toLower match == "შემდეგის შემდეგ") td
+      _ -> Nothing
+  }
+
+ruleTimeBeforeLast :: Rule
+ruleTimeBeforeLast = Rule
+  { name = "<time> before last"
+  , pattern =
+    [ regex "(ბოლოს წინა ?|წინის წინა ?)"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):Token Time td:_) ->
+        tt $ predNth (-2) (Text.toLower match == "ბოლოს წინა") td
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime :: Rule
+ruleNthTimeOfTime = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Time
+    , dimension Ordinal
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time td1:Token Ordinal od:Token Time td2:_) -> Token Time .
+        predNth (TOrdinal.value od - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleNthTimeAfterTime :: Rule
+ruleNthTimeAfterTime = Rule
+  { name = "nth <time> after <time>"
+  , pattern =
+    [ dimension Time
+    , regex "დან"
+    , dimension Ordinal
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal od:Token Time td1:_:Token Time td2:_) ->
+        tt $ predNthAfter (TOrdinal.value od - 1) td1 td2
+      _ -> Nothing
+  }
+
+ruleYearLatent :: Rule
+ruleYearLatent = Rule
+  { name = "year (latent)"
+  , pattern =
+      [ Predicate $ isIntegerBetween 25 10000
+      ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ year n
+      _ -> Nothing
+  }
+
+ruleTheDOMNumeral :: Rule
+ruleTheDOMNumeral = Rule
+  { name = "the <day-of-month> (number)"
+  , pattern =
+    [ Predicate isDOMInteger
+    ]
+  , prod = \case
+      (_:token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ dayOfMonth n
+      _ -> Nothing
+  }
+
+ruleMonthDOMNumeral1 :: Rule
+ruleMonthDOMNumeral1 = Rule
+  { name = "<named-month> <day-of-month> (non ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMOrdinal
+    , regex "( დღეს?)?"
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleTODLatent :: Rule
+ruleTODLatent = Rule
+  { name = "time-of-day (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 0 23
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ hour True n
+      _ -> Nothing
+  }
+
+ruleMMDD :: Rule
+ruleMMDD = Rule
+  { name = "dd/mm"
+  , pattern =
+    [ regex "(3[01]|[12]\\d|0?[1-9])\\s?[/-]\\s?(1[0-2]|0?[1-9])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleMMDDYYYY :: Rule
+ruleMMDDYYYY = Rule
+  { name = "dd/mm/yyyy"
+  , pattern =
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleMMDDYYYYDot :: Rule
+ruleMMDDYYYYDot = Rule
+  { name = "mm.dd.yyyy"
+  , pattern =
+    [ regex "(1[0-2]|0?[1-9])\\.(3[01]|[12]\\d|0?[1-9])\\.(\\d{4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleAtTOD :: Rule
+ruleAtTOD = Rule
+  { name = "at <time-of-day>"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "ს|-ს|-ზე|ზე| ზე"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleTODOClock :: Rule
+ruleTODOClock = Rule
+  { name = "<time-of-day> o'clock"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "სა?ათი?ს?(ზე)?(ისთვის)?"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleHHMM :: Rule
+ruleHHMM = Rule
+  { name = "hh:mm"
+  , pattern = [regex "((?:[01]?\\d)|(?:2[0-3]))[:.]([0-5]\\d)"]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        tt $ hourMinute True h m
+      _ -> Nothing
+  }
+
+ruleHHMMLatent :: Rule
+ruleHHMMLatent = Rule
+  { name = "hhmm (latent)"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))([0-5]\\d)(?!.\\d)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        tt . mkLatent $ 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 = \case
+      (Token RegexMatch (GroupMatch (hh:mm:ss:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        s <- parseInt ss
+        tt $ hourMinuteSecond True h m s
+      _ -> Nothing
+  }
+
+ruleMilitaryAMPM :: Rule
+ruleMilitaryAMPM = Rule
+  { name = "hhmm (military) am|pm"
+  , pattern =
+    [ regex "((?:1[012]|0?\\d))([0-5]\\d)"
+    , regex "([ap])\\.?m?\\.?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (hh:mm:_)):
+       Token RegexMatch (GroupMatch (ap:_)):
+       _) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        tt . timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True h m
+      _ -> Nothing
+  }
+
+ruleMilitarySpelledOutAMPM :: Rule
+ruleMilitarySpelledOutAMPM = Rule
+  { name = "military spelled out numbers am|pm"
+  , pattern =
+    [ Predicate $ isIntegerBetween 10 12
+    , Predicate $ isIntegerBetween 1 59
+    , regex "([ap])(\\s|\\.)?m?\\.?"
+    ]
+    , prod = \case
+        (h:m:Token RegexMatch (GroupMatch (_:ap:_)):_) -> do
+          hh <- getIntValue h
+          mm <- getIntValue m
+          tt . timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True hh mm
+        _ -> Nothing
+  }
+
+ruleMilitarySpelledOutAMPM2 :: Rule
+ruleMilitarySpelledOutAMPM2 = Rule
+  { name = "six thirty six a.m."
+  , pattern =
+    [ Predicate $ isIntegerBetween 110 999
+    , regex "([ap])(\\s|\\.)?m?\\.?"
+    ]
+  , prod = \case
+      (token:Token RegexMatch (GroupMatch (_:ap:_)):_) -> do
+        n <- getIntValue token
+        m <- case mod n 100 of
+          v | v < 60 -> Just v
+          _          -> Nothing
+        let h = quot n 100
+        tt . timeOfDayAMPM (Text.toLower ap == "a") $ hourMinute True h m
+      _ -> Nothing
+  }
+
+ruleTODAMPM :: Rule
+ruleTODAMPM = Rule
+  { name = "<time-of-day> am|pm"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "(in the )?([ap])(\\s|\\.)?(m?)\\.?"
+    ]
+  , prod = \case
+      (Token Time td@TimeData {TTime.latent = True}:
+       Token RegexMatch (GroupMatch (_:ap:_:"":_)):_) ->
+        tt . mkLatent $ timeOfDayAMPM (Text.toLower ap == "a") td
+      (Token Time td:Token RegexMatch (GroupMatch (_:ap:_)):_) ->
+        tt $ timeOfDayAMPM (Text.toLower ap == "a") td
+      _ -> Nothing
+  }
+
+ruleNumeralToHOD :: Rule
+ruleNumeralToHOD = Rule
+  { name = "<integer> to|till|before <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , Predicate $ isIntegerBetween 1 59
+    , regex "(წუთი ?)აკლ(ია)?(და)?|(წუთი ?)უკლია"
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> do
+        n <- getIntValue token
+        t <- minutesBefore n td
+        Just $ Token Time t
+      _ -> Nothing
+  }
+
+ruleNumeralToHOD1 :: Rule
+ruleNumeralToHOD1 = Rule
+  { name = "<integer> to|till|before <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "რო"
+    , Predicate $ isIntegerBetween 1 59
+    , regex "(წუთი ?)აკლ(ია)?(და)?|(წუთი ?)უკლია"
+    ]
+  , prod = \case
+      (Token Time td:_:token:_) -> do
+        n <- getIntValue token
+        t <- minutesBefore n td
+        Just $ Token Time t
+      _ -> Nothing
+  }
+
+ruleHalfToHOD :: Rule
+ruleHalfToHOD = Rule
+  { name = "half to|till|before <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "ის ნახევა?რი?(ზე)?|-ის ნახევა?რი?(ზე)?"
+    ]
+  , prod = \case
+      (Token Time td:_) -> Token Time <$> minutesBefore 30 td
+      _ -> Nothing
+  }
+
+ruleNumeralAfterHOD :: Rule
+ruleNumeralAfterHOD = Rule
+  { name = "integer after|past <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , Predicate $ isIntegerBetween 1 59
+    , regex "წუთი?(ზე)?(სთვის)?"
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> do
+        n <- getIntValue token
+        t <- minutesBefore (60-n) td
+        Just $ Token Time t
+      _ -> Nothing
+  }
+
+ruleNumeralAfterHOD1 :: Rule
+ruleNumeralAfterHOD1 = Rule
+  { name = "integer after|past <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "-ის|ის|საათ(სა)?(ზე)?(და )?"
+    , Predicate $ isIntegerBetween 1 59
+    , regex "წუთი?(ზე)?(სთვის)?"
+    ]
+  , prod = \case
+      (Token Time td:_:token:_) -> do
+        n <- getIntValue token
+        t <- minutesBefore (60-n) td
+        Just $ Token Time t
+      _ -> Nothing
+  }
+
+ruleNumeralAfterHOD2 :: Rule
+ruleNumeralAfterHOD2 = Rule
+  { name = "integer after|past <hour-of-day>"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "საათი?(სა)?(ზე)?( ?და ?)?"
+    , Predicate $ isIntegerBetween 1 59
+    , regex "წუთი?(ზე)?(სთვის)?"
+    ]
+  , prod = \case
+      (Token Time td:_:token:_) -> do
+        n <- getIntValue token
+        t <- minutesAfter n td
+        Just $ Token Time t
+      _ -> Nothing
+  }
+
+ruleMMYYYY :: Rule
+ruleMMYYYY = Rule
+  { name = "mm/yyyy"
+  , pattern =
+    [ regex "(0?[1-9]|1[0-2])[/-](\\d{4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (mm:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        tt $ yearMonthDay y m 1
+      _ -> Nothing
+  }
+
+ruleYYYYMMDD :: Rule
+ruleYYYYMMDD = Rule
+  { name = "yyyy-mm-dd"
+  , pattern =
+    [ regex "(\\d{2,4})-(0?[1-9]|1[0-2])-(3[01]|[12]\\d|0?[1-9])"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (yy:mm:dd:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+rulePartOfDays :: Rule
+rulePartOfDays = Rule
+  { name = "part of days"
+  , pattern =
+    [ regex "(გვიან ღამე?(ით)?|დილა?ს?(ის)?(ით)?|საღამოს?(თი)?|(შუა)?ღამე?(ით)?ი?ს?(ისას)?|შუადღის|შუადღით|დღის)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let (start, end) = case Text.toLower match of
+              "დილას" -> (hour False 4, hour False 12)
+              "დილის" -> (hour False 4, hour False 12)
+              "დილით" -> (hour False 4, hour False 12)
+              "დილა" -> (hour False 4, hour False 12)
+              "დილ" -> (hour False 4, hour False 12)
+              "საღამოთი" -> (hour False 18, hour False 0)
+              "საღამოს" -> (hour False 18, hour False 0)
+              "საღამო" -> (hour False 18, hour False 0)
+              "შუაღამით" -> (hour False 18, hour False 0)
+              "შუაღამისას" -> (hour False 18, hour False 0)
+              "შუაღამის" -> (hour False 18, hour False 0)
+              "შუაღამე" -> (hour False 18, hour False 0)
+              "ღამით" -> (hour False 18, hour False 0)
+              "ღამის" -> (hour False 18, hour False 0)
+              "ღამე" -> (hour False 18, hour False 0)
+              "გვიან ღამე" -> (hour False 21, hour False 0)
+              "გვიან ღამით" -> (hour False 21, hour False 0)
+              "შუადღე" -> (hour False 12, hour False 18)
+              "შუადღის" -> (hour False 12, hour False 18)
+              "შუადღით" -> (hour False 12, hour False 18)
+              "დღისით" -> (hour False 12, hour False 18)
+              "დღის" -> (hour False 12, hour False 18)
+              _ -> (hour False 12, hour False 19)
+        td <- interval TTime.Open start end
+        tt . partOfDay $ mkLatent td
+      _ -> Nothing
+  }
+
+ruleEarlyMorning :: Rule
+ruleEarlyMorning = Rule
+  { name = "early morning"
+  , pattern =
+    [ regex "დილაუთენია|დილაუთენია"
+    ]
+  , prod = \_ -> Token Time . partOfDay . mkLatent <$>
+      interval TTime.Open (hour False 4) (hour False 9)
+  }
+
+rulePODIn :: Rule
+rulePODIn = Rule
+  { name = "in|during the <part-of-day>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , regex "(-ის )?(ის )?განმავლობაში"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+rulePODThis :: Rule
+rulePODThis = Rule
+  { name = "this <part-of-day>"
+  , pattern =
+    [ regex "დღეს ?|ამ ?"
+    , Predicate isAPartOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> Token Time . partOfDay . notLatent <$>
+        intersect (cycleNth TG.Day 0) td
+      _ -> Nothing
+  }
+
+ruleTonight :: Rule
+ruleTonight = Rule
+  { name = "tonight"
+  , pattern = [regex "(დღეს )?(გვიან )?ღამე?(ით)?(ისას)?|(დღეს )?(შუა )?ღამე?(ით)?ი?ს?(ისას)?|საღამოს"]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let today = cycleNth TG.Day 0
+            h = if Text.toLower match == "გვიან " then 21 else 18
+        evening <- interval TTime.Open (hour False h) (hour False 0)
+        Token Time . partOfDay . notLatent <$> intersect today evening
+      _ -> Nothing
+  }
+
+ruleAfterPartofday :: Rule
+ruleAfterPartofday = Rule
+  { name = "after lunch/work/school"
+  , pattern =
+    [ regex "((სკოლის|ლანჩის|სამსახურის) (მერე|შემდეგ))"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        (start, end) <- case Text.toLower match of
+          "ლანჩის მერე" -> Just (hour False 13, hour False 17)
+          "ლანჩის შემდეგ" -> Just (hour False 13, hour False 17)
+          "სამსახურის მერე" -> Just (hour False 17, hour False 21)
+          "სამსახურის შემდეგ" -> Just (hour False 17, hour False 21)
+          "სკოლის მერე" -> Just (hour False 15, hour False 21)
+          "სკოლის შემდეგ" -> Just (hour False 15, hour False 21)
+          _ -> Nothing
+        td <- interval TTime.Open start end
+        Token Time . partOfDay . notLatent <$> intersect (cycleNth TG.Day 0) 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 = \case
+      (Token Time td:Token Time pod:_) -> Token Time <$> intersect pod td
+      _ -> Nothing
+  }
+
+rulePODofTime :: Rule
+rulePODofTime = Rule
+  { name = "<part-of-day> <time>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time pod:Token Time td:_) -> Token Time <$> intersect pod td
+      _ -> Nothing
+  }
+
+ruleWeekend :: Rule
+ruleWeekend = Rule
+  { name = "week-end"
+  , pattern =
+    [ regex "(მიმდინარე )?ვიქ?კ? ?ენდი?(ზე)?(სას)?|(მიმდინარე )?უიქ?კ? ?ენდი?(ზე)?(სას)?|(მიმდინარე )?შაბ?ფ?ათ ?-?კვირას?|(მიმდინარე )?უქმეები?(ზე)?"
+    ]
+  , prod = const $ tt $ mkOkForThisNext geoWeekend
+  }
+
+ruleWorkweek :: Rule
+ruleWorkweek = Rule
+  { name = "work-week"
+  , pattern =
+    [ regex "(მიმდინარე )?სამუშაო ?კვირას?(ში)?"
+    ]
+  , prod = const $ tt $ mkOkForThisNext workweek
+  }
+
+ruleSeason :: Rule
+ruleSeason = Rule
+  { name = "last|this|next <season>"
+  , pattern =
+    [ regex "(ამ|ეს|ახლანდელი|მიმდინარე|შემდეგი|მომავალი|წინა|ბოლო|გასული?) სეზონი?(ზე)?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        n <- case Text.toLower match of
+          "ეს" -> Just 0
+          "ამ" -> Just 0
+          "ახლანდელი" -> Just 0
+          "მიმდინარე" -> Just 0
+          "წინა" -> Just (-1)
+          "ბოლო" -> Just (-1)
+          "გასული" -> Just (-1)
+          "გასულ" -> Just (-1)
+          "შემდეგი" -> Just 1
+          "მომავალი" -> Just 1
+          _ -> Nothing
+        tt $ predNth n False season
+      _ -> Nothing
+  }
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ("ზაფხული", "ზაფხული?(ში)?ს?", monthDay 6 1, monthDay 8 31)
+  , ("შემოდგომა", "შემოდგომა?(ში)?ს?", monthDay 9 1, monthDay 11 30)
+  , ("ზამთარი", "ზამთარი?(ში)?ს?", monthDay 12 1, monthDay 2 28)
+  , ("გაზაფხული", "გაზაფხული?(ში)?ს?", monthDay 3 1, monthDay 5 31)
+  ]
+
+ruleTODPrecision :: Rule
+ruleTODPrecision = Rule
+  { name = "<time-of-day> sharp|exactly"
+  , pattern =
+    [ regex "(ზუსტად|იმენა)"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+rulePrecisionTOD :: Rule
+rulePrecisionTOD = Rule
+  { name = "about|exactly <time-of-day>"
+  , pattern =
+    [ regex "დაახლოებით"
+    , Predicate $ isGrainFinerThan TG.Year
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleIntervalMonthDDDD :: Rule
+ruleIntervalMonthDDDD = Rule
+  { name = "<month> dd-dd (interval)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMValue
+    , regex "-დან|დან| დან"
+    , Predicate isDOMValue
+    , regex "-მდე|მდე| მდე"
+    ]
+  , prod = \case
+      (Token Time td:token1:_:token2:_) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
+ruleIntervalMonthDDDD1 :: Rule
+ruleIntervalMonthDDDD1 = Rule
+  { name = "<month> dd-dd (interval)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMValue
+    , regex "-"
+    , Predicate isDOMValue
+    ]
+  , prod = \case
+      (Token Time td:token1:_:token2:_) -> do
+        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 "-დან|დან| დან"
+    , Predicate isDOMValue
+    , regex "-მდე|მდე| მდე"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token1:_:token2:_:Token Time td:_) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
+ruleIntervalDDDDMonth1 :: Rule
+ruleIntervalDDDDMonth1 = Rule
+  { name = "dd-dd <month> (interval)"
+  , pattern =
+    [ Predicate isDOMValue
+    , regex "-"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token1:_:token2:Token Time td:_) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenMM :: Rule
+ruleIntervalBetweenMM = Rule
+  { name = "between <time> and <time>"
+  , pattern =
+    [ Predicate isDOMValue
+    , regex "-ი?დან ?|ი?დან ?| ი?დან ?"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    , regex "-ა?მდე ?|ა?მდე ?| ა?მდე ?"
+    ]
+  , prod = \case
+      (token1:_:token2:Token Time td:_) -> do
+        start <- intersectDOM td token1
+        end <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed start end
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between <time> and <time>"
+  , pattern =
+    [ dimension Time
+    , regex "-ი?დან ?|ი?დან ?| ი?დან ?"
+    , dimension Time
+    , regex "-ა?მდე ?|ა?მდე ?| ა?მდე ?"
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalBetween1 :: Rule
+ruleIntervalBetween1 = Rule
+  { name = "between <time> and <time> 1"
+  , pattern =
+    [ dimension Time
+    , regex "-ი?დან ?|ი?დან ?| ი?დან ?"
+    , regex "დღემდე|ამ წუთამდე|ახლამდე|ამ მომენტამდე"
+    ]
+  , prod = \case
+      (Token Time td1:_) ->
+        Token Time <$> interval TTime.Closed td1 now
+      _ -> Nothing
+  }
+
+ruleIntervalBetween2 :: Rule
+ruleIntervalBetween2 = Rule
+  { name = "between <time-of-day> and <time-of-day>"
+  , pattern =
+    [ dimension Time
+    , Predicate isAPartOfDay
+    , regex "დან|-ი?დან ?|ი?დან ?| ი?დან ?"
+    , dimension Time
+    , Predicate isAPartOfDay
+    , regex "მდე|-ა?მდე ?|ა?მდე ?| ა?მდე ?"
+    ]
+  , prod = \case
+      (Token Time td1:Token Time pod1:_:Token Time td2:Token Time pod2:_) -> do
+        dom1 <- intersect pod1 td1
+        dom2 <- intersect pod2 td2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
+-- Specific for time-of-day, to help resolve ambiguities
+ruleIntervalTODDash :: Rule
+ruleIntervalTODDash = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "დან|-ი?დან ?|ი?დან ?| ი?დან ?"
+    , Predicate isATimeOfDay
+    , regex "მდე|-ა?მდე ?|ა?მდე ?| ა?მდე ?"
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalTODFrom :: Rule
+ruleIntervalTODFrom = Rule
+  { name = "from <time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "დან|-ი?დან ?|ი?დან ?| ი?დან ?"
+    , Predicate isATimeOfDay
+    , regex "მდე|-ა?მდე ?|ა?მდე ?| ა?მდე ?"
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalTODBetween :: Rule
+ruleIntervalTODBetween = Rule
+  { name = "between <time-of-day> and <time-of-day> (interval)"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex " ?და ?"
+    , Predicate isATimeOfDay
+    , regex "შორის"
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalBy :: Rule
+ruleIntervalBy = Rule
+  { name = "by <time>"
+  , pattern =
+    [ dimension Time
+    , regex "მდე|-ა?მდე ?|ა?მდე ?| ა?მდე ?"
+    ]
+  , prod = \case
+      (_:Token Time td:_) ->
+        Token Time <$> interval TTime.Open now td
+      _ -> Nothing
+  }
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
+  [ ("ორშაბათი", "ორშაბათი?ს?")
+  , ("სამშაბათი", "სამშაბათი?ს?")
+  , ("ოთხშაბათი", "ოთხშაბათი?ს?")
+  , ("ხუთშაბათი", "ხუთშაბათი?ს?")
+  , ("პარასკევი", "პარასკევი?ს?")
+  , ("შაბათი", "შაბათი?ს?")
+  , ("კვირა", "კვირას?|კვირის")
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = mkRuleMonthsWithLatent
+  [ ("იანვარი", "იანვა?რი?ს?(ის)?", False)
+  , ("თებერვალი", "თებერვა?ლი?ს?(ის)?", False)
+  , ("მარტი", "მარტი?ს?(ის)?", False)
+  , ("აპრილი", "აპრილი?ს?(ის)?", False)
+  , ("მაისი", "მაისი?ს?(ის)?", False)
+  , ("ივნისი", "ივნისი?ს?(ის)?", False)
+  , ("ივლისი", "ივლისი?ს?(ის)?", False)
+  , ("აგვისტო", "აგვისტო?ს?", False)
+  , ("სექტემბერი", "სექტემბე?რის|სექტემბე?რი?ს?", False)
+  , ("ოქტომბერი", "ოქტომბე?რის|ოქტომბე?რი?ს?", False)
+  , ("ნოემბერი", "ნოემბე?რის|ნოემბე?რი?ს?", False)
+  , ("დეკემბერი", "დეკემბრის?|დეკემბე?რი?ს?", False)
+  ]
+
+ruleNamedMonth :: Rule
+ruleNamedMonth = Rule
+  { name = "in <named-month>"
+  , pattern =
+    [ Predicate isAMonth
+    , regex "ში"
+    ]
+  , prod = \case
+      (Token Time td2:_) -> Token Time <$> interval TTime.Closed
+        (cycleNthAfter False TG.Month 0 td2)
+        (cycleNthAfter False TG.Month 0 td2)
+      _ -> Nothing
+  }
+
+rulePartOfMonth :: Rule
+rulePartOfMonth = Rule
+  { name = "part of <named-month>"
+  , pattern =
+    [ Predicate $ or . sequence [isAMonth, isGrainOfTime TG.Month]
+    , regex "(ის )?(დასაწყის(ი|ში|ისას|ისკენ)|შუ(ა|აში|ისკენ)|ბოლო(ს|მდე|ში|სკენ)?)"
+    ]
+  , prod = \case
+      (Token Time td:Token RegexMatch (GroupMatch (_:match:_)):_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "დასაწყისისკენ" -> Just (1, 10)
+          "დასაწყისიდან" -> Just (1, 10)
+          "დასაწყისას" -> Just (1, 10)
+          "დასაწყისში" -> Just (1, 10)
+          "დასაწყისი" -> Just (1, 10)
+          "შუისკენ" -> Just (11, 20)
+          "შუაში" -> Just (11, 20)
+          "შუა" -> Just (11, 20)
+          "ბოლომდე" -> Just (21, -1)
+          "ბოლოსკენ" -> Just (21, -1)
+          "ბოლოში" -> Just (21, -1)
+          "ბოლოს" -> Just (21, -1)
+          "ბოლო" -> Just (21, -1)
+          _  -> Nothing
+        start <- intersect td $ dayOfMonth sd
+        end <- if ed /= -1
+          then intersect td $ dayOfMonth ed
+          else Just $ cycleLastOf TG.Day td
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOrBeginningOfMonth :: Rule
+ruleEndOrBeginningOfMonth = Rule
+  { name = "at the beginning|end of <named-month>"
+  , pattern =
+    [ Predicate $ or . sequence [isAMonth, isGrainOfTime TG.Month]
+    , regex "(ის )?(დასაწყისშ?ი|ბოლო(ს?|ში))"
+    ]
+  , prod = \case
+      (Token Time td:Token RegexMatch (GroupMatch (_:match:_)):_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "დასაწყისი" -> Just (1, 10)
+          "დასაწყისში" -> Just (1, 10)
+          "ბოლოს" -> Just (21, -1)
+          "ბოლოში" -> Just (21, -1)
+          "ბოლო" -> Just (21, -1)
+          _ -> Nothing
+        start <- intersect td $ dayOfMonth sd
+        end <- if ed /= -1
+          then intersect td $ dayOfMonth ed
+          else Just $ cycleLastOf TG.Day td
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOfMonth :: Rule
+ruleEndOfMonth = Rule
+  { name = "end of month"
+  , pattern =
+    [ regex "(ამ )?(მიმდინარე )?თვის ბოლოს?(კენ)?(თვის)?"
+    ]
+  , prod = \case
+      (Token RegexMatch _:_)
+        | (Just start, Just end) <- parsed ->
+          Token Time <$> interval TTime.Open start end
+        where
+          cycleMonth = cycleNth TG.Month
+          parsed =
+              ( intersect (dayOfMonth 21) $ cycleMonth 0
+              , Just $ cycleLastOf TG.Day $ cycleMonth 0)
+      _ -> Nothing
+  }
+
+ruleBeginningOfMonth :: Rule
+ruleBeginningOfMonth = Rule
+  { name = "beginning of month"
+  , pattern =
+    [ regex "(ამ )?(მიმდინარე )?თვის დასაწყისი?(ში)?(სკენ)?(სთვის)?"
+    ]
+  , prod = \_ -> do
+      start <- intersect (dayOfMonth 1) $ cycleNth TG.Month 0
+      end <- intersect (dayOfMonth 10) $ cycleNth TG.Month 0
+      Token Time <$> interval TTime.Open start end
+  }
+
+ruleEndOrBeginningOfYear :: Rule
+ruleEndOrBeginningOfYear = Rule
+  { name = "at the beginning|end of <year>"
+  , pattern =
+    [ Predicate $ isGrainOfTime TG.Year
+    , regex "(წლის )?დასაწყისი?(ისკენ)?(ში)? |ბოლოს?(კენ)?(ში)? "
+    ]
+  , prod = \case
+      (Token Time td:Token RegexMatch (GroupMatch (_:match:_)):_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "დასაწყისისკენ" -> Just (1, 4)
+          "დასაწყისში" -> Just (1, 4)
+          "ბოლოსკენ"       -> Just (9, -1)
+          "ბოლოს"       -> Just (9, -1)
+          "ბოლოში"       -> Just (9, -1)
+          _           -> Nothing
+        start <- intersect td $ month sd
+        end <- if ed /= -1
+          then intersect td $ cycleLastOf TG.Month $ month ed
+          else cycleNthAfter False TG.Year 1 <$> intersect td (month 1)
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOfYear :: Rule
+ruleEndOfYear = Rule
+  { name = "end of year"
+  , pattern =
+    [ regex "((მიმდინარე )?(ამ )?წლის ბოლოს?(კენ)?(ში)?(თვის)?)"
+    ]
+  , prod = \_ -> do
+        start <- intersect (month 9) $ cycleNth TG.Year 0
+        end <- intersect (month 1) $ cycleNth TG.Year 1
+        Token Time <$> interval TTime.Open start end
+  }
+
+ruleBeginningOfYear :: Rule
+ruleBeginningOfYear = Rule
+  { name = "beginning of year"
+  , pattern = [ regex "((ამ )?(მიმდინარე )?წლის დასაწყისი?(ში)?(სკენ)?(სთვის)?)" ]
+  , prod = \_ -> do
+      start <- intersect (month 1) $ cycleNth TG.Year 0
+      end <- intersect (month 4) $ cycleNth TG.Year 0
+      Token Time <$> interval TTime.Open start end
+  }
+
+ruleEndOrBeginningOfWeek :: Rule
+ruleEndOrBeginningOfWeek = Rule
+  { name = "at the beginning|end of <week>"
+  , pattern =
+    [ Predicate $ isGrainOfTime TG.Week
+    , regex "(დასაწყისი|დასაწყისში|ბოლოში|ბოლოს)"
+    ]
+  , prod = \case
+      (Token Time td:Token RegexMatch (GroupMatch (_:match:_)):_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "დასაწყისი" -> Just (1, 3)
+          "დასაწყისში" -> Just (1, 3)
+          "ბოლოში" -> Just (5, 7)
+          "ბოლოს" -> Just (5, 7)
+          _ -> Nothing
+        start <- intersect td $ dayOfWeek sd
+        end <- intersect td $ dayOfWeek ed
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ("ახალი წელი", "ახალი წე?ლი?ს?", monthDay 1 1)
+  , ("შობა", "შობა?(ი)?ს?", monthDay 1 7 )
+  , ("ნათლისღება", "ნათლისღება?(ი)?ს?", monthDay 1 19 )
+  , ("დედის დღე", "დედის დღე?ს?", monthDay 3 3)
+  , ("ქალთა საერთაშორისო დღე", "ქალთა (საერთაშორისო )?დღე?ს?", monthDay 3 8 )
+  , ("საქართველოს დამოუკიდებლობის აღდგენის დღე", "საქართველოს (თავისუფლებისა და ერთიანობისთვის დაღუპულთა მოხსენიების)?(დამოუკიდებლობის აღდგენის )?დღეს?", monthDay 4 9 )
+  , ("გამარჯვების დღე", "(ფაშიზმზე)?გამარჯვების დღეს?", monthDay 5 9 )
+  , ("წმინდა ანდრია პირველწოდებულის ხსენების დღე", "(წმინდა)?ანდრია პირველწოდებულის ხსენების დღე?ს?", monthDay 5 12 )
+  , ("დამოუკიდებლობის დღე", "(საქართველოს)?დამოუკიდებლობის დღე?ს?", monthDay 5 26 )
+  , ("მცხეთობა", "მცხეთობა?ს?", monthDay 10 14)
+  , ("გიორგობა", "გიორგობა?ს?", monthDay 11 26)
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ("Orthodox Easter Monday", "orthodox\\s+easter\\s+mon(day)?"
+    , cycleNthAfter False TG.Day 1 orthodoxEaster)
+  , ("აღდგომა", "აღდგომი?ა?ს?(ისას)?"
+    , orthodoxEaster)
+  , ("დიდი შაბათი", "დიდი? შაბათი?ს?(ისას)?"
+    , cycleNthAfter False TG.Day (-1) orthodoxEaster)
+  , ("წითელი პარასკევი", "წითელი? პარასკევი?ს?(სას)?"
+    , cycleNthAfter False TG.Day (-2) orthodoxEaster)
+  , ("დიდი ხუთშაბათი", "დიდი? ხუთშაბათი?ს?(ისას)?"
+    , cycleNthAfter False TG.Day (-7) orthodoxEaster)
+  ]
+
+ruleCycleThisLastNext :: Rule
+ruleCycleThisLastNext = Rule
+  { name = "this|last|next <cycle>"
+  , pattern =
+    [ regex "(ეს|ამ|მიმდინარე|შემდეგი?|მომავალი?|წინა|წინის წინა?|გასული?)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):Token TimeGrain grain:_) ->
+        case Text.toLower match of
+          "ეს" -> tt $ cycleNth grain 0
+          "ამ" -> tt $ cycleNth grain 0
+          "მიმდინარე" -> tt $ cycleNth grain 0
+          "წინა" -> tt . cycleNth grain $ - 1
+          "გასული" -> tt . cycleNth grain $ - 1
+          "გასულ" -> tt . cycleNth grain $ - 1
+          "წინის წინ" -> tt . cycleNth grain $ - 2
+          "წინის წინა" -> tt . cycleNth grain $ - 2
+          "შემდეგ" -> tt $ cycleNth grain 1
+          "შემდეგი" -> tt $ cycleNth grain 1
+          "მომავალ" -> tt $ cycleNth grain 1
+          "მომავალი" -> tt $ cycleNth grain 1
+          _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleCycleThisLastNextInterval :: Rule
+ruleCycleThisLastNextInterval = Rule
+  { name = "this|last|next <cycle>"
+  , pattern =
+    [ regex "(ეს|ამ|მიმდინარე|შემდეგი?|მომავალი?|წინა|წინის წინა?|გასული?|მომდევნო)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       Token TimeGrain grain:
+       _) -> let
+         n = case Text.toLower match of
+           "ეს" -> 0
+           "ამ" -> 0
+           "მიმდინარე" -> 0
+           "წინა" -> -1
+           "გასული" -> -1
+           "გასულ" -> -1
+           "წინის წინ" -> -2
+           "წინის წინა" -> -2
+           _ -> 1
+         in Token Time <$> interval TTime.Closed (cycleNth grain n) (cycleNth grain n)
+      _ -> Nothing
+  }
+
+ruleDOMOfTimeMonth :: Rule
+ruleDOMOfTimeMonth = Rule
+  { name = "<day-of-month> (ordinal or number) of <month>"
+  , pattern =
+    [ Predicate isDOMValue
+    , Predicate $ isGrainOfTime TG.Month
+    ]
+  , prod = \case
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleCycleTheAfterBeforeTime :: Rule
+ruleCycleTheAfterBeforeTime = Rule
+  { name = "the <cycle> after|before <time>"
+  , pattern =
+    [ dimension Time
+    , regex "(დან|ა?მდე)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (  Token Time td
+       : Token RegexMatch (GroupMatch (match:_))
+       : Token TimeGrain grain
+       : _) ->
+        let n = if Text.toLower match == "დან" then 1 else - 1 in
+          tt $ cycleNthAfter False grain n td
+      _ -> Nothing
+  }
+
+ruleCycleTheAfterBeforeTime1 :: Rule
+ruleCycleTheAfterBeforeTime1 = Rule
+  { name = "the <cycle> after <time>"
+  , pattern =
+    [ dimension Time
+    , regex "დან"
+    , Predicate $ isIntegerBetween 0 99999
+    , dimension TimeGrain
+    , regex "ში|ის შემდეგ"
+    ]
+  , prod = \case
+      (  Token Time td
+       : _
+       : token
+       : Token TimeGrain grain
+       : _) -> do
+          n <- getIntValue token
+          tt $ cycleNthAfter False grain n td
+      _ -> Nothing
+  }
+
+ruleCycleOrdinalOfTime :: Rule
+ruleCycleOrdinalOfTime = Rule
+  { name = "<ordinal> <cycle> of <time>"
+  , pattern =
+    [ dimension Time
+    , regex "დან"
+    , dimension Ordinal
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token Time td:_:token:Token TimeGrain grain:_) -> do
+        n <- getIntValue token
+        tt $ cycleNthAfter True grain (n - 1) td
+      _ -> Nothing
+  }
+
+ruleCycleLastOrdinalOfTime :: Rule
+ruleCycleLastOrdinalOfTime = Rule
+  { name = "<ordinal> last <cycle> of <time>"
+  , pattern =
+    [ dimension Time
+    , regex "ბოლოდან"
+    , dimension Ordinal
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token Time td:_:token:Token TimeGrain grain:_) -> do
+        n <- getIntValue token
+        tt . cycleNthAfter True grain (-n) . cycleNthAfter
+          True (timeGrain td) 1 $ td
+      _ -> Nothing
+  }
+
+ruleDurationInWithinAfter :: Rule
+ruleDurationInWithinAfter = Rule
+  { name = "in|within|after <duration>"
+  , pattern =
+    [ dimension Duration
+    , regex "(განმავლობაში|შემდეგ)"
+    ]
+  , prod = \case
+      (Token Duration dd:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "განმავლობაში" -> Token Time <$>
+           interval TTime.Open now (inDuration dd)
+         "შემდეგ"  -> tt . withDirection TTime.After $ inDuration dd
+         _        -> Nothing
+      _ -> Nothing
+  }
+
+ruleDurationLastNext :: Rule
+ruleDurationLastNext = Rule
+  { name = "last|past|next <duration>"
+  , pattern =
+    [ regex "(წინა|მომდევნო|გასული?|მომავალ)"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       Token Duration DurationData{TDuration.grain, TDuration.value}:
+       _) -> case Text.toLower match of
+         "მომდევნო" -> tt $ cycleN True grain value
+         "მომავალ" -> tt $ cycleN True grain value
+         "წინა" -> tt $ cycleN True grain (- value)
+         "გასული" -> tt $ cycleN True grain (- value)
+         "გასულ" -> tt $ cycleN True grain (- value)
+         _      -> Nothing
+      _ -> Nothing
+  }
+
+ruleNDOWago :: Rule
+ruleNDOWago = Rule
+  { name = "<integer> <named-day> ago|back"
+  , pattern =
+    [ Predicate isNatural
+    , Predicate isADayOfWeek
+    , regex " ?დღის წინ| ?დღის უკან"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:Token Time td:_) ->
+        tt $ predNth (- (floor v)) False td
+      _ -> Nothing
+  }
+
+ruleDurationHenceAgo :: Rule
+ruleDurationHenceAgo = Rule
+  { name = "<duration> hence|ago"
+  , pattern =
+    [ dimension Duration
+    , regex "წინ|უკან"
+    ]
+  , prod = \case
+      (Token Duration dd:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+        "წინ" -> tt $ durationAgo dd
+        "უკან" -> tt $ durationAgo dd
+        _     -> tt $ inDuration dd
+      _ -> Nothing
+  }
+
+ruleDayDurationHenceAgo :: Rule
+ruleDayDurationHenceAgo = Rule
+  { name = "<day> <duration> hence|ago"
+  , pattern =
+    [ Predicate $ or . sequence [isGrainOfTime TG.Day, isGrainOfTime TG.Month]
+    , dimension Duration
+    , regex "(წინ|უკან)"
+    ]
+  , prod = \case
+      (Token Time td:
+       Token Duration dd:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "უკან" -> Token Time <$> intersect td (durationIntervalAgo dd)
+         _     -> Token Time <$> intersect td (inDurationInterval dd)
+      _ -> Nothing
+  }
+
+ruleInNumeral :: Rule
+ruleInNumeral = Rule
+  { name = "in <number> (implicit minutes)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 0 60
+    , regex " ?წუთში"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        tt . inDuration . duration TG.Minute $ floor v
+      _ -> Nothing
+  }
+
+ruleDurationAfterBeforeTime :: Rule
+ruleDurationAfterBeforeTime = Rule
+  { name = "<duration> after|before|from <time>"
+  , pattern =
+    [ dimension Time
+    , dimension Duration
+    , regex "(წინ)"
+    ]
+  , prod = \case
+      (Token Time td:
+       Token Duration dd:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "წინ" -> tt $ durationBefore dd td
+         _        -> tt $ durationAfter dd td
+      _ -> Nothing
+  }
+
+ruleDurationAfterBeforeTime1 :: Rule
+ruleDurationAfterBeforeTime1 = Rule
+  { name = "<duration> after|before|from <time>"
+  , pattern =
+    [ dimension Duration
+    , regex "(წინ)"
+    ]
+  , prod = \case
+      (Token Duration dd:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "წინ" -> tt $ durationBefore dd now
+         _        -> tt $ durationAfter dd now
+      _ -> Nothing
+  }
+
+ruleDurationLastNext1 :: Rule
+ruleDurationLastNext1 = Rule
+  { name = "last|past|next <duration>"
+  , pattern =
+    [ regex "ბოლო|უკანასკნელი?"
+    , dimension Duration
+    ]
+  , prod = \case
+      (_:
+       Token Duration dd:
+       _) -> do
+        Token Time <$> interval TTime.Closed (durationAgo dd) now
+      _ -> Nothing
+  }
+
+ruleCycleOrdinalQuarter :: Rule
+ruleCycleOrdinalQuarter = Rule
+  { name = "<ordinal> quarter"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        let
+          start = cycleNthAfter True TG.Quarter (n - 1) $ cycleNth TG.Year 0
+          end = cycleNthAfter True TG.Quarter n $ cycleNth TG.Year 0
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+-- For example, Today(დღეს), This year(წელს)
+ruleGrainOfTime :: Rule
+ruleGrainOfTime = Rule
+  { name = "<TimeGrain>"
+  , pattern =
+    [ Predicate $ isGrainCoarserThan TG.Day
+    ]
+  , prod = \case
+      (Token TimeGrain grain:_) -> do
+        Token Time <$> interval TTime.Closed (cycleNth grain 0) now
+      _ -> Nothing
+  }
+
+ruleYear :: Rule
+ruleYear = Rule
+  { name = "this|last|next year"
+  , pattern =
+    [ regex "(შარშან ?წინის? ?წინ|შარშან ?წინ|შარშან|გასული? წელი?ს?|წელს)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> let
+        n = case Text.toLower match of
+          "წელს" -> 0
+          "შარშან" -> -1
+          "გასული წელი" -> -1
+          "გასულ წელს" -> -1
+          "შარშან წინ" -> -2
+          "შარშანწინ" -> -2
+          _ -> -3
+        in Token Time <$> interval TTime.Open (cycleNth TG.Year n) (cycleNth TG.Year $ n + 1)
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntersect
+  , ruleCycleOrdinalQuarter
+  , ruleDurationLastNext1
+  , ruleAbsorbInYear
+  , ruleNextDOW
+  , ruleNextTime
+  , ruleThisTime
+  , ruleLastTime
+  , ruleTimeAfterNext
+  , ruleTimeBeforeLast
+  , ruleLastWeekendOfMonth
+  , ruleLastWeekendOfMonth1
+  , ruleLastWorkweekOfMonth
+  , ruleLastWorkweekOfMonth1
+  , ruleNthTimeOfTime
+  , ruleNthTimeAfterTime
+  , ruleYearLatent
+  , ruleTheDOMNumeral
+  , ruleMonthDOMNumeral1
+  , ruleTODLatent
+  , ruleAtTOD
+  , ruleTODOClock
+  , ruleHHMM
+  , ruleHHMMLatent
+  , ruleHHMMSS
+  , ruleMilitaryAMPM
+  , ruleMilitarySpelledOutAMPM
+  , ruleMilitarySpelledOutAMPM2
+  , ruleTODAMPM
+  , ruleHalfToHOD
+  , ruleNumeralAfterHOD
+  , ruleNumeralAfterHOD1
+  , ruleNumeralAfterHOD2
+  , ruleNumeralToHOD
+  , ruleNumeralToHOD1
+  , rulePODIn
+  , rulePODThis
+  , ruleYYYYMMDD
+  , ruleMMYYYY
+  , rulePartOfDays
+  , ruleEarlyMorning
+  , ruleTonight
+  , ruleAfterPartofday
+  , ruleTimePOD
+  , rulePODofTime
+  , ruleWeekend
+  , ruleTODPrecision
+  , rulePrecisionTOD
+  , ruleIntervalMonthDDDD
+  , ruleIntervalMonthDDDD1
+  , ruleIntervalDDDDMonth
+  , ruleIntervalDDDDMonth1
+  , ruleIntervalBetween
+  , ruleIntervalBetween1
+  , ruleIntervalBetween2
+  , ruleIntervalTODDash
+  , ruleIntervalTODBetween
+  , ruleIntervalTODFrom
+  , ruleIntervalBy
+  , ruleCycleTheAfterBeforeTime
+  , ruleCycleTheAfterBeforeTime1
+  , ruleCycleThisLastNext
+  , ruleDOMOfTimeMonth
+  , ruleCycleOrdinalOfTime
+  , ruleCycleLastOrdinalOfTime
+  , ruleDurationInWithinAfter
+  , ruleNDOWago
+  , ruleDurationLastNext
+  , ruleDurationHenceAgo
+  , ruleDayDurationHenceAgo
+  , ruleDurationAfterBeforeTime
+  , ruleDurationAfterBeforeTime1
+  , ruleInNumeral
+  , ruleCycleThisLastNextInterval
+  , rulePartOfMonth
+  , ruleEndOrBeginningOfYear
+  , ruleEndOrBeginningOfMonth
+  , ruleEndOrBeginningOfWeek
+  , ruleNow
+  , ruleSeason
+  , ruleEndOfMonth
+  , ruleBeginningOfMonth
+  , ruleEndOfYear
+  , ruleBeginningOfYear
+  , ruleGrainOfTime
+  , ruleYear
+  , ruleIntervalBetweenMM
+  , ruleWorkweek
+  , ruleNamedMonth
+  , ruleMMDD
+  , ruleMMDDYYYY
+  , ruleMMDDYYYYDot
+  , ruleYearInterval
+  ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
+  ++ ruleSeasons
+  ++ ruleComputedHolidays
+  ++ rulePeriodicHolidays
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -349,35 +348,35 @@
   , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
              [ "이번겨울"
              ]
-  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Christmas")
              [ "크리스마스"
              ]
-  , examples (datetime (2013, 12, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 24, 0, 0, 0) Day "Christmas Eve")
              [ "크리스마스이브"
              ]
-  , examples (datetime (2014, 1, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "New Year's Day")
              [ "신정"
              , "설날"
              ]
-  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 3, 1, 0, 0, 0) Day "Independence Movement Day")
              [ "삼일절"
              ]
-  , examples (datetime (2013, 5, 5, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 5, 5, 0, 0, 0) Day "Children's Day")
              [ "어린이날"
              ]
-  , examples (datetime (2013, 6, 6, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 6, 6, 0, 0, 0) Day "Memorial Day")
              [ "현충일"
              ]
-  , examples (datetime (2013, 6, 17, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 7, 17, 0, 0, 0) Day "Constitution Day")
              [ "제헌절"
              ]
-  , examples (datetime (2013, 8, 15, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 8, 15, 0, 0, 0) Day "Liberation Day")
              [ "광복절"
              ]
-  , examples (datetime (2013, 10, 3, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 3, 0, 0, 0) Day "National Foundation Day")
              [ "개천절"
              ]
-  , examples (datetime (2013, 10, 9, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 9, 0, 0, 0) Day "Hangul Day")
              [ "한글날"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -17,16 +16,60 @@
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+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
 
+ruleHolidays :: [Rule]
+ruleHolidays = mkRuleHolidays
+  [ ( "Liberation Day"            , "광복절"
+    , monthDay  8   15 )
+  , ( "Constitution Day"          , "제헌절"
+    , monthDay  7   17 )
+  , ( "New Year's Day"            , "(신정)|(설날)"
+    , monthDay  1   1  )
+  , ( "Hangul Day"                , "한글날"
+    , monthDay  10  9  )
+  , ( "National Foundation Day"   , "개천절"
+    , monthDay  10  3  )
+  , ( "Independence Movement Day" , "삼일절"
+    , monthDay  3   1  )
+  , ( "Memorial Day"              , "현충일"
+    , monthDay  6   6  )
+  , ( "Christmas"                 , "크리스마스"
+    , monthDay  12  25 )
+  , ( "Christmas Eve"             , "(크리스마스)?이브"
+    , monthDay  12  24 )
+  , ( "Children's Day"            , "어린이날"
+    , monthDay  5   5  )
+  ]
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "Summer"  , "여름"  , monthDay  6   21, monthDay  9   23 )
+  , ( "Fall"    , "가을"  , monthDay  9   23, monthDay  12  21 )
+  , ( "Winter"  , "겨울"  , monthDay  12  21, monthDay  3   20 )
+  , ( "Spring"  , "봄"    , monthDay  3   20, monthDay  6   21 )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
+  [ ( "Monday"    , "월(요일|욜)" )
+  , ( "Tuesday"   , "화(요일|욜)" )
+  , ( "Wednesday" , "수(요일|욜)" )
+  , ( "Thursday"  , "목(요일|욜)" )
+  , ( "Friday"    , "금(요일|욜)" )
+  , ( "Saturday"  , "토(요일|욜)" )
+  , ( "Sunday"    , "일(요일|욜)" )
+  ]
+
 ruleNamedday :: Rule
 ruleNamedday = Rule
   { name = "<named-day>에"
@@ -39,15 +82,6 @@
       _ -> Nothing
   }
 
-ruleLiberationDay :: Rule
-ruleLiberationDay = Rule
-  { name = "Liberation Day"
-  , pattern =
-    [ regex "광복절"
-    ]
-  , prod = \_ -> tt $ monthDay 8 15
-  }
-
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow - 내일모레"
@@ -58,15 +92,6 @@
       tt . cycleNthAfter False TG.Day 1 $ cycleNth TG.Day 1
   }
 
-ruleConstitutionDay :: Rule
-ruleConstitutionDay = Rule
-  { name = "Constitution Day"
-  , pattern =
-    [ regex "제헌절"
-    ]
-  , prod = \_ -> tt $ monthDay 6 17
-  }
-
 ruleTimeofday4 :: Rule
 ruleTimeofday4 = Rule
   { name = "<time-of-day>이전"
@@ -120,15 +145,6 @@
       _ -> Nothing
   }
 
-ruleNewYearsDay :: Rule
-ruleNewYearsDay = Rule
-  { name = "New Year's Day"
-  , pattern =
-    [ regex "신정|설날"
-    ]
-  , prod = \_ -> tt $ monthDay 1 1
-  }
-
 ruleLastTime :: Rule
 ruleLastTime = Rule
   { name = "last <time>"
@@ -175,7 +191,7 @@
   , pattern =
     [ regex "방금|지금|방금|막"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleMonth :: Rule
@@ -192,18 +208,6 @@
       _ -> Nothing
   }
 
-ruleSeason4 :: Rule
-ruleSeason4 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "봄"
-    ]
-  , 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)"
@@ -245,7 +249,7 @@
   , pattern =
     [ regex "오늘|당일|금일"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleIntegerHourofdayRelativeMinutes :: Rule
@@ -259,8 +263,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:token:_) -> do
         v <- getIntValue token
-        t <- minutesBefore v td
-        Just $ Token Time t
+        Token Time <$> minutesBefore v td
       _ -> Nothing
   }
 
@@ -344,25 +347,6 @@
       tt . cycleNthAfter False TG.Day (-1) $ cycleNth TG.Day (-1)
   }
 
-ruleDayofweek :: Rule
-ruleDayofweek = Rule
-  { name = "day-of-week"
-  , pattern =
-    [ regex "(월|화|수|목|금|토|일)(요일|욜)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "월" -> tt $ dayOfWeek 1
-        "화" -> tt $ dayOfWeek 2
-        "수" -> tt $ dayOfWeek 3
-        "목" -> tt $ dayOfWeek 4
-        "금" -> tt $ dayOfWeek 5
-        "토" -> tt $ dayOfWeek 6
-        "일" -> tt $ dayOfWeek 7
-        _ -> Nothing
-      _ -> Nothing
-  }
-
 ruleNextCycle :: Rule
 ruleNextCycle = Rule
   { name = "next <cycle>"
@@ -452,15 +436,6 @@
            interval TTime.Open from to
   }
 
-ruleChristmasEve :: Rule
-ruleChristmasEve = Rule
-  { name = "christmas eve"
-  , pattern =
-    [ regex "(크리스마스)?이브"
-    ]
-  , prod = \_ -> tt $ monthDay 12 24
-  }
-
 ruleInduringThePartofday :: Rule
 ruleInduringThePartofday = Rule
   { name = "in|during the <part-of-day>"
@@ -540,30 +515,6 @@
       _ -> Nothing
   }
 
-ruleSeason3 :: Rule
-ruleSeason3 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "겨울"
-    ]
-  , 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 "여름"
-    ]
-  , prod = \_ ->
-      let from = monthDay 6 21
-          to = monthDay 9 23
-      in Token Time <$> interval TTime.Open from to
-  }
-
 ruleDayWithKoreanNumeral :: Rule
 ruleDayWithKoreanNumeral = Rule
   { name = "day with korean number - 십일..삼십일일"
@@ -678,9 +629,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
-        let from = cycleNth TG.Second 0
-            to = inDuration dd
-        in Token Time <$> interval TTime.Open from to
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -888,15 +837,6 @@
       _ -> Nothing
   }
 
-ruleMemorialDay :: Rule
-ruleMemorialDay = Rule
-  { name = "Memorial Day"
-  , pattern =
-    [ regex "현충일"
-    ]
-  , prod = \_ -> tt $ monthDay 6 6
-  }
-
 ruleYearLatent :: Rule
 ruleYearLatent = Rule
   { name = "year (latent)"
@@ -919,18 +859,6 @@
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
 
-ruleSeason2 :: Rule
-ruleSeason2 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "가을"
-    ]
-  , 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>"
@@ -944,15 +872,6 @@
       _ -> Nothing
   }
 
-ruleChristmas :: Rule
-ruleChristmas = Rule
-  { name = "christmas"
-  , pattern =
-    [ regex "크리스마스"
-    ]
-  , prod = \_ -> tt $ monthDay 12 25
-  }
-
 ruleTimeofdayAmpm :: Rule
 ruleTimeofdayAmpm = Rule
   { name = "<time-of-day> am|pm"
@@ -992,8 +911,7 @@
     , regex "지나서|후에"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1011,15 +929,6 @@
       _ -> Nothing
   }
 
-ruleHangulDay :: Rule
-ruleHangulDay = Rule
-  { name = "Hangul Day"
-  , pattern =
-    [ regex "한글날"
-    ]
-  , prod = \_ -> tt $ monthDay 10 9
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1062,15 +971,6 @@
       _ -> Nothing
   }
 
-ruleChildrensDay :: Rule
-ruleChildrensDay = Rule
-  { name = "Children's Day"
-  , pattern =
-    [ regex "어린이날"
-    ]
-  , prod = \_ -> tt $ monthDay 5 5
-  }
-
 ruleAbsorptionOfAfterNamedDay :: Rule
 ruleAbsorptionOfAfterNamedDay = Rule
   { name = "absorption of , after named day"
@@ -1091,8 +991,7 @@
     , regex "까지"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) td
+      (Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1142,15 +1041,6 @@
       _ -> Nothing
   }
 
-ruleNationalFoundationDay :: Rule
-ruleNationalFoundationDay = Rule
-  { name = "National Foundation Day"
-  , pattern =
-    [ regex "개천절"
-    ]
-  , prod = \_ -> tt $ monthDay 10 3
-  }
-
 ruleEveningnight :: Rule
 ruleEveningnight = Rule
   { name = "evening|night"
@@ -1164,15 +1054,6 @@
            interval TTime.Open from to
   }
 
-ruleIndependenceMovementDay :: Rule
-ruleIndependenceMovementDay = Rule
-  { name = "Independence Movement Day"
-  , pattern =
-    [ regex "삼일절"
-    ]
-  , prod = \_ -> tt $ monthDay 3 1
-  }
-
 ruleMmddyyyy :: Rule
 ruleMmddyyyy = Rule
   { name = "mm/dd/yyyy"
@@ -1264,29 +1145,22 @@
   , ruleAfternoon
   , ruleAmpmTimeofday
   , ruleByTime
-  , ruleChildrensDay
-  , ruleChristmas
-  , ruleChristmasEve
-  , ruleConstitutionDay
   , ruleDate
   , ruleDatetimeDatetimeInterval
   , ruleDay
   , ruleDayWithKoreanNumeral
   , ruleDayWithKoreanNumeral2
-  , ruleDayofweek
   , ruleDurationAgo
   , ruleDurationFromNow
   , ruleEndOfTime
   , ruleEveningnight
   , ruleExactlyTimeofday
-  , ruleHangulDay
   , ruleHhmm
   , ruleHhmmMilitaryAmpm
   , ruleHhmmss
   , ruleHourofdayIntegerAsRelativeMinutes
   , ruleHourofdayHalfAsRelativeMinutes
   , ruleInDuration
-  , ruleIndependenceMovementDay
   , ruleInduringThePartofday
   , ruleIntegerHourofdayRelativeMinutes
   , ruleHalfHourofdayRelativeMinutes
@@ -1295,9 +1169,7 @@
   , ruleLastCycle
   , ruleLastNCycle
   , ruleLastTime
-  , ruleLiberationDay
   , ruleLunch
-  , ruleMemorialDay
   , ruleMidnighteodendOfDay
   , ruleMmdd
   , ruleMmddyyyy
@@ -1305,18 +1177,12 @@
   , ruleMorning
   , ruleNamedday
   , ruleNamedmonth
-  , ruleNationalFoundationDay
-  , ruleNewYearsDay
   , ruleNextCycle
   , ruleNextNCycle
   , ruleNextTime
   , ruleNoon
   , ruleNow
   , ruleQuarter
-  , ruleSeason
-  , ruleSeason2
-  , ruleSeason3
-  , ruleSeason4
   , ruleSinceTimeofday
   , ruleTheDayAfterTomorrow
   , ruleTheDayBeforeYesterday
@@ -1352,3 +1218,6 @@
   , ruleSeconds
   , ruleTimezone
   ]
+  ++ ruleHolidays
+  ++ ruleSeasons
+  ++ ruleDaysOfWeek
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -38,6 +37,7 @@
              ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
              [ "i morgen"
+             , "i morra"
              ]
   , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
              [ "mandag"
@@ -81,6 +81,11 @@
              , "den tredje mars"
              , "den 3. mars"
              ]
+  , examples (datetime (2013, 10, 30, 0, 0, 0) Day)
+             [ "30.10"
+             , "30/10"
+             , "30-10"
+             ]
   , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
              [ "3 mars 2015"
              , "tredje mars 2015"
@@ -91,6 +96,9 @@
              , "3/3/15"
              , "2015-3-3"
              , "2015-03-03"
+             , "2015.03.03"
+             , "03/03/2015"
+             , "03.03.2015"
              ]
   , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
              [ "På den 15."
@@ -104,7 +112,16 @@
              , "februar 15"
              , "15-02"
              , "15/02"
+             , "15.2"
              ]
+  , examples (datetime (2013, 11, 27, 0, 0, 0) Day)
+             [ "den 27. november"
+             , "27. november"
+             , "november 27"
+             , "27-11"
+             , "27/11"
+             , "27.11"
+             ]
   , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
              [ "8 Aug"
              ]
@@ -113,8 +130,13 @@
              ]
   , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
              [ "31/10/1974"
+             , "31.10.1974"
              , "31/10/74"
              , "31-10-74"
+             , "31.10.74"
+             , "1974/10/31"
+             , "1974-10-31"
+             , "1974.10.31"
              ]
   , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
              [ "14april 2015"
@@ -221,6 +243,7 @@
              ]
   , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
              [ "i overimorgen"
+             , "i overimorra"
              ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
              [ "i forigårs"
@@ -267,6 +290,7 @@
              ]
   , examples (datetime (2013, 2, 13, 3, 0, 0) Hour)
              [ "klokken 3"
+             , "klokka 3"
              , "kl. 3"
              ]
   , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
@@ -274,6 +298,7 @@
              ]
   , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
              [ "klokken 15"
+             , "klokka 15"
              , "kl. 15"
              , "15h"
              ]
@@ -281,10 +306,15 @@
              [ "ca. kl. 15"
              , "cirka kl. 15"
              , "omkring klokken 15"
+             , "omkring klokka 15"
              ]
   , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
              [ "imorgen klokken 17 sharp"
+             , "imorra klokken 17 sharp"
+             , "imorgen klokka 17 presis"
+             , "imorra klokka 17 presis"
              , "imorgen kl. 17 presis"
+             , "imorra kl. 17 presis"
              ]
   , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
              [ "kvarter over 15"
@@ -294,6 +324,7 @@
   , examples (datetime (2013, 2, 12, 15, 20, 0) Minute)
              [ "kl. 20 over 15"
              , "klokken 20 over 15"
+             , "klokka 20 over 15"
              , "kl. 15:20"
              , "15:20"
              ]
@@ -310,6 +341,7 @@
              ]
   , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
              [ "klokken 9 på lørdag"
+             , "klokka 9 på lørdag"
              ]
   , examples (datetime (2014, 7, 18, 19, 0, 0) Minute)
              [ "Fre, Jul 18, 2014 19:00"
@@ -440,9 +472,11 @@
              ]
   , examples (datetimeInterval ((2013, 2, 13, 18, 0, 0), (2013, 2, 14, 0, 0, 0)) Hour)
              [ "i morgen kveld"
+             , "i morra kveld"
              ]
   , examples (datetimeInterval ((2013, 2, 13, 12, 0, 0), (2013, 2, 13, 14, 0, 0)) Hour)
              [ "i morgen middag"
+             , "i morra middag"
              ]
   , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
              [ "i går kveld"
@@ -455,6 +489,7 @@
              ]
   , examples (datetimeInterval ((2013, 2, 18, 4, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
              [ "mandag morgen"
+             , "mandag morran"
              ]
   , examples (datetimeInterval ((2013, 12, 24, 0, 0, 0), (2013, 12, 31, 0, 0, 0)) Day)
              [ "i romjulen"
@@ -559,40 +594,54 @@
   , examples (datetimeOpenInterval Before (2013, 2, 12, 14, 0, 0) Hour)
              [ "innen kl. 14"
              , "innen klokken 14"
+             , "innen klokka 14"
              ]
   , examples (datetime (2013, 2, 12, 13, 0, 0) Minute)
              [ "16h CET"
              , "kl. 16 CET"
              , "klokken 16 CET"
+             , "klokka 16 CET"
              ]
   , examples (datetime (2013, 2, 14, 6, 0, 0) Minute)
              [ "torsdag kl. 8:00 GMT"
              , "torsdag kl. 8:00 gmt"
              , "torsdag klokken 8:00 GMT"
+             , "torsdag klokka 8:00 GMT"
              , "torsdag klokken 8:00 gmt"
+             , "torsdag klokka 8:00 gmt"
              , "torsdag 08:00 GMT"
              , "torsdag 08:00 gmt"
              ]
   , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
              [ "idag kl. 14"
              , "idag klokken 14"
+             , "idag klokka 14"
              , "kl. 14"
              , "klokken 14"
+             , "klokka 14"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 kl. 16:00"
              , "25/4 klokken 16:00"
+             , "25/4 klokka 16:00"
              , "25-04 klokken 16:00"
+             , "25-04 klokka 16:00"
              , "25-4 kl. 16:00"
              ]
   , examples (datetime (2013, 2, 13, 15, 0, 0) Minute)
              [ "15:00 i morgen"
+             , "15:00 i morra"
              , "kl. 15:00 i morgen"
+             , "kl. 15:00 i morra"
              , "klokken 15:00 i morgen"
+             , "klokken 15:00 i morra"
+             , "klokka 15:00 i morgen"
+             , "klokka 15:00 i morra"
              ]
   , examples (datetimeOpenInterval After (2013, 2, 12, 14, 0, 0) Hour)
              [ "etter kl. 14"
              , "etter klokken 14"
+             , "etter klokka 14"
              ]
   , examples (datetimeOpenInterval After (2013, 2, 17, 4, 0, 0) Hour)
              [ "etter 5 dager"
@@ -604,17 +653,30 @@
              ]
   , examples (datetimeOpenInterval After (2013, 2, 13, 14, 0, 0) Hour)
              [ "etter i morgen kl. 14"
+             , "etter i morra kl. 14"
              , "etter i morgen klokken 14"
+             , "etter i morra klokken 14"
+             , "etter i morgen klokka 14"
+             , "etter i morra klokka 14"
              , "i morgen etter kl. 14"
+             , "i morra etter kl. 14"
              , "i morgen etter klokken 14"
+             , "i morra etter klokken 14"
+             , "i morgen etter klokka 14"
+             , "i morra etter klokka 14"
              ]
   , examples (datetimeOpenInterval Before (2013, 2, 12, 11, 0, 0) Hour)
              [ "før kl. 11"
              , "før klokken 11"
+             , "før klokka 11"
              ]
   , examples (datetimeOpenInterval Before (2013, 2, 13, 11, 0, 0) Hour)
              [ "i morgen før kl. 11"
+             , "i morra før kl. 11"
              , "i morgen før klokken 11"
+             , "i morra før klokken 11"
+             , "i morgen før klokka 11"
+             , "i morra før klokka 11"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
              [ "om ettermiddagen"
@@ -622,6 +684,7 @@
   , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
              [ "kl. 13:30"
              , "klokken 13:30"
+             , "klokka 13:30"
              ]
   , examples (datetime (2013, 2, 12, 4, 45, 0) Second)
              [ "om 15 minutter"
@@ -634,6 +697,7 @@
              ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
              [ "denne morgen"
+             , "denne morran"
              ]
   , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
              [ "neste mandag"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,17 +10,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.NB.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Data.Text as Text
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -32,7 +33,7 @@
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
   , pattern =
-    [ regex "i overimorgen"
+    [ regex "i overimorgen|i overimorra"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
@@ -48,8 +49,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -130,7 +130,7 @@
 ruleHalfTotillbeforeIntegerHourofday = Rule
   { name = "half to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "halv time *på"
+    [ regex "halv time *på|halvtime *på|halv"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -311,7 +311,7 @@
   , pattern =
     [ regex "akkurat nå|nå|(i )?dette øyeblikk"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleLastCycleOfTime :: Rule
@@ -451,7 +451,7 @@
   , pattern =
     [ regex "i dag|idag"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleThisnextDayofweek :: Rule
@@ -612,7 +612,7 @@
 ruleDdmm = Rule
   { name = "dd/mm"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[\\/-](0?[1-9]|1[0-2])"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[\\/-](0?[1-9]\\b|1[0-2])"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
@@ -782,7 +782,7 @@
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "presis( kl.| klokken)?"
+    [ regex "presis( kl.| klokken | klokka)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -861,8 +861,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -873,9 +872,8 @@
     [ regex "etter jobb"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLastNCycle :: Rule
@@ -924,9 +922,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) ->
-        let from = cycleNth TG.Second 0
-            to = inDuration dd
-        in Token Time <$> interval TTime.Open from to
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -968,7 +964,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "(omkring|cirka|ca\\.)( kl\\.| klokken)?"
+    [ regex "(omkring|cirka|ca\\.)( kl\\.| klokken | klokka)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -993,7 +989,7 @@
 ruleAtTimeofday = Rule
   { name = "at <time-of-day>"
   , pattern =
-    [ regex "klokken|kl.|@"
+    [ regex "klokken|klokka|kl.|@"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1104,7 +1100,7 @@
 ruleYyyymmdd = Rule
   { name = "yyyy-mm-dd"
   , pattern =
-    [ regex "(\\d{2,4})-(0?[1-9]|1[0-2])-(3[01]|[12]\\d|0?[1-9])"
+    [ regex "(\\d{4})[\\-\\.\\/](0?[1-9]|1[0-2])[\\-\\.\\/](3[01]|[12]\\d|0?[1-9])"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (yy:mm:dd:_)):_) -> do
@@ -1177,7 +1173,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "morgen(en)?"
+    [ regex "morgen(en)?|morran"
     ]
   , prod = \_ ->
       let from = hour False 4
@@ -1194,8 +1190,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time . partOfDay <$>
-        intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1245,9 +1240,8 @@
     [ regex "etter (frokost|middag|lunsj|lunch)"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleOnANamedday :: Rule
@@ -1388,6 +1382,57 @@
       _ -> Nothing
   }
 
+rule2400 :: Rule
+rule2400 = Rule
+  { name = "24:00"
+  , pattern =
+    [ regex "24[.:]00"
+    ]
+  , prod = \_ -> tt $ hourMinute False 24 00
+  }
+
+ruleDmm :: Rule
+ruleDmm = Rule
+  { name = "d/mm"
+  , pattern =
+    [ regex "([1-9])[\\/\\.\\-]([1-9]\\b|1[0-2]\\b)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
+        d <- parseInt dd
+        m <- parseInt mm
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleDDm :: Rule
+ruleDDm = Rule
+  { name = "dd/m"
+  , pattern =
+    [ regex "([0-2]\\d|3[01])[\\/\\.\\-]([1-9])"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
+        d <- parseInt dd
+        m <- parseInt mm
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleDdDotMm :: Rule
+ruleDdDotMm = Rule
+  { name = "dd.mm"
+  , pattern =
+    [ regex "(2[5-9]|3[01])\\.(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
+  }
+
 ruleTonight :: Rule
 ruleTonight = Rule
   { name = "tonight"
@@ -1395,9 +1440,8 @@
     [ regex "i kveld"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleYear :: Rule
@@ -1488,7 +1532,7 @@
 ruleDdmmyyyy = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[\\/-](0?[1-9]|1[0-2])[\\/-](\\d{2,4})"
+    [ 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
@@ -1596,7 +1640,7 @@
 ruleTomorrow = Rule
   { name = "tomorrow"
   , pattern =
-    [ regex "i morgen|imorgen"
+    [ regex "i morgen|imorgen|i morra|imorra"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -1798,6 +1842,10 @@
   , ruleYesterday
   , ruleYyyymmdd
   , ruleTimezone
+  , rule2400
+  , ruleDmm
+  , ruleDDm
+  , ruleDdDotMm
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
diff --git a/Duckling/Time/NL/BE/Corpus.hs b/Duckling/Time/NL/BE/Corpus.hs
--- a/Duckling/Time/NL/BE/Corpus.hs
+++ b/Duckling/Time/NL/BE/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
diff --git a/Duckling/Time/NL/BE/Rules.hs b/Duckling/Time/NL/BE/Rules.hs
--- a/Duckling/Time/NL/BE/Rules.hs
+++ b/Duckling/Time/NL/BE/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/NL/Corpus.hs b/Duckling/Time/NL/Corpus.hs
--- a/Duckling/Time/NL/Corpus.hs
+++ b/Duckling/Time/NL/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -11,6 +10,7 @@
 module Duckling.Time.NL.Corpus
   ( corpus
   , defaultCorpus
+  , latentCorpus
   , negativeCorpus
   ) where
 
@@ -41,6 +41,15 @@
                  ]
       ]
 
+latentCorpus :: Corpus
+latentCorpus = (context, testOptions {withLatent = True}, xs)
+  where
+    xs = concat
+      [ examples (datetimeOpenInterval Before (2013, 2, 12, 8, 0, 0) Hour)
+                 [ "voor 8"
+                 ]
+      ]
+
 negativeCorpus :: NegativeCorpus
 negativeCorpus = (context, testOptions, examples)
   where
@@ -453,9 +462,6 @@
   , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Vaderdag")
              [ "vaderdag"
              ]
-  , examples (datetimeHoliday (2017, 04, 27, 0, 0, 0) Day "Koningsdag")
-             [ "Koningsdag 2017"
-             ]
   , examples (datetimeHoliday (2013, 10, 31, 0, 0, 0) Day "Halloween")
              [ "Halloween"
              ]
@@ -675,4 +681,16 @@
              [ "17h10"
              , "17u10"
              ]
+  , examples (datetimeHoliday (2018, 4, 27, 0, 0, 0) Day "Koningsdag")
+           [ "Koningsdag 2018"
+           , "koningsdag 2018"
+           , "king's day 2018"
+           , "King's Day 2018"
+           ]
+  , examples (datetimeHoliday (2014, 4, 26, 0, 0, 0) Day "Koningsdag")
+           [ "Koningsdag 2014"
+           , "koningsdag 2014"
+           , "King's Day 2014"
+           , "king's day 2014"
+           ]
   ]
diff --git a/Duckling/Time/NL/NL/Rules.hs b/Duckling/Time/NL/NL/Rules.hs
--- a/Duckling/Time/NL/NL/Rules.hs
+++ b/Duckling/Time/NL/NL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/NL/Rules.hs b/Duckling/Time/NL/Rules.hs
--- a/Duckling/Time/NL/Rules.hs
+++ b/Duckling/Time/NL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -19,13 +18,14 @@
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
-import Duckling.Duration.Helpers (duration)
+import Duckling.Duration.Helpers (duration, isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Numeral.Types (NumeralData (..))
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.HolidayHelpers
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -84,7 +84,6 @@
   [ ( "Nieuwjaarsdag", "nieuwjaars?(dag)?", monthDay  1  1 )
   , ( "Valentijnsdag", "valentijns?(dag)?", monthDay  2 14 )
   , ( "Halloween", "hall?oween?", monthDay 10 31 )
-  , ( "Koningsdag", "konings?dag", monthDay  4 27 )
   , ( "Allerheiligen", "allerheiligen?|aller heiligen?", monthDay 11  1 )
   , ( "Kerstavond", "kerstavond", monthDay 12 24 )
   , ( "Tweede Kerstdag", "tweede kerstdag", monthDay 12 26 )
@@ -94,6 +93,12 @@
   , ( "Vaderdag", "vaderdag", nthDOWOfMonth 3 7 6 )
   ]
 
+ruleComputedHolidays' :: [Rule]
+ruleComputedHolidays' = mkRuleHolidays'
+  [
+    ( "Koningsdag", "king's day|koningsdag"
+    , computeKingsDay )
+  ]
 ruleRelativeMinutesToOrAfterIntegerPartOfDay :: Rule
 ruleRelativeMinutesToOrAfterIntegerPartOfDay = Rule
   { name = "relative minutes to|till|before|after <integer> (time-of-day)"
@@ -221,7 +226,7 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         td1 <- case Text.toLower match of
-          "van"    -> Just $ cycleNth TG.Day 0
+          "van"    -> Just today
           "morgen" -> Just $ cycleNth TG.Day 1
           _        -> Just $ cycleNth TG.Day $ - 1
         td2 <- interval TTime.Open (hour False 18) (hour False 0)
@@ -502,7 +507,7 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         td1 <- case Text.toLower match of
-          "vanmiddag"     -> Just $ cycleNth TG.Day 0
+          "vanmiddag"     -> Just today
           "morgenmiddag"  -> Just $ cycleNth TG.Day 1
           "morgenmiddags" -> Just $ cycleNth TG.Day 1
           _               -> Just . cycleNth TG.Day $ - 1
@@ -698,12 +703,11 @@
 ruleByTheEndOfTime = Rule
   { name = "by the end of <time>"
   , pattern =
-    [ regex "tot (het)? einde (van)?|voor"
+    [ regex "tot( het)? einde( van)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Closed td (cycleNth TG.Second 0)
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -714,9 +718,8 @@
     [ regex "na het werk"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLastNCycle :: Rule
@@ -755,7 +758,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) (inDuration dd)
+        interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -1022,7 +1025,7 @@
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
         td1 <- case Text.toLower match of
-          "vanmorgen"     -> Just $ cycleNth TG.Day 0
+          "vanmorgen"     -> Just today
           "morgenochtend" -> Just $ cycleNth TG.Day 1
           _               -> Just . cycleNth TG.Day $ - 1
         td2 <- interval TTime.Open (hour False 0) (hour False 12)
@@ -1038,8 +1041,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time . partOfDay <$>
-        intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1087,9 +1089,8 @@
     [ regex "na de lunch|na het middageten"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleOnANamedday :: Rule
@@ -1596,3 +1597,4 @@
   ++ ruleMonths
   ++ ruleSeasons
   ++ ruleHolidays
+  ++ ruleComputedHolidays'
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -54,10 +53,15 @@
              , "dzisiaj"
              , "obecnego dnia"
              , "tego dnia"
+             , "dzisiejsza"
+             , "dzisiejszą"
              ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
              [ "wczoraj"
              ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "przedwczoraj"
+             ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
              [ "jutro"
              ]
@@ -614,33 +618,91 @@
              [ "ta zima"
              , "tej zimy"
              ]
-  , examples (datetime (2013, 12, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 24, 0, 0, 0) Day "Christmas Eve")
              [ "Wigilia Bożego Narodzenia"
              , "Wigilia"
              ]
-  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
-             [ "święta Bożego Narodzenia"
-             , "boże narodzenie"
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Christmas")
+             [ "Święta Bożego Narodzenia"
+             , "Boże Narodzenie"
              ]
-  , examples (datetime (2013, 12, 31, 0, 0, 0) Day)
-             [ "sylwester"
+  , examples (datetimeHoliday (2013, 12, 31, 0, 0, 0) Day "New Year's Eve")
+             [ "Sylwester"
              ]
-  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
-             [ "walentynki"
+  , examples (datetimeHoliday (2013, 2, 14, 0, 0, 0) Day "Valentine's Day")
+             [ "Walentynki"
              ]
-  , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 5, 26, 0, 0, 0) Day "Mother's Day")
              [ "Dzień Mamy"
              ]
-  , examples (datetime (2013, 6, 16, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 6, 23, 0, 0, 0) Day "Father's Day")
              [ "Dzień Taty"
              ]
-  , examples (datetime (2013, 10, 31, 0, 0, 0) Day)
-             [ "halloween"
+  , examples (datetimeHoliday (2013, 10, 31, 0, 0, 0) Day "Halloween Day")
+             [ "Halloween"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
-             [ "dzień dziękczynienia"
-             , "dziękczynienie"
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
+             [ "Dzień Dziękczynienia"
+             , "Dziękczynienie"
              ]
+  , examples (datetimeHoliday (2013, 12, 26, 0, 0, 0) Day "St Stephen's Day")
+             [ "drugi dzień świąt Bożego Narodzenia"
+             ]
+  , examples (datetimeHoliday (2014, 1, 6, 0, 0, 0) Day "Three Kings' Day")
+             [ "Święto Trzech Króli"
+             , "Trzech Króli"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "Święto Pracy"
+             ]
+  , examples (datetimeHoliday (2013, 5, 3, 0, 0, 0) Day "Constitution Day")
+             [ "Święto Konstytucji Trzeciego Maja"
+             , "Święto Konstytucji 3 Maja"
+             , "Święto Konstytucji"
+             ]
+  , examples (datetimeHoliday (2013, 8, 15, 0, 0, 0) Day "Assumption Day")
+             [ "Święto Wojska Polskiego"
+             , "Wniebowzięcie Najświętszej Maryi Panny"
+             ]
+  , examples (datetimeHoliday (2013, 11, 1, 0, 0, 0) Day "All Saints' Day")
+             [ "Wszystkich Świętych"
+             , "Święto Wszystkich Świętych"
+             ]
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "New Year's Day")
+             [ "Nowy Rok"
+             ]
+  , examples (datetimeHoliday (2013, 3, 8, 0, 0, 0) Day "Women's Day")
+             [ "Dzień Kobiet"
+             ]
+  , examples (datetimeHoliday (2013, 2, 13, 0, 0, 0) Day "Ash Wednesday")
+             [ "Popielec"
+             ]
+  , examples (datetimeHoliday (2013, 5, 30, 0, 0, 0) Day "Corpus Christi")
+             [ "Boże Ciało"
+             ]
+  , examples (datetimeHoliday (2013, 4, 1, 0, 0, 0) Day "Easter Monday")
+             [ "Poniedziałek Wielkanocny"
+             ]
+  , examples (datetimeHoliday (2013, 3, 31, 0, 0, 0) Day "Easter Sunday")
+             [ "Niedziela Wielkanocna"
+             , "Wielkanoc"
+             ]
+  , examples (datetimeHoliday (2013, 3, 29, 0, 0, 0) Day "Good Friday")
+             [ "Wielki Piątek"
+             ]
+  , examples (datetimeHoliday (2013, 3, 30, 0, 0, 0) Day "Holy Saturday")
+             [ "Wielka Sobota"
+             ]
+  , examples (datetimeHoliday (2013, 3, 24, 0, 0, 0) Day "Palm Sunday")
+             [ "Niedziela Palmowa"
+             ]
+  , examples (datetimeHoliday (2013, 5, 19, 0, 0, 0) Day "Pentecost")
+             [ "Zesłanie Ducha Świętego"
+             , "Zielone Świątki"
+             ]
+  , examples (datetimeHoliday (2013, 12, 6, 0, 0, 0) Day "Saint Nicholas Day")
+             [ "Mikołajki"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
              [ "ten wieczór"
              , "dzisiejszy wieczór"
@@ -744,6 +806,9 @@
              ]
   , examples (datetimeInterval ((2013, 2, 12, 11, 30, 0), (2013, 2, 12, 13, 31, 0)) Minute)
              [ "11:30-1:30"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "dziś wieczorem"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 26, 0, 0, 0)) Second)
              [ "w ciągu 2 tygodni"
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,17 +10,20 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.PL.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
+import Duckling.Time.Computed
 import Duckling.Types
 import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
@@ -79,8 +81,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -196,21 +197,12 @@
       _ -> Nothing
   }
 
-ruleValentinesDay :: Rule
-ruleValentinesDay = Rule
-  { name = "valentine's day"
-  , pattern =
-    [ regex "walentynki"
-    ]
-  , prod = \_ -> tt $ monthDay 2 14
-  }
-
 ruleLastTime :: Rule
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
     [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?|(po ?)?przedni(ego|ch|emu|e|mi|m|a)?"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -265,7 +257,7 @@
   , pattern =
     [ regex "(w)? ?(tym|tej)? ?(teraz|momencie|chwili|momeńcie)"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleLastCycleOfTime :: Rule
@@ -333,18 +325,6 @@
       _ -> Nothing
   }
 
-ruleSeason4 :: Rule
-ruleSeason4 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "wiosna|wiosny|wiośnie|wiosnie|wiosnę|wiosne|wiosną|wiosna|wiośnie|wiosnie|wiosno"
-    ]
-  , 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)"
@@ -398,9 +378,9 @@
 ruleToday = Rule
   { name = "today"
   , pattern =
-    [ regex "dzisiejszy|dzisiaj|dziś|dzis|w ten dzień|w ten dzien|w obecny dzień|w obecny dzien|obecnego dnia"
+    [ regex "dzisiejsz[yaą]|dzisiaj|dzi[śs]|w ten dzień|w ten dzien|w obecny dzień|w obecny dzien|obecnego dnia"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleThisnextDayofweek :: Rule
@@ -471,15 +451,6 @@
       _ -> Nothing
   }
 
-rulePolishIndependenceDay :: Rule
-rulePolishIndependenceDay = Rule
-  { name = "Polish independence day"
-  , pattern =
-    [ regex "(s|ś)wiet(a|o) niepodleg(l|ł)o(s|ś)ci|(ś|s)w\\.? niepodleg(l|ł)o(s|ś)ci"
-    ]
-  , prod = \_ -> tt $ monthDay 11 11
-  }
-
 ruleOnDate :: Rule
 ruleOnDate = Rule
   { name = "on <date>"
@@ -532,19 +503,6 @@
            interval TTime.Open from to
   }
 
-ruleLastCycle :: Rule
-ruleLastCycle = Rule
-  { name = "last <cycle>"
-  , pattern =
-    [ 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
-      (_:Token TimeGrain grain:_) ->
-        tt . cycleNth grain $ - 1
-      _ -> Nothing
-  }
-
 ruleAfternoon :: Rule
 ruleAfternoon = Rule
   { name = "afternoon"
@@ -558,6 +516,32 @@
            interval TTime.Open from to
   }
 
+ruleEveningnight :: Rule
+ruleEveningnight = Rule
+  { name = "evening|night"
+  , pattern =
+    [ regex "wiecz[oó]r(em|owi|ze|a|u)?|nocą?"
+    ]
+  , prod = \_ ->
+      let from = hour False 18
+          to = hour False 0
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleLastCycle :: Rule
+ruleLastCycle = Rule
+  { name = "last <cycle>"
+  , pattern =
+    [ 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
+      (_:Token TimeGrain grain:_) ->
+        tt . cycleNth grain $ - 1
+      _ -> Nothing
+  }
+
 ruleHourofdayHourofdayInterval :: Rule
 ruleHourofdayHourofdayInterval = Rule
   { name = "<hour-of-day> - <hour-of-day> (interval)"
@@ -597,15 +581,6 @@
       _ -> Nothing
   }
 
-ruleChristmasEve :: Rule
-ruleChristmasEve = Rule
-  { name = "christmas eve"
-  , pattern =
-    [ regex "(wigilia|wigilii|wigili(e|ę)|wigili(a|ą)|wigilio) ?(bo(z|ż)ego narodzenia)?"
-    ]
-  , prod = \_ -> tt $ monthDay 12 24
-  }
-
 ruleInduringThePartofday :: Rule
 ruleInduringThePartofday = Rule
   { name = "in|during the <part-of-day>"
@@ -619,15 +594,6 @@
       _ -> Nothing
   }
 
-ruleThanksgivingDay :: Rule
-ruleThanksgivingDay = Rule
-  { name = "thanksgiving day"
-  , pattern =
-    [ regex "((s|ś)wiet(a|o)|(dzie(n|ń)))? ?dzi(e|ę)kczynieni(e|a)"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 4 4 11
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -736,30 +702,6 @@
       _ -> Nothing
   }
 
-ruleSeason3 :: Rule
-ruleSeason3 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "zima|zimy|zimie|zimę|zime|zimą|zima|zimie|zimo"
-    ]
-  , 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 "lato|lata|latu|latem|lecie"
-    ]
-  , prod = \_ ->
-      let from = monthDay 6 21
-          to = monthDay 9 23
-      in Token Time <$> interval TTime.Open from to
-  }
-
 ruleIntegerLatentTimeofday :: Rule
 ruleIntegerLatentTimeofday = Rule
   { name = "<integer> (latent time-of-day)"
@@ -788,15 +730,6 @@
       _ -> Nothing
   }
 
-ruleNewYearsEve :: Rule
-ruleNewYearsEve = Rule
-  { name = "new year's eve"
-  , pattern =
-    [ regex "sylwester|nowy rok"
-    ]
-  , prod = \_ -> tt $ monthDay 12 31
-  }
-
 ruleDurationAgo :: Rule
 ruleDurationAgo = Rule
   { name = "<duration> ago"
@@ -818,18 +751,17 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
-ruleDaybeforeyesterdaySingleword :: Rule
-ruleDaybeforeyesterdaySingleword = Rule
+ruleDayBeforeYesterdaySingleWord :: Rule
+ruleDayBeforeYesterdaySingleWord = Rule
   { name = "day-before-yesterday (single-word)"
   , pattern =
     [ regex "przedwczoraj"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 2
+  , prod = \_ -> tt $ cycleNth TG.Day (-2)
   }
 
 ruleLastNCycle :: Rule
@@ -868,9 +800,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) ->
-        let from = cycleNth TG.Second 0
-            to = inDuration dd
-        in Token Time <$> interval TTime.Open from to
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -981,7 +911,7 @@
   , pattern =
     [ regex "((wek|week|wik)(\\s|-)?end|wkend)"
     ]
-  , prod = \_ -> tt weekend
+  , prod = \_ -> tt $ mkOkForThisNext weekend
   }
 
 ruleEomendOfMonth :: Rule
@@ -998,7 +928,7 @@
   { name = "next <time>"
   , pattern =
     [ 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
+    , Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -1110,8 +1040,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1133,7 +1062,7 @@
   { name = "this <time>"
   , pattern =
     [ regex "te(mu|n|go|j)|ta|to|tym|nadchodz(a|ą)c(ym|y|ego|emu|(a|ą)|ej)"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -1227,18 +1156,6 @@
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
 
-ruleSeason2 :: Rule
-ruleSeason2 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "jesień|jesien|jesieni|jesienią|jesienia"
-    ]
-  , 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>"
@@ -1252,15 +1169,6 @@
       _ -> Nothing
   }
 
-ruleChristmas :: Rule
-ruleChristmas = Rule
-  { name = "christmas"
-  , pattern =
-    [ regex "((Ś|ś|s)wi(e|ę)ta)? ?bo(z|ż)(ym|ego|e) narodzeni(e|a|u)"
-    ]
-  , prod = \_ -> tt $ monthDay 12 25
-  }
-
 ruleDayofmonthOrdinal :: Rule
 ruleDayofmonthOrdinal = Rule
   { name = "<day-of-month> (ordinal)"
@@ -1345,15 +1253,6 @@
       _ -> Nothing
   }
 
-ruleHalloweenDay :: Rule
-ruleHalloweenDay = Rule
-  { name = "halloween day"
-  , pattern =
-    [ regex "hall?owe?en( day)?"
-    ]
-  , prod = \_ -> tt $ monthDay 10 31
-  }
-
 ruleNamedmonthDayofmonthNonOrdinal :: Rule
 ruleNamedmonthDayofmonthNonOrdinal = Rule
   { name = "<named-month> <day-of-month> (non ordinal)"
@@ -1407,15 +1306,6 @@
       _ -> Nothing
   }
 
-ruleFathersDay :: Rule
-ruleFathersDay = Rule
-  { name = "Father's Day"
-  , pattern =
-    [ regex "dzie(n|ń) ?(taty|ojca)"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 3 7 6
-  }
-
 ruleLastCycleTime :: Rule
 ruleLastCycleTime = Rule
   { name = "last <cycle> <time>"
@@ -1438,8 +1328,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Open (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1502,19 +1391,6 @@
       _ -> Nothing
   }
 
-ruleEveningnight :: Rule
-ruleEveningnight = Rule
-  { name = "evening|night"
-  , pattern =
-    [ regex "wiecz(o|ó)r(em|owi|ze|a|u)?|noc(ą)?"
-    ]
-  , prod = \_ ->
-      let from = hour False 18
-          to = hour False 0
-      in Token Time . mkLatent . partOfDay <$>
-           interval TTime.Open from to
-  }
-
 ruleOrdinalQuarter :: Rule
 ruleOrdinalQuarter = Rule
   { name = "<ordinal> quarter"
@@ -1577,15 +1453,6 @@
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
 
-ruleMothersDay :: Rule
-ruleMothersDay = Rule
-  { name = "Mother's Day"
-  , pattern =
-    [ regex "dzie(n|ń) ?ma(my|tki|m)"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 2 7 5
-  }
-
 ruleTimeofdayOclock :: Rule
 ruleTimeofdayOclock = Rule
   { name = "<time-of-day> o'clock"
@@ -1647,6 +1514,109 @@
       _ -> Nothing
   }
 
+
+ruleHolidays :: [Rule]
+ruleHolidays =
+  mkRuleHolidays
+    [ ( "New Year's Day", "nowy rok", monthDay 1 1)
+    , ( "Three Kings' Day", "((ś|s)wi(e|ę)to)? ?trzech kr(o|ó)li", monthDay 1 6)
+    , ( "Valentine's Day", "walentynki", monthDay 2 14)
+    , ( "Women's Day", "dzie(n|ń) kobiet", monthDay 3 8)
+    , ( "Labour Day", "(s|ś)wi(e|ę)to pracy", monthDay 5 1)
+    , ( "Constitution Day"
+      , "(ś|s)wi(e|ę)to konstytucj(i|a) ?((trzeciego|3) maja)?"
+      , monthDay 5 3
+      )
+    , ( "Mother's Day", "dzie(n|ń) ma(my|tki|m)", monthDay 5 26)
+    , ( "Father's Day", "dzie(n|ń) (taty|ojca)", monthDay 6 23)
+    , ( "Assumption Day"
+      , "(ś|s)wi(e|ę)to wojska polskiego|wniebowzi(e|ę)cie naj(s|ś)wi(e|ę)tszej maryi panny"
+      , monthDay 8 15
+      )
+    , ( "Halloween Day", "hall?owe?en( day)?", monthDay 10 31)
+    , ( "All Saints' Day"
+      , "((ś|s)wi(e|ę)to)? ?wszystkich (s|ś)wi(e|ę)tych"
+      , monthDay 11 1
+      )
+    , ( "Polish Independence Day"
+      , "(s|ś)wi(e|ę)t(a|o) niepodleg(l|ł)o(s|ś)ci|(ś|s)w\\.? niepodleg(l|ł)o(s|ś)ci"
+      , monthDay 11 11
+      )
+    , ( "Saint Nicholas Day", "mikołajki", monthDay 12 6)
+    , ( "Christmas Eve"
+      , "(wigilia|wigilii|wigili(e|ę)|wigili(a|ą)|wigilio) ?(bo(z|ż)ego narodzenia)?"
+      , monthDay 12 24
+      )
+    , ( "Christmas"
+      , "((Ś|ś|s)wi(e|ę)ta)? ?bo(z|ż)(ym|ego|e) narodzeni(e|a|u)"
+      , monthDay 12 25
+      )
+    , ( "St Stephen's Day"
+      , "drugi dzie(n|ń) (s|ś)wi(a|ą)t bo(z|ż)ego narodzenia"
+      , monthDay 12 26
+      )
+    , ( "New Year's Eve", "sylwester", monthDay 12 31)
+    , ( "Thanksgiving Day"
+      , "((s|ś)wiet(a|o)|(dzie(n|ń)))? ?dzi(e|ę)kczynieni(e|a)"
+      , nthDOWOfMonth 4 4 11
+      )
+    ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays =
+  mkRuleHolidays
+    [ ( "Ash Wednesday"
+      , "popielec"
+      , cycleNthAfter False TG.Day (-46) easterSunday
+      )
+    , ( "Palm Sunday"
+      , "niedziela palmowa"
+      , cycleNthAfter False TG.Day (-7) easterSunday
+      )
+    , ( "Good Friday"
+      , "wielki pi(a|ą)tek"
+      , cycleNthAfter False TG.Day (-2) easterSunday
+      )
+    , ( "Holy Saturday"
+      , "wielka sobota"
+      , cycleNthAfter False TG.Day (-1) easterSunday
+      )
+    , ( "Easter Sunday", "wielkanoc|niedziela wielkanocna", easterSunday)
+    , ( "Easter Monday"
+      , "poniedzia(l|ł)ek wielkanocny"
+      , cycleNthAfter False TG.Day 1 easterSunday
+      )
+    , ( "Pentecost"
+      , "zielone (s|ś)wi(a|ą)tki|zes(l|ł)anie ducha (ś|s)wi(e|ę)tego"
+      , cycleNthAfter False TG.Day 49 easterSunday
+      )
+    , ( "Corpus Christi"
+      , "bo(z|ż)e cia(l|ł)o"
+      , cycleNthAfter False TG.Day 60 easterSunday
+      )
+    ]
+
+ruleSeasons :: [Rule]
+ruleSeasons =
+  mkRuleSeasons
+    [ ("lato", "lato|lata|latu|latem|lecie", monthDay 6 21, monthDay 9 23)
+    , ( "jesień"
+      , "jesień|jesien|jesieni|jesienią|jesienia"
+      , monthDay 9 23
+      , monthDay 12 21
+      )
+    , ( "zima"
+      , "zima|zimy|zimie|zimę|zime|zimą|zima|zimie|zimo"
+      , monthDay 12 21
+      , monthDay 3 20
+      )
+    , ( "wiosna"
+      , "wiosna|wiosny|wiośnie|wiosnie|wiosnę|wiosne|wiosną|wiosna|wiośnie|wiosnie|wiosno"
+      , monthDay 3 20
+      , monthDay 6 21
+      )
+    ]
+
 rules :: [Rule]
 rules =
   [ ruleAboutTimeofday
@@ -1659,13 +1629,11 @@
   , ruleBetweenTimeofdayAndTimeofdayInterval
   , ruleByTheEndOfTime
   , ruleByTime
-  , ruleChristmas
-  , ruleChristmasEve
   , ruleCycleAfterTime
   , ruleCycleBeforeTime
   , ruleDatetimeDatetimeInterval
   , ruleDayaftertomorrowSingleword
-  , ruleDaybeforeyesterdaySingleword
+  , ruleDayBeforeYesterdaySingleWord
   , ruleDayofmonthNonOrdinalNamedmonth
   , ruleDayofmonthNonOrdinalOfNamedmonth
   , ruleDayofmonthOrdinal
@@ -1681,11 +1649,9 @@
   , ruleEoyendOfYear
   , ruleEveningnight
   , ruleExactlyTimeofday
-  , ruleFathersDay
   , ruleFromDatetimeDatetimeInterval
   , ruleFromHourofdayHourofdayInterval
   , ruleFromTimeofdayTimeofdayInterval
-  , ruleHalloweenDay
   , ruleHhmm
   , ruleHhmmMilitary
   , ruleHhmmMilitaryAmpm
@@ -1712,10 +1678,8 @@
   , ruleMmddyyyy
   , ruleMonthDdddInterval
   , ruleMorning
-  , ruleMothersDay
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
-  , ruleNewYearsEve
   , ruleNextCycle
   , ruleNextNCycle
   , ruleNextTime
@@ -1732,18 +1696,12 @@
   , ruleOrdinalCycleTime
   , ruleOrdinalQuarter
   , ruleOrdinalQuarterYear
-  , rulePolishIndependenceDay
   , ruleRelativeMinutesAfterpastIntegerHourofday
   , ruleQuarterAfterpastIntegerHourofday
   , ruleHalfAfterpastIntegerHourofday
   , ruleRelativeMinutesTotillbeforeIntegerHourofday
   , ruleQuarterTotillbeforeIntegerHourofday
   , ruleHalfTotillbeforeIntegerHourofday
-  , ruleSeason
-  , ruleSeason2
-  , ruleSeason3
-  , ruleSeason4
-  , ruleThanksgivingDay
   , ruleTheCycleOfTime
   , ruleTheIdesOfNamedmonth
   , ruleTheOrdinalCycleAfterTime
@@ -1763,7 +1721,6 @@
   , ruleToday
   , ruleTomorrow
   , ruleUntilTimeofday
-  , ruleValentinesDay
   , ruleWeekend
   , ruleWithinDuration
   , ruleYear
@@ -1775,3 +1732,6 @@
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ ruleHolidays
+  ++ ruleSeasons
+  ++ ruleComputedHolidays
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -203,6 +202,11 @@
              ]
   , examples (datetime (2013, 2, 4, 0, 0, 0) Week)
              [ "semana passada"
+             , "semana anterior"
+             , "passada semana"
+             , "anterior semana"
+             , "última semana"
+             , "ultima semana"
              ]
   , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
              [ "semana que vem"
@@ -427,6 +431,10 @@
              ]
   , examples (datetimeInterval ((2012, 12, 0, 0, 0, 0), (2013, 2, 0, 0, 0, 0)) Month)
              [ "passados 2 meses"
+             , "últimos 2 meses"
+             , "2 meses anteriores"
+             , "2 últimos meses"
+             , "2 anteriores meses"
              ]
   , examples (datetimeInterval ((2013, 3, 0, 0, 0, 0), (2013, 6, 0, 0, 0, 0)) Month)
              [ "3 próximos meses"
@@ -435,6 +443,10 @@
              ]
   , examples (datetimeInterval ((2011, 0, 0, 0, 0, 0), (2013, 0, 0, 0, 0, 0)) Year)
              [ "passados 2 anos"
+              , "últimos 2 anos"
+              , "2 anos anteriores"
+              , "2 últimos anos"
+              , "2 anteriores anos"
              ]
   , examples (datetimeInterval ((2014, 0, 0, 0, 0, 0), (2017, 0, 0, 0, 0, 0)) Year)
              [ "3 próximos anos"
@@ -445,7 +457,7 @@
              [ "13 a 15 de julho"
              , "13 - 15 de julho de 2013"
              ]
-  , examples (datetimeInterval ((2013, 2, 12, 9, 30, 0), (2013, 2, 12, 11, 0, 0)) Minute)
+  , examples (datetimeInterval ((2013, 2, 12, 9, 30, 0), (2013, 2, 12, 11, 1, 0)) Minute)
              [ "9:30 - 11:00"
              ]
   , examples (datetimeInterval ((2013, 12, 21, 0, 0, 0), (2014, 1, 7, 0, 0, 0)) Day)
@@ -476,4 +488,111 @@
              [ "antes da meia noite"
              , "até a meia noite"
              ]
+ ,examples (datetime (2013, 2, 12, 3, 0, 0) Hour)
+             [ "última hora"
+             , "hora anterior"
+             , "hora passada"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
+             [ "este trimestre"
+             , "trimestre actual"
+             , "trimestre atual"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
+             [ "primeiro mês de 2013"
+             , "primeiro mês 2013"
+             ]
+  , examples (datetime (2013, 4, 1, 0, 0, 0) Quarter)
+             [ "próximo trimestre"
+             , "segundo trimestre de 2013"
+             , "segundo trimestre"
+             ]
+  , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
+             [ "terceiro trimestre"
+             ]
+  , examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
+             [ "quarto trimestre de 2018"
+             , "quarto trimestre 2018"
+             ]
+  , examples (datetime (2012, 10, 1, 0, 0, 0) Quarter)
+             [ "trimestre passado"
+             , "trimestre anterior"
+             , "último trimestre"
+             , "ultimo trimestre"
+             ]
+  , examples (datetime (2013, 12, 1, 0, 0, 0) Month)
+             [ "décimo segundo mês de 2013"
+             , "último mês de 2013"
+             , "último mês 2013"
+             ]
+  , examples (datetime (2015, 10, 1, 0, 0, 0) Quarter)
+             [ "último trimestre de 2015"
+             , "último trimestre 2015"
+             ]
+  , examples (datetimeInterval ((2013, 7, 13, 0, 0, 0), (2013, 7, 16, 0, 0, 0)) Day)
+             [ "desde 13 a 15 de Julho"
+             , "a partir de 13 até 15 de Julho"
+             , "desde 13 até 15 de Julho"
+             , "13-15 de Julho"
+             , "13 até 15 de Julho"
+             , "13 a 15 de Julho"
+             , "desde 13 a 15 Julho"
+             , "a partir de 13 até 15 Julho"
+             , "desde 13 até 15 Julho"
+             , "13-15 Julho"
+             , "13 até 15 Julho"
+             , "13 a 15 Julho"
+             ]
+  , examples (datetimeInterval ((2017, 1, 1, 0, 0, 0), (2017, 10, 1, 0, 0, 0)) Quarter)
+             [ "de primeiro trimestre de 2017 até terceiro trimestre de 2017"
+             , "de primeiro trimestre de 2017 até ao terceiro trimestre de 2017"
+             , "do primeiro trimestre de 2017 até terceiro trimestre de 2017"
+             , "do primeiro trimestre de 2017 até ao terceiro trimestre de 2017"
+             , "desde primeiro trimestre de 2017 até terceiro trimestre de 2017"
+             , "desde primeiro trimestre de 2017 até ao terceiro trimestre de 2017"
+             , "a partir do primeiro trimestre de 2017 até terceiro trimestre de 2017"
+             , "a partir do primeiro trimestre de 2017 até ao terceiro trimestre de 2017"
+             , "a partir de primeiro trimestre de 2017 até terceiro trimestre de 2017"
+             , "a partir de primeiro trimestre de 2017 até ao terceiro trimestre de 2017"
+             , "primeiro trimestre de 2017 a terceiro trimestre de 2017"
+             , "primeiro trimestre de 2017 ao terceiro trimestre de 2017"
+             , "primeiro trimestre de 2017 - terceiro trimestre de 2017"
+             , "entre primeiro trimestre de 2017 e terceiro trimestre de 2017"
+             , "entre o primeiro trimestre de 2017 e terceiro trimestre de 2017"
+             , "primeiro trimestre de 2017 até terceiro trimestre de 2017"
+             , "primeiro trimestre de 2017 até ao terceiro trimestre de 2017"
+             , "primeiro trimestre 2017 a terceiro trimestre 2017"
+             , "primeiro trimestre 2017 ao terceiro trimestre 2017"
+             , "primeiro trimestre 2017 - terceiro trimestre 2017"
+             , "primeiro trimestre 2017 até terceiro trimestre 2017"
+             , "primeiro trimestre 2017 até ao terceiro trimestre 2017"
+             , "entre primeiro trimestre 2017 e terceiro trimestre 2017"
+             , "entre o primeiro trimestre 2017 e terceiro trimestre 2017"
+             ]
+  , examples (datetimeInterval ((2017, 3, 1, 0, 0, 0), (2017, 10, 1, 0, 0, 0)) Month)
+              [ "de terceiro mês de 2017 até nono mês de 2017"
+              , "de terceiro mês de 2017 até ao nono mês de 2017"
+              , "do terceiro mês de 2017 até nono mês de 2017"
+              , "do terceiro mês de 2017 até ao nono mês de 2017"
+              , "desde terceiro mês de 2017 até nono mês de 2017"
+              , "desde terceiro mês de 2017 até ao nono mês de 2017"
+              , "a partir do terceiro mês de 2017 até nono mês de 2017"
+              , "a partir do terceiro mês de 2017 até ao nono mês de 2017"
+              , "a partir de terceiro mês de 2017 até nono mês de 2017"
+              , "a partir de terceiro mês de 2017 até ao nono mês de 2017"
+              , "terceiro mês de 2017 a nono mês de 2017"
+              , "terceiro mês de 2017 ao nono mês de 2017"
+              , "terceiro mês de 2017 - nono mês de 2017"
+              , "entre terceiro mês de 2017 e nono mês de 2017"
+              , "entre o terceiro mês de 2017 e nono mês de 2017"
+              , "terceiro mês de 2017 até nono mês de 2017"
+              , "terceiro mês de 2017 até ao nono mês de 2017"
+              , "terceiro mês 2017 a nono mês 2017"
+              , "terceiro mês 2017 ao nono mês 2017"
+              , "terceiro mês 2017 - nono mês 2017"
+              , "terceiro mês 2017 até nono mês 2017"
+              , "terceiro mês 2017 até ao nono mês 2017"
+              , "entre terceiro mês 2017 e nono mês 2017"
+              , "entre o terceiro mês 2017 e nono mês 2017"
+              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,18 +10,22 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.PT.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Text (Text)
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+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
 
@@ -86,14 +89,14 @@
 rulePassadosNCycle = Rule
   { name = "passados n <cycle>"
   , pattern =
-    [ regex "passad(a|o)s?"
+    [ regex "(passad|[úu]ltim)[ao]s?"
     , Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
       (_:token:Token TimeGrain grain:_) -> do
         v <- getIntValue token
-        tt $ cycleN True grain (- v)
+        tt $ cycleN True grain (-v)
       _ -> Nothing
   }
 
@@ -101,7 +104,7 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "(ú|u)ltim[ao]s?"
+    [ regex "[úu]ltim[ao]s?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -114,15 +117,30 @@
   { name = "<datetime> - <datetime> (interval)"
   , pattern =
     [ Predicate isNotLatent
-    , regex "\\-|a"
+    , regex "\\-|até( ao?)?|ao?"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
       (Token Time td1:_:Token Time td2:_) ->
-        Token Time <$> interval TTime.Open td1 td2
+        Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
   }
 
+ruleDeDatetimeDatetimeInterval :: Rule
+ruleDeDatetimeDatetimeInterval = Rule
+  { name = "de <datetime> - <datetime> (interval)"
+  , pattern =
+    [ regex "de?"
+    , Predicate isATimeOfDay
+    , regex "\\-|até( ao?)?|ao?"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
@@ -151,7 +169,7 @@
   , pattern =
     [ regex "(hoje)|(neste|nesse) momento"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleDimTimeDaMadrugada :: Rule
@@ -218,23 +236,33 @@
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
-      (_:Token TimeGrain grain:_) ->
-        tt $ cycleNth grain 0
+      (_:Token TimeGrain grain:_) -> tt $ cycleNth grain 0
       _ -> Nothing
   }
 
+ruleCycleActual :: Rule
+ruleCycleActual = Rule
+  { name = "<cycle> actual"
+  , pattern =
+    [ dimension TimeGrain
+    , regex "ac?tual"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token TimeGrain grain:_) -> tt $ cycleNth grain 0
+      _ -> Nothing
+  }
+
 ruleSHourminTimeofday :: Rule
 ruleSHourminTimeofday = Rule
   { name = "às <hour-min> <time-of-day>"
   , pattern =
-    [ regex "(à|a)s"
+    [ regex "[àa]s"
     , Predicate isNotLatent
     , regex "da"
     , Predicate isATimeOfDay
     ]
   , 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
   }
 
@@ -366,8 +394,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -417,8 +444,7 @@
   , prod = \tokens -> case tokens of
       (token:_:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -560,8 +586,7 @@
     , regex "(d?es[ts]a semana)|agora"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -751,7 +776,7 @@
   , pattern =
     [ regex "agora|j(á|a)|(nesse|neste) instante"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleFazemDuration :: Rule
@@ -835,21 +860,6 @@
       _ -> Nothing
   }
 
-ruleDeDatetimeDatetimeInterval :: Rule
-ruleDeDatetimeDatetimeInterval = Rule
-  { name = "de <datetime> - <datetime> (interval)"
-  , pattern =
-    [ regex "de?"
-    , dimension Time
-    , regex "\\-|a"
-    , dimension Time
-    ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td1:_:Token Time td2:_) ->
-        Token Time <$> interval TTime.Open td1 td2
-      _ -> Nothing
-  }
-
 ruleDentroDeDuration :: Rule
 ruleDentroDeDuration = Rule
   { name = "dentro de <duration>"
@@ -859,9 +869,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) ->
-        let from = cycleNth TG.Second 0
-            to = inDuration dd
-        in Token Time <$> interval TTime.Open from to
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -981,7 +989,7 @@
   { name = "n passados <cycle>"
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
-    , regex "passad(a|o)s?"
+    , regex "(passad|[úu]ltim)[ao]s?|anterior(es)?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -991,6 +999,21 @@
       _ -> Nothing
   }
 
+ruleNCyclePassados :: Rule
+ruleNCyclePassados = Rule
+  { name = "n <cycle> passados"
+  , pattern =
+    [ Predicate $ isIntegerBetween 2 9999
+    , dimension TimeGrain
+    , regex "(passad|[úu]ltim)[ao]s?|anterior(es)?"
+    ]
+  , prod = \tokens -> case tokens of
+      (token: Token TimeGrain grain:_) -> do
+        v <- getIntValue token
+        tt $ cycleN True grain (- v)
+      _ -> Nothing
+  }
+
 ruleDiaDayofmonthNonOrdinal :: Rule
 ruleDiaDayofmonthNonOrdinal = Rule
   { name = "dia <day-of-month> (non ordinal)"
@@ -1082,8 +1105,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1197,14 +1219,14 @@
 ruleEntreDatetimeEDatetimeInterval = Rule
   { name = "entre <datetime> e <datetime> (interval)"
   , pattern =
-    [ regex "entre"
+    [ regex "entre( [ao])?|desde|(a partir )?d[eo]"
     , dimension Time
-    , regex "e"
+    , regex "e|\\-|até( ao?)?|ao?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td1:_:Token Time td2:_) ->
-        Token Time <$> interval TTime.Open td1 td2
+        Token Time <$> interval TTime.Closed td1 td2
       _ -> Nothing
   }
 
@@ -1240,19 +1262,30 @@
   { name = "<cycle> passado"
   , pattern =
     [ dimension TimeGrain
-    , regex "passad(a|o)s?"
+    , regex "passad[ao]s?|anterior(es)?"
     ]
   , prod = \tokens -> case tokens of
-      (Token TimeGrain grain:_) ->
-        tt . cycleNth grain $ - 1
+      (Token TimeGrain grain:_) -> tt . cycleNth grain $ - 1
       _ -> Nothing
   }
 
+rulePassadoCycle :: Rule
+rulePassadoCycle = Rule
+  { name = "passado <cycle>"
+  , pattern =
+    [ regex "(passad|[úu]ltim)[ao]s?|anterior(es)?"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) -> tt . cycleNth grain $ - 1
+      _ -> Nothing
+  }
+
 ruleNossaSenhoraAparecida :: Rule
 ruleNossaSenhoraAparecida = Rule
   { name = "Nossa Senhora Aparecida"
   , pattern =
-    [ regex "nossa senhora (aparecida)?"
+    [ regex "nossa senhora( aparecida)?"
     ]
   , prod = \_ -> tt $ monthDay 10 12
   }
@@ -1354,6 +1387,283 @@
       _ -> Nothing
   }
 
+ruleCycleOrdinalOfTime :: Rule
+ruleCycleOrdinalOfTime = Rule
+    { name = "<ordinal> <cycle> de <time>"
+    , pattern =
+      [ dimension Ordinal
+      , dimension TimeGrain
+      , regex "d[eo]|em"
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (token:Token TimeGrain grain:_:Token Time td:_) -> do
+          n <- getIntValue token
+          tt $ cycleNthAfter True grain (n - 1) td
+        _ -> Nothing
+    }
+
+ruleCycleOrdinalTime :: Rule
+ruleCycleOrdinalTime = Rule
+    { name = "<ordinal> <cycle> <time>"
+    , pattern =
+      [ dimension Ordinal
+      , dimension TimeGrain
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (token:Token TimeGrain grain: Token Time td:_) -> do
+          n <- getIntValue token
+          tt $ cycleNthAfter True grain (n - 1) td
+        _ -> Nothing
+    }
+
+ruleCycleTheOrdinalOfTime :: Rule
+ruleCycleTheOrdinalOfTime = Rule
+    { name = "o <ordinal> <cycle> de <time>"
+    , pattern =
+      [ regex "o|a"
+      , dimension Ordinal
+      , dimension TimeGrain
+      , regex "d[eo]|em"
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (_:token:Token TimeGrain grain:_:Token Time td:_) -> do
+          n <- getIntValue token
+          tt $ cycleNthAfter True grain (n - 1) td
+        _ -> Nothing
+    }
+
+ruleOrdinalTrimestre :: Rule
+ruleOrdinalTrimestre = Rule
+  { name = "<ordinal> trimestre"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        n <- getIntValue token
+        tt . cycleNthAfter True TG.Quarter (n - 1) $
+          cycleNth TG.Year 0
+      _ -> Nothing
+  }
+
+ruleTheOrdinalTrimestre :: Rule
+ruleTheOrdinalTrimestre = Rule
+  { name = "o <ordinal> trimestre"
+  , pattern =
+    [ regex "o|a"
+    , dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> do
+        n <- getIntValue token
+        tt . cycleNthAfter True TG.Quarter (n - 1) $
+          cycleNth TG.Year 0
+      _ -> Nothing
+  }
+
+ruleOrdinalTrimestreYear :: Rule
+ruleOrdinalTrimestreYear = Rule
+  { name = "<ordinal> trimestre <year>"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_:Token Time td:_) -> do
+        n <- getIntValue token
+        tt $ cycleNthAfter False TG.Quarter (n - 1) td
+      _ -> Nothing
+  }
+
+ruleLastCycleOfTime :: Rule
+ruleLastCycleOfTime = Rule
+    { name = "último <cycle> de <time>"
+    , pattern =
+      [ regex "[úu]ltim[ao]s?"
+      , dimension TimeGrain
+      , regex "d[eo]|em"
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (_:Token TimeGrain grain:_:Token Time td:_) ->
+          tt $ cycleLastOf grain td
+        _ -> Nothing
+    }
+
+ruleLastCycleTime :: Rule
+ruleLastCycleTime = Rule
+    { name = "último <cycle> <time>"
+    , pattern =
+      [ regex "[úu]ltim[ao]s?"
+      , dimension TimeGrain
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (_:Token TimeGrain grain: Token Time td:_) ->
+          tt $ cycleLastOf grain td
+        _ -> Nothing
+    }
+
+ruleIntervalFromMonthDDDDOf :: Rule
+ruleIntervalFromMonthDDDDOf = Rule
+  { name = "desde <month> dd-dd de (interval)"
+  , pattern =
+    [ regex "desde|a partir d[eo]"
+    , Predicate isDOMValue
+    , regex "até( ao?)?|ao?"
+    , Predicate isDOMValue
+    , regex "d[eo]|em"
+    , 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
+  }
+
+ruleIntervalDDDDMonthOf :: Rule
+ruleIntervalDDDDMonthOf = Rule
+    { name = "dd-dd <month> de (interval)"
+    , pattern =
+      [ Predicate isDOMValue
+      , regex "\\-|a(té)?"
+      , Predicate isDOMValue
+      , regex "d[eo]|em"
+      , 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 = "desde <month> dd-dd (interval)"
+  , pattern =
+    [ regex "desde|a partir d[eo]"
+    , Predicate isDOMValue
+    , regex "até( ao?)?|ao?"
+    , 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
+  }
+
+ruleIntervalDDDDMonth :: Rule
+ruleIntervalDDDDMonth = Rule
+    { name = "dd-dd <month> (interval)"
+    , pattern =
+      [ Predicate isDOMValue
+      , regex "\\-|a(té)?"
+      , 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
+    }
+
+ruleOrdinalCycleOfYearOrdinalCycleOfYear :: Rule
+ruleOrdinalCycleOfYearOrdinalCycleOfYear = Rule
+    { name = "<ordinal> <cycle> de <year> - <ordinal> <cycle> de <year>"
+    , pattern =
+      [ dimension Ordinal
+      , dimension TimeGrain
+      , regex "d[eo]|em"
+      , dimension Time
+      , regex "\\-|até( ao?)?|ao?"
+      , dimension Ordinal
+      , dimension TimeGrain
+      , regex "d[eo]|em"
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (token1:
+         Token TimeGrain grain1:
+         _:
+         Token Time td1:
+         _:
+         token2:
+         Token TimeGrain grain2:
+         _:
+         Token Time td2:
+         _) -> do
+          n1 <- getIntValue token1
+          n2 <- getIntValue token2
+          let from = cycleNthAfter False grain1 (n1 - 1) td1
+              to = cycleNthAfter False grain2 (n2 - 1) td2
+          Token Time <$> interval TTime.Closed from to
+        _ -> Nothing
+    }
+
+ruleOrdinalCycleYearOrdinalCycleYear :: Rule
+ruleOrdinalCycleYearOrdinalCycleYear = Rule
+    { name = "<ordinal> <cycle> <year> - <ordinal> <cycle> <year>"
+    , pattern =
+      [ dimension Ordinal
+      , dimension TimeGrain
+      , dimension Time
+      , regex "\\-|até( ao?)?|ao?"
+      , dimension Ordinal
+      , dimension TimeGrain
+      , dimension Time
+      ]
+    , prod = \tokens -> case tokens of
+        (token1:
+         Token TimeGrain grain1:
+         Token Time td1:
+         _:
+         token2:
+         Token TimeGrain grain2:
+         Token Time td2:
+         _) -> do
+          n1 <- getIntValue token1
+          n2 <- getIntValue token2
+          let from = cycleNthAfter False grain1 (n1 - 1) td1
+              to = cycleNthAfter  False grain2 (n2 - 1) td2
+          Token Time <$> interval TTime.Closed from to
+        _ -> Nothing
+    }
+
 daysOfWeek :: [(Text, String)]
 daysOfWeek =
   [ ( "Segunda-feira", "segunda((\\s|\\-)feira)?|seg\\.?" )
@@ -1414,6 +1724,7 @@
   , ruleEntreDatetimeEDatetimeInterval
   , ruleEntreDdEtDdMonthinterval
   , ruleEsteCycle
+  , ruleCycleActual
   , ruleEvening
   , ruleFazemDuration
   , ruleFinados
@@ -1457,8 +1768,10 @@
   , ruleNow
   , ruleCycleAntesDeTime
   , ruleCyclePassado
+  , rulePassadoCycle
   , rulePartofdayDessaSemana
   , rulePassadosNCycle
+  , ruleNCyclePassados
   , ruleProclamaoDaRepblica
   , ruleProximasNCycle
   , ruleRightNow
@@ -1491,6 +1804,20 @@
   , ruleYesterday
   , ruleYyyymmdd
   , ruleTimezone
+  , ruleCycleOrdinalOfTime
+  , ruleCycleOrdinalTime
+  , ruleCycleTheOrdinalOfTime
+  , ruleOrdinalTrimestre
+  , ruleTheOrdinalTrimestre
+  , ruleOrdinalTrimestreYear
+  , ruleLastCycleOfTime
+  , ruleLastCycleTime
+  , ruleIntervalFromMonthDDDDOf
+  , ruleIntervalDDDDMonthOf
+  , ruleIntervalFromMonthDDDD
+  , ruleIntervalDDDDMonth
+  , ruleOrdinalCycleOfYearOrdinalCycleOfYear
+  , ruleOrdinalCycleYearOrdinalCycleYear
   ]
   ++ ruleMonths
   ++ ruleDaysOfWeek
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -95,5 +94,9 @@
   , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
              [ "ziua de craciun"
              , "crăciun"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "poimaine"
+             , "poimâine"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -13,26 +12,35 @@
 module Duckling.Time.RO.Rules
   ( rules ) where
 
-import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Data.Text as Text
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
 
+ruleTheDayAfterTomorrow :: Rule
+ruleTheDayAfterTomorrow = Rule
+  { name = "the day after tomorrow"
+  , pattern =
+    [ regex "poim(a|â)ine"
+    ]
+  , prod = \_ -> tt $ cycleNth TG.Day 2
+  }
+
 ruleAcum :: Rule
 ruleAcum = Rule
   { name = "acum"
   , pattern =
     [ regex "(chiar)? ?acum|imediat"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleDupamiaza :: Rule
@@ -204,7 +212,7 @@
   , pattern =
     [ regex "a(st(a|ă))?zi"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleNoon :: Rule
@@ -408,9 +416,8 @@
     [ regex "disear(a|ă)|((i|î)n aceas(a|ă) )?sear(a|ă)"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleIntersectBy :: Rule
@@ -563,8 +570,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -741,7 +747,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+        Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1131,8 +1137,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) -> Token Time <$>
-        interval TTime.Open (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Open now td
       _ -> Nothing
   }
 
@@ -1335,6 +1340,7 @@
   , ruleYearLatent
   , ruleYearLatent2
   , ruleYyyymmdd
+  , ruleTheDayAfterTomorrow
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
diff --git a/Duckling/Time/RU/Corpus.hs b/Duckling/Time/RU/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/RU/Corpus.hs
@@ -0,0 +1,417 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.RU.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Data.String
+import Prelude
+
+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)
+
+context :: Context
+context = testContext {locale = makeLocale RU Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (context, testOptions, examples)
+  where
+    examples =
+      [ "1 отель"
+      , "1 предложение"
+      , "следующие 5"
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "сегодня"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "вчера"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "завтра"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "понедельник"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "понедельник, 18 февраля"
+             , "18 февраля"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "вторник"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "четверг"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "пятница"
+             ]
+  , examples (datetime (2013, 2, 16, 0, 0, 0) Day)
+             [ "суббота"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "1 марта"
+             , "первое марта"
+             , "1 мар."
+             ]
+  , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
+             [ "3 марта 2015"
+             , "3 мар. 2015"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "15 февраля"
+             , "15.2"
+             , "15 Фев"
+             ]
+  , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
+             [ "8 августа"
+             , "8 Авг"
+             ]
+  , examples (datetime (2014, 10, 0, 0, 0, 0) Month)
+             [ "Октябрь 2014"
+             ]
+  , examples (datetime (2014, 11, 0, 0, 0, 0) Month)
+             [ "Ноябрь 2014"
+             ]
+  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+             [ "31.10.1974"
+             , "31.10.74"
+             ]
+  , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
+             [ "14 апреля 2015"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "Воскресенье, 10 фев."
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "Среда, 13 февраля"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "Понедельник, 18 фев"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day)
+             [ "эта неделя"
+             ]
+  , examples (datetime (2013, 1, 0, 0, 0, 0) Month)
+             [ "прошлый месяц"
+             ]
+  , examples (datetime (2013, 3, 0, 0, 0, 0) Month)
+             [ "следующий месяц"
+             ]
+  , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
+             [ "следующий год"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "в прошлый вторник"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "следующий вторник"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 0, 0) Hour)
+             [ "в 4 утра"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "в 3"
+             , "3 часа"
+             , "в три"
+             ]
+  , examples (datetime (2013, 2, 12, 3, 18, 0) Minute)
+             [ "3:18 утра"
+             ]
+  , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
+             [ "3:18"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "в 3 часа дня"
+             , "в 15"
+             , "в 15 часов"
+             , "15 часов"
+             , "в 15ч"
+             ]
+  , examples (datetime (2013, 4, 1, 18, 0, 0) Hour)
+             [ "01.04. в 18 часов"
+             ]
+  , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
+             [ "в 17 часов завтра"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
+             ["15:15"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
+             [ "8 часов вечера"
+             , "сегодня в 8 вечера"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 0, 0) Minute)
+             [ "сегодня в 20:00"
+             ]
+  , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
+             [ "в субботу в 9 часов"
+             ]
+  , examples (datetime (2014, 7, 18, 19, 0, 0) Hour)
+             [ "пятница, 18 июля 2014 7 часов вечера"
+             ]
+  , examples (datetime (2014, 7, 18, 0, 0, 0) Day)
+             [ "Пт, 18 июля 2014"
+             , "Пятница, 18.07.14"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 30, 1) Second)
+             [ "через 1 секунду"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 31, 0) Second)
+             [ "через 1 минуту"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 32, 0) Second)
+             [ "через 2 минуты"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Second)
+             [ "через 60 минут"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 0, 0) Second)
+             [ "через 30 минут"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
+             [ "через 1 час"
+             ]
+  , examples (datetime (2013, 2, 12, 6, 30, 0) Minute)
+             [ "через два часа"
+             ]
+  , examples (datetime (2013, 2, 13, 4, 30, 0) Minute)
+             [ "через 24 часа"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "завтра"
+             ]
+  , examples (datetime (2016, 2, 0, 0, 0, 0) Month)
+             [ "через 3 года"
+             ]
+  , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
+             [ "через 7 дней"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "через 1 неделю"
+             ]
+  , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
+             [ "7 дней назад"
+             ]
+  , examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
+             [ "14 дней назад"
+             ]
+  , examples (datetime (2013, 1, 29, 0, 0, 0) Day)
+             [ "две недели назад"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "1 неделю назад"
+             ]
+  , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
+             [ "три недели назад"
+             ]
+  , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
+             [ "три месяца назад"
+             ]
+  , examples (datetime (2011, 2, 0, 0, 0, 0) Month)
+             [ "два года назад"
+             ]
+  , examples (datetimeInterval ((2013, 6, 1, 0, 0, 0), (2013, 9, 1, 0, 0, 0)) Day)
+             [ "лета"
+             , "лето"
+             ]
+  , examples (datetimeInterval ((2013, 3, 1, 0, 0, 0), (2013, 6, 1, 0, 0, 0)) Day)
+             [ "весна"
+             ]
+  , examples (datetimeInterval ((2012, 12, 1, 0, 0, 0), (2013, 3, 1, 0, 0, 0)) Day)
+             [ "зима"
+             ]
+  , examples (datetimeHoliday (2014, 1, 7, 0, 0, 0) Day "Рождество Христово")
+             [ "рождество"
+             , "Рождество Христово"
+             ]
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "Новый год")
+             [ "Новый год"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "сегодня вечером"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 18, 0, 0), (2013, 2, 14, 0, 0, 0)) Hour)
+             [ "завтра вечером"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 12, 0, 0), (2013, 2, 13, 14, 0, 0)) Hour)
+             [ "завтра в обед"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "вчера вечером"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 18, 0, 0), (2013, 2, 18, 0, 0, 0)) Hour)
+             [ "в эти выходные"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 29, 58), (2013, 2, 12, 4, 30, 0)) Second)
+             [ "последние 2 секунды"
+             , "последние две секунды"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 1), (2013, 2, 12, 4, 30, 4)) Second)
+             [ "следующие 3 секунды"
+             , "следующие три секунды"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 28, 0), (2013, 2, 12, 4, 30, 0)) Minute)
+             [ "последние 2 минуты"
+             , "последние две минуты"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 31, 0), (2013, 2, 12, 4, 34, 0)) Minute)
+             [ "следующие 3 минуты"
+             , "следующие три минуты"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 5, 0, 0), (2013, 2, 12, 8, 0, 0)) Hour)
+             [ "следующие 3 часа"
+             , "следующие три часа"
+             ]
+  , examples (datetimeInterval ((2013, 2, 10, 0, 0, 0), (2013, 2, 12, 0, 0, 0)) Day)
+             [ "последние 2 дня"
+             , "последние два дня"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 0, 0, 0), (2013, 2, 16, 0, 0, 0)) Day)
+             [ "следующие 3 дня"
+             , "следующие три дня"
+             ]
+  , examples (datetimeInterval ((2013, 1, 28, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Week)
+             [ "последние 2 недели"
+             , "последние две недели"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 3, 11, 0, 0, 0)) Week)
+             [ "следующие 3 недели"
+             , "следующие три недели"
+             ]
+  , examples (datetimeInterval ((2012, 12, 0, 0, 0, 0), (2013, 2, 0, 0, 0, 0)) Month)
+             [ "последние 2 месяца"
+             , "последние два месяца"
+             ]
+  , examples (datetimeInterval ((2013, 3, 0, 0, 0, 0), (2013, 6, 0, 0, 0, 0)) Month)
+             [ "следующие 3 месяца"
+             , "следующие три месяца"
+             ]
+  , examples (datetimeInterval ((2011, 0, 0, 0, 0, 0), (2013, 0, 0, 0, 0, 0)) Year)
+             [ "последние 2 года"
+             , "последние два года"
+             ]
+  , examples (datetimeInterval ((2014, 0, 0, 0, 0, 0), (2017, 0, 0, 0, 0, 0)) Year)
+             [ "следующие 3 года"
+             , "следующие три года"
+             ]
+  , examples (datetimeInterval ((2013, 7, 13, 0, 0, 0), (2013, 7, 16, 0, 0, 0)) Day)
+             [ "13 - 15 июля"
+             , "с 13 по 15 июля"
+             , "13 июля - 15 июля"
+             ]
+  , examples (datetimeInterval ((2013, 8, 8, 0, 0, 0), (2013, 8, 13, 0, 0, 0)) Day)
+             [ "8 авг - 12 авг"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 9, 30, 0), (2013, 2, 12, 11, 1, 0)) Minute)
+             [ "9:30 - 11:00"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 11, 30, 0), (2013, 2, 12, 13, 31, 0)) Minute)
+             [ "11:30-13:30"
+             ]
+  , examples (datetime (2013, 9, 21, 1, 30, 0) Minute)
+             [ "1:30 ночи сб, 21 сен."
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 26, 0, 0, 0)) Second)
+             [ "в течение 2 недель"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 2, 12, 14, 0, 0) Hour)
+             [ "до 2 часов дня"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 2, 13, 0, 0, 0) Hour)
+             [ "до конца дня"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 3, 1, 0, 0, 0) Month)
+             [ "до конца месяца"
+             ]
+  , examples (datetime (2013, 2, 12, 13, 0, 0) Minute)
+             [ "16:00 CET"
+             ]
+  , examples (datetime (2013, 2, 14, 6, 0, 0) Minute)
+             [ "четверг 8:00 GMT"
+             , "четверг 8:00 gmt"
+             ]
+  , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
+             [ "сегодня в 14 часов"
+             , "в 2"
+             , "в 2 часа"
+             ]
+  , examples (datetime (2013, 2, 13, 15, 0, 0) Hour)
+             [ "завтра в 15 часов"
+             ]
+  , examples (datetimeOpenInterval After (2013, 2, 12, 14, 0, 0) Hour)
+             [ "после 14 часов"
+             , "после 14ч"
+             , "после 2 часов"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 2, 12, 11, 0, 0) Hour)
+             [ "до 11 часов"
+             , "до 11 часов утра"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
+             [ "сегодня днем"
+             ]
+  , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
+             [ "в 13:30 дня"
+             , "13:30"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 45, 0) Second)
+             [ "через 15 минут"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 30, 0) Minute)
+             [ "10:30"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "в следующий понедельник"
+             ]
+  , examples (datetime (2013, 12, 10, 0, 0, 0) Day)
+             [ "10.12."
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 30, 0), (2013, 2, 12, 19, 1, 0)) Minute)
+             [ "18:30ч - 19:00ч"
+             , "18:30ч/19:00ч"
+             ]
+  , examples (datetimeInterval ((2013, 10, 14, 0, 0, 0), (2013, 10, 16, 0, 0, 0)) Day)
+             [ "14. - 15.10."
+             , "14 - 15.10."
+             , "14. - 15.10"
+             , "14.10. - 15.10."
+             , "14. - 15.10.2013"
+             , "14./15.10."
+             ]
+  , examples (datetimeInterval ((2018, 10, 14, 0, 0, 0), (2018, 10, 16, 0, 0, 0)) Day)
+             [ "14. - 15.10.18"
+             , "14 - 15.10.18"
+             , "14./15.10.2018"
+             , "с 14.10. - 15.10.2018"
+             , "14.10. по 15.10.2018"
+             , "с 14.10. по 15.10.2018"
+             ]
+  , examples (datetime (2013, 10, 10, 0, 0, 0) Day)
+             ["10.10.2013"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 10, 0) Minute)
+             [ "в 10.10"
+             ]
+  , examples (datetime (2013, 2, 12, 17, 10, 0) Minute)
+             [ "17ч10"
+             ]
+  ]
diff --git a/Duckling/Time/RU/Rules.hs b/Duckling/Time/RU/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/RU/Rules.hs
@@ -0,0 +1,1135 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.RU.Rules
+  ( rules
+  ) where
+
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Ordinal.Types (OrdinalData(..))
+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
+
+ruleInstants :: [Rule]
+ruleInstants = mkRuleInstants
+  [ ( "сейчас"       , TG.Second ,  0, "сейчас"               )
+  , ( "сегодня"      , TG.Day    ,  0, "сегодня"              )
+  , ( "завтра"       , TG.Day    ,  1, "завтра"               )
+  , ( "вчера"        , TG.Day    , -1, "вчера"                )
+  , ( "послезавтра"  , TG.Day    ,  2, "послезавтра"          )
+  , ( "позавчера"    , TG.Day    , -2, "позавчера"            )
+  , ( "Конец месяца" , TG.Month  ,  1, "(конец|конца) месяца" )
+  , ( "Конец года"   , TG.Year   ,  1, "(конец|конца) года"   )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
+  [ ( "Понедельник" , "понедельник(а)?|пн" )
+  , ( "Вторник"     , "вторник(а)?|вт"     )
+  , ( "Среда"       , "сред(а|у)|ср"       )
+  , ( "Четверг"     , "четверг(а)?|чт"     )
+  , ( "Пятница"     , "пятниц(а|у)|пт"     )
+  , ( "Суббота"     , "суббот(а|у)|сб"     )
+  , ( "Воскресенье" , "воскресенье|вс"     )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = mkRuleMonths
+  [ ( "Январь"   , "январ(ь|я)|янв\\.?"   )
+  , ( "Февраль"  , "феврал(ь|я)|фев\\.?"  )
+  , ( "Март"     , "март(а)?|мар\\.?"     )
+  , ( "Апрель"   , "апрел(ь|я)|апр\\.?"   )
+  , ( "Май"      , "ма(й|я)"              )
+  , ( "Июнь"     , "июн(ь|я)|июн\\.?"     )
+  , ( "Июль"     , "июл(ь|я)|июл\\.?"     )
+  , ( "Август"   , "август(а)?|авг\\.?"   )
+  , ( "Сентябрь" , "сентябр(ь|я)|сен\\.?" )
+  , ( "Октябрь"  , "октябр(ь|я)|окт\\.?"  )
+  , ( "Ноябрь"   , "ноябр(ь|я)?|ноя\\.?"  )
+  , ( "Декабрь"  , "декабр(ь|я)|дек\\.?"  )
+  ]
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "лето"  , "лет(о|а)"  , monthDay  6  1, monthDay  8 31 )
+  , ( "осень" , "осень" , monthDay  9  1, monthDay 11 30 )
+  , ( "зима"  , "зима"  , monthDay 12  1, monthDay  2 28 )
+  , ( "весна" , "весна" , monthDay  3  1, monthDay  5 31 )
+  ]
+
+ruleHolidays :: [Rule]
+ruleHolidays = mkRuleHolidays
+  [ ( "Новый год"                  , "Новый год"                   , monthDay  1  1 )
+  , ( "Рождество Христово"         , "рождество( христово)?"       , monthDay  1  7 )
+  , ( "День защитника отечества"   , "день защитника"              , monthDay  2 23 )
+  , ( "Международный женский день" , "международный женский день"  , monthDay  3  8 )
+  , ( "День смеха"                 , "день смеха"                  , monthDay  4  1 )
+  , ( "Праздник Весны и Труда"     , "день труда"                  , monthDay  5  1 )
+  , ( "День Победы"                , "День Победы"                 , monthDay  5  9 )
+  , ( "День России"                , "день россии"                 , monthDay  6 12 )
+  , ( "День народного единства"    , "день единства"               , monthDay  11 4 )
+  ]
+
+ruleLastTime :: Rule
+ruleLastTime = Rule
+  { name = "last <time>"
+  , pattern =
+    [ regex "(в )?прошл(ый|ого|ому|ом|ые|ых|ым|ыми|ая)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) ->
+        tt $ predNth (-1) False td
+      _ -> Nothing
+  }
+
+ruleDatetimeDatetimeInterval :: Rule
+ruleDatetimeDatetimeInterval = Rule
+  { name = "<datetime> - <datetime> (interval)"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "\\-"
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleDateDateInterval :: Rule
+ruleDateDateInterval = Rule
+  { name = "dd.(mm.)? - dd.mm.(yy[yy]?)? (interval)"
+  , pattern =
+    [ regex "(?:с\\s+)?(10|20|30|31|[012]?[1-9])\\.?((?<=\\.)(?:10|11|12|0?[1-9])(?:\\.?))?"
+    , regex "\\-|/|по"
+    , regex "(10|20|30|31|[012]?[1-9])\\.(10|11|12|0?[1-9])\\.?((?<=\\.)\\d{2,4})?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (d1:"":_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:"":_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m2 <- parseInt m2
+          Token Time <$> interval TTime.Closed (monthDay m2 d1) (monthDay m2 d2)
+      (Token RegexMatch (GroupMatch (d1:"":_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:y:_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m2 <- parseInt m2
+          y <- parseInt y
+          Token Time <$> interval TTime.Closed (yearMonthDay y m2 d1) (yearMonthDay y m2 d2)
+      (Token RegexMatch (GroupMatch (d1:m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:"":_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m1 <- parseInt m1
+          m2 <- parseInt m2
+          Token Time <$> interval TTime.Closed (monthDay m1 d1) (monthDay m2 d2)
+      (Token RegexMatch (GroupMatch (d1:m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:y:_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m1 <- parseInt m1
+          m2 <- parseInt m2
+          y <- parseInt y
+          Token Time <$> interval TTime.Closed (yearMonthDay y m1 d1) (yearMonthDay y m2 d2)
+      _ -> Nothing
+  }
+
+ruleInDuration :: Rule
+ruleInDuration = Rule
+  { name = "in <duration>"
+  , pattern =
+    [ regex "через"
+    , dimension Duration
+    ]
+  , prod = \case
+      (_:Token Duration dd:_) ->
+        tt $ inDuration dd
+      _ -> Nothing
+  }
+
+ruleLastCycleOfTime :: Rule
+ruleLastCycleOfTime = Rule
+  { name = "last <cycle> of <time>"
+  , pattern =
+    [ regex "последн(ий|юю|яя|его|ему)"
+    , dimension TimeGrain
+    , regex "в"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_:Token Time td:_) ->
+        tt $ cycleLastOf grain td
+      _ -> Nothing
+  }
+
+ruleLastCycleOfTime2 :: Rule
+ruleLastCycleOfTime2 = Rule
+  { name = "last <cycle> of <time>"
+  , pattern =
+    [ regex "последн(ий|юю|яя|его|ему)"
+    , dimension TimeGrain
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:Token Time td:_) ->
+        tt $ cycleLastOf grain td
+      _ -> Nothing
+  }
+
+ruleMonthDdddInterval :: Rule
+ruleMonthDdddInterval = Rule
+  { name = "<month> dd-dd (interval)"
+  , pattern =
+    [ regex "(?:с\\s+)?([012]?\\d|30|31)(го|\\.)?"
+    , regex "\\-|по|до"
+    , regex "([012]?\\d|30|31)(ое|\\.)?"
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (m2:_)):
+       Token Time td:
+       _) -> do
+        v1 <- parseInt m1
+        v2 <- parseInt m2
+        from <- intersect (dayOfMonth v1) td
+        to <- intersect (dayOfMonth v2) td
+        Token Time <$> interval TTime.Closed from to
+      _ -> Nothing
+  }
+
+ruleYearLatent2 :: Rule
+ruleYearLatent2 = Rule
+  { name = "year (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 2101 10000
+    ]
+  , prod = \case
+      (token:_) -> do
+        v <- getIntValue token
+        tt . mkLatent $ year v
+      _ -> Nothing
+  }
+
+ruleTimeAfterNext :: Rule
+ruleTimeAfterNext = Rule
+  { name = "<time> after next"
+  , pattern =
+    [ dimension Time
+    , regex "после следующ(ей|его)"
+    ]
+  , prod = \case
+      (Token Time td:_:_) ->
+        tt $ predNth 1 True td
+      _ -> Nothing
+  }
+
+ruleNoon :: Rule
+ruleNoon = Rule
+  { name = "noon"
+  , pattern =
+    [ regex "полдень"
+    ]
+  , prod = \_ -> tt $ hour False 12
+  }
+
+ruleThisnextDayofweek :: Rule
+ruleThisnextDayofweek = Rule
+  { name = "this|next <day-of-week>"
+  , pattern =
+    [ regex "следующ(ий|ая|ее)"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (_:Token Time td:_) ->
+        tt $ predNth 0 True td
+      _ -> Nothing
+  }
+
+ruleBetweenTimeofdayAndTimeofdayInterval :: Rule
+ruleBetweenTimeofdayAndTimeofdayInterval = Rule
+  { name = "between <time-of-day> and <time-of-day> (interval)"
+  , pattern =
+    [ regex "с"
+    , Predicate isATimeOfDay
+    , regex "по"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleNextCycle :: Rule
+ruleNextCycle = Rule
+  { name = "next <cycle>"
+  , pattern =
+    [ regex "(в |на )?следующ(ий|его|ему|им|ем|ие|их|ими)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 1
+      _ -> Nothing
+  }
+
+ruleOnDate :: Rule
+ruleOnDate = Rule
+  { name = "on <date>"
+  , pattern =
+    [ regex "в"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:x:_) -> Just x
+      _ -> Nothing
+  }
+
+ruleLastCycle :: Rule
+ruleLastCycle = Rule
+  { name = "last <cycle>"
+  , pattern =
+    [ regex "(в )?прошл(ый|ого|ому|ым|ом|ые|ых|ыми)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt . cycleNth grain $ - 1
+      _ -> Nothing
+  }
+
+ruleLastCycle2 :: Rule
+ruleLastCycle2 = Rule
+  { name = "last <cycle>"
+  , pattern =
+    [ regex "(в )?прошедш(ий|его|ему|им|ем|их|ие|ими)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt . cycleNth grain $ - 1
+      _ -> Nothing
+  }
+
+ruleLunch :: Rule
+ruleLunch = Rule
+  { name = "lunch"
+  , pattern =
+    [ regex "(в )?обед"
+    ]
+  , prod = \_ ->
+      let from = hour False 12
+          to = hour False 14
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleAfternoon :: Rule
+ruleAfternoon = Rule
+  { name = "afternoon"
+  , pattern =
+    [ regex "дня|днем"
+    ]
+  , prod = \_ ->
+      let from = hour False 12
+          to = hour False 19
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleEvening :: Rule
+ruleEvening = Rule
+  { name = "evening"
+  , pattern =
+    [ regex "вечера|вечером|вечер"
+    ]
+  , prod = \_ ->
+      let from = hour False 18
+          to = hour False 0
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleNamedmonthDayofmonthOrdinal :: Rule
+ruleNamedmonthDayofmonthOrdinal = Rule
+  { name = "<named-month> <day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMOrdinal
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+
+ruleHourofdayIntegerAsRelativeMinutes :: Rule
+ruleHourofdayIntegerAsRelativeMinutes = Rule
+  { name = "<hour-of-day> <integer> (as relative minutes)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
+    , Predicate $ isIntegerBetween 1 59
+    ]
+  , prod = \case
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute is12H hours n
+      _ -> Nothing
+  }
+
+ruleDayofmonthordinalNamedmonth :: Rule
+ruleDayofmonthordinalNamedmonth = Rule
+  { name = "<day-of-month>(ordinal) <named-month>"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleIntersectBy :: Rule
+ruleIntersectBy = Rule
+  { name = "intersect by ','"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex ","
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleNthTimeAfterTime :: Rule
+ruleNthTimeAfterTime = Rule
+  { name = "nth <time> after <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , regex "после"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td1:
+       _:
+       Token Time td2:
+       _) -> tt $ predNthAfter (v - 1) td1 td2
+      _ -> Nothing
+  }
+
+ruleMmdd :: Rule
+ruleMmdd = Rule
+  { name = "mm/dd"
+  , pattern =
+    [ regex "([012]?[1-9]|10|20|30|31)\\.(10|11|12|0?[1-9])\\.?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        d <- parseInt m1
+        m <- parseInt m2
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleTimeofdayLatent :: Rule
+ruleTimeofdayLatent = Rule
+  { name = "time-of-day (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 0 23
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ hour (n < 12) n
+      _ -> Nothing
+  }
+
+ruleDurationAgo :: Rule
+ruleDurationAgo = Rule
+  { name = "<duration> ago"
+  , pattern =
+    [ dimension Duration
+    , regex "назад"
+    ]
+  , prod = \case
+      (Token Duration dd:_:_) ->
+        tt $ durationAgo dd
+      _ -> Nothing
+  }
+
+ruleLastNCycle :: Rule
+ruleLastNCycle = Rule
+  { name = "last n <cycle>"
+  , pattern =
+    [ regex "последние"
+    , Predicate $ isIntegerBetween 1 9999
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:token:Token TimeGrain grain:_) -> do
+        n <- getIntValue token
+        tt $ cycleN True grain (- n)
+      _ -> Nothing
+  }
+
+ruleWithinDuration :: Rule
+ruleWithinDuration = Rule
+  { name = "within <duration>"
+  , pattern =
+    [ regex "в течение"
+    , dimension Duration
+    ]
+  , prod = \case
+      (_:Token Duration dd:_) -> Token Time <$>
+        interval TTime.Open now (inDuration dd)
+      _ -> Nothing
+  }
+
+ruleMidnighteodendOfDay :: Rule
+ruleMidnighteodendOfDay = Rule
+  { name = "midnight|EOD|end of day"
+  , pattern =
+    [ regex "кон(ец|ц(а|е)) дня"
+    ]
+  , prod = \_ -> tt $ hour False 0
+  }
+
+ruleDayofmonthNonOrdinalNamedmonth :: Rule
+ruleDayofmonthNonOrdinalNamedmonth = Rule
+  { name = "<day-of-month> (non ordinal) <named-month>"
+  , pattern =
+    [ Predicate isDOMInteger
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate isNotLatent
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleUntilTimeofday :: Rule
+ruleUntilTimeofday = Rule
+  { name = "until <time-of-day>"
+  , pattern =
+    [ regex "до"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ withDirection TTime.Before td
+      _ -> Nothing
+  }
+
+ruleAtTimeofday :: Rule
+ruleAtTimeofday = Rule
+  { name = "at <time-of-day>"
+  , pattern =
+    [ regex "в"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime :: Rule
+ruleNthTimeOfTime = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , regex "в"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td1:
+       _:
+       Token Time td2:
+       _) -> Token Time . predNth (v - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime2 :: Rule
+ruleNthTimeOfTime2 = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td1:
+       Token Time td2:
+       _) -> Token Time . predNth (v - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleTimePartofday :: Rule
+ruleTimePartofday = Rule
+  { name = "<time> <part-of-day>"
+  , pattern =
+    [ dimension Time
+    , Predicate isAPartOfDay
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleWeek :: Rule
+ruleWeek = Rule
+ { name = "week"
+ , pattern =
+   [ regex "(эта )?неделя" -- regex "(all|rest of the|the|this) week"
+   ]
+ , prod = \case
+     (Token RegexMatch (GroupMatch (m:_)):_) -> do
+       let end = cycleNthAfter True TG.Day (-2) $ cycleNth TG.Week 1
+       let match = Text.strip $ Text.toLower m
+       period <- case match of
+         "эта" -> interval TTime.Closed (cycleNth TG.Week 0) end
+         "rest of the" -> interval TTime.Open today end
+         -- no prefix, implicit 'the'
+         "неделя" -> interval TTime.Open today end
+         _ -> Nothing
+       let l = case match of { "неделя" -> mkLatent; _ -> id; }
+       Just $ Token Time $ l period
+     _ -> Nothing
+ }
+
+ruleWeekend :: Rule
+ruleWeekend = Rule
+  { name = "week-end"
+  , pattern =
+    [ regex "выходные"
+    ]
+  , prod = \_ -> tt $ mkOkForThisNext weekend
+  }
+
+ruleOrdinalQuarterYear :: Rule
+ruleOrdinalQuarterYear = Rule
+  { name = "<ordinal> quarter <year>"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal od:_:Token Time td:_) ->
+        tt $ cycleNthAfter False TG.Quarter (TOrdinal.value od - 1) td
+      _ -> Nothing
+  }
+
+ruleYyyymmdd :: Rule
+ruleYyyymmdd = Rule
+  { name = "yyyy-mm-dd"
+  , pattern =
+    [ regex "(\\d{2,4})-(0?[1-9]|10|11|12)-([012]?[1-9]|10|20|30|31)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
+        y <- parseInt m1
+        m <- parseInt m2
+        d <- parseInt m3
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleIntersectByOfFromS :: Rule
+ruleIntersectByOfFromS = Rule
+  { name = "intersect by 'of', 'from', 's"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "на"
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleNextNCycle :: Rule
+ruleNextNCycle = Rule
+  { name = "next n <cycle>"
+  , pattern =
+    [ regex "следующие"
+    , Predicate $ isIntegerBetween 1 9999
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:token:Token TimeGrain grain:_) -> do
+        v <- getIntValue token
+        tt $ cycleN True grain v
+      _ -> Nothing
+  }
+
+ruleMorning :: Rule
+ruleMorning = Rule
+  { name = "morning"
+  , pattern =
+    [ regex "утро|утром|утра"
+    ]
+  , prod = \_ ->
+      let from = hour False 3
+          to = hour False 12
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleThisPartofday :: Rule
+ruleThisPartofday = Rule
+  { name = "this <part-of-day>"
+  , pattern =
+    [ regex "(в )?(это|эту|этот|этого|этому|эти)"
+    , Predicate isAPartOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
+      _ -> Nothing
+  }
+
+ruleThisCycle :: Rule
+ruleThisCycle = Rule
+  { name = "this <cycle>"
+  , pattern =
+    [ regex "(в )?(это|эту|этот|этого|этому|эти)"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 0
+      _ -> Nothing
+  }
+
+ruleThisTime :: Rule
+ruleThisTime = Rule
+  { name = "this <time>"
+  , pattern =
+    [ regex "(в )?(это|эту|этот|этого|этому|эти)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) ->
+        tt $ predNth 0 False td
+      _ -> Nothing
+  }
+
+ruleYearLatent :: Rule
+ruleYearLatent = Rule
+  { name = "year (latent)"
+  , pattern =
+    [ Predicate $
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
+    ]
+  , prod = \case
+      (token:_) -> do
+        y <- getIntValue token
+        tt . mkLatent $ year y
+      _ -> Nothing
+  }
+
+ruleAfterTimeofday :: Rule
+ruleAfterTimeofday = Rule
+  { name = "after <time-of-day>"
+  , pattern =
+    [ regex "после"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ withDirection TTime.After td
+      _ -> Nothing
+  }
+
+ruleNight :: Rule
+ruleNight = Rule
+  { name = "night"
+  , pattern =
+    [ regex "ночь|ночи|ночью"
+    ]
+  , prod = \_ ->
+      let from = hour False 0
+          to = hour False 4
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleDayofmonthOrdinal :: Rule
+ruleDayofmonthOrdinal = Rule
+  { name = "<day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:_) ->
+        tt $ dayOfMonth v
+      _ -> Nothing
+  }
+
+ruleOrdinalCycleOfTime :: Rule
+ruleOrdinalCycleOfTime = Rule
+  { name = "<ordinal> <cycle> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension TimeGrain
+    , regex "в"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal od:Token TimeGrain grain:_:Token Time td:_) ->
+        tt $ cycleNthAfter True grain (TOrdinal.value od - 1) td
+      _ -> Nothing
+  }
+
+
+ruleHhmm :: Rule
+ruleHhmm = Rule
+  { name = "hh:mm"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))[:.ч]([0-5]\\d)(?:час(ов|а|у)?|ч)?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        h <- parseInt m1
+        m <- parseInt m2
+        tt $ hourMinute False h m
+      _ -> Nothing
+  }
+
+ruleYear :: Rule
+ruleYear = Rule
+  { name = "year"
+  , pattern =
+    [ Predicate $ isIntegerBetween 1000 2100
+    ]
+  , prod = \case
+      (token:_) -> do
+        y <- getIntValue token
+        tt $ year y
+      _ -> Nothing
+  }
+
+ruleNamedmonthDayofmonthNonOrdinal :: Rule
+ruleNamedmonthDayofmonthNonOrdinal = Rule
+  { name = "<named-month> <day-of-month> (non ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMInteger
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleHhmmMilitary :: Rule
+ruleHhmmMilitary = Rule
+  { name = "hhmm (military)"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))([0-5]\\d)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
+        hh <- parseInt h
+        mm <- parseInt m
+        tt . mkLatent $ hourMinute False hh mm
+      _ -> Nothing
+  }
+
+ruleAbsorptionOfAfterNamedDay :: Rule
+ruleAbsorptionOfAfterNamedDay = Rule
+  { name = "absorption of , after named day"
+  , pattern =
+    [ Predicate isADayOfWeek
+    , regex ","
+    ]
+  , prod = \case
+      (x:_) -> Just x
+      _ -> Nothing
+  }
+
+ruleLastDayofweekOfTime :: Rule
+ruleLastDayofweekOfTime = Rule
+  { name = "last <day-of-week> of <time>"
+  , pattern =
+    [ regex "последний"
+    , Predicate isADayOfWeek
+    , regex "в"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        tt $ predLastOf td1 td2
+      _ -> Nothing
+  }
+
+ruleTimeofdayTimeofdayInterval :: Rule
+ruleTimeofdayTimeofdayInterval = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "\\-"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleTimeofdayTimeofdayInterval2 :: Rule
+ruleTimeofdayTimeofdayInterval2 = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "\\-|/"
+    , Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleDurationAfterTime :: Rule
+ruleDurationAfterTime = Rule
+  { name = "<duration> after <time>"
+  , pattern =
+    [ dimension Duration
+    , regex "после"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Duration dd:_:Token Time td:_) ->
+        tt $ durationAfter dd td
+      _ -> Nothing
+  }
+
+ruleOrdinalQuarter :: Rule
+ruleOrdinalQuarter = Rule
+  { name = "<ordinal> quarter"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:_) -> tt .
+        cycleNthAfter False TG.Quarter (v - 1) $ cycleNth TG.Year 0
+      _ -> Nothing
+  }
+
+ruleDurationBeforeTime :: Rule
+ruleDurationBeforeTime = Rule
+  { name = "<duration> before <time>"
+  , pattern =
+    [ dimension Duration
+    , regex "перед"
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Duration dd:_:Token Time td:_) ->
+        tt $ durationBefore dd td
+      _ -> Nothing
+  }
+
+rulePartofdayOfTime :: Rule
+rulePartofdayOfTime = Rule
+  { name = "<part-of-day> of <time>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleMmddyyyy :: Rule
+ruleMmddyyyy = Rule
+  { name = "mm/dd/yyyy"
+  , pattern =
+    [ regex "([012]?[1-9]|10|20|30|31)\\.(0?[1-9]|10|11|12)\\.(\\d{2,4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
+        y <- parseInt m3
+        m <- parseInt m2
+        d <- parseInt m1
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleTimeofdayOclock :: Rule
+ruleTimeofdayOclock = Rule
+  { name = "<time-of-day>  o'clock"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "час(у|а|ов)?|ч(?:[\\s'\"-_{}\\[\\]()]|$)"
+    ]
+  , prod = \case
+      (Token Time td:_) ->
+        tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleDayofmonthordinalNamedmonthYear :: Rule
+ruleDayofmonthordinalNamedmonthYear = Rule
+  { name = "<day-of-month>(ordinal) <named-month> year"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    , Predicate isAMonth
+    , regex "(\\d{2,4})"
+    ]
+  , prod = \case
+      (token:
+       Token Time td:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+        n <- parseInt match
+        dom <- intersectDOM td token
+        Token Time <$> intersect dom (year n)
+      _ -> Nothing
+  }
+
+ruleTimezone :: Rule
+ruleTimezone = Rule
+  { name = "<time> timezone"
+  , pattern =
+    [ 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 = \case
+      (Token Time td:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> Token Time <$> inTimezone (Text.toUpper tz) td
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ruleAbsorptionOfAfterNamedDay
+  , ruleAfterTimeofday
+  , ruleAfternoon
+  , ruleAtTimeofday
+  , ruleBetweenTimeofdayAndTimeofdayInterval
+  , ruleDatetimeDatetimeInterval
+  , ruleDateDateInterval
+  , ruleDayofmonthNonOrdinalNamedmonth
+  , ruleDayofmonthOrdinal
+  , ruleDayofmonthordinalNamedmonth
+  , ruleDayofmonthordinalNamedmonthYear
+  , ruleDurationAfterTime
+  , ruleDurationAgo
+  , ruleDurationBeforeTime
+  , ruleEvening
+  , ruleHhmm
+  , ruleHhmmMilitary
+  , ruleHourofdayIntegerAsRelativeMinutes
+  , ruleInDuration
+  , ruleIntersect
+  , ruleIntersectBy
+  , ruleIntersectByOfFromS
+  , ruleLastCycle
+  , ruleLastCycle2
+  , ruleLastCycleOfTime
+  , ruleLastCycleOfTime2
+  , ruleLastDayofweekOfTime
+  , ruleLastNCycle
+  , ruleLastTime
+  , ruleLunch
+  , ruleMidnighteodendOfDay
+  , ruleMmdd
+  , ruleMmddyyyy
+  , ruleMonthDdddInterval
+  , ruleMorning
+  , ruleNamedmonthDayofmonthNonOrdinal
+  , ruleNamedmonthDayofmonthOrdinal
+  , ruleNextCycle
+  , ruleNextNCycle
+  , ruleNight
+  , ruleNoon
+  , ruleNthTimeAfterTime
+  , ruleNthTimeOfTime
+  , ruleNthTimeOfTime2
+  , ruleOnDate
+  , ruleOrdinalCycleOfTime
+  , ruleOrdinalQuarter
+  , ruleOrdinalQuarterYear
+  , rulePartofdayOfTime
+  , ruleThisCycle
+  , ruleThisPartofday
+  , ruleThisTime
+  , ruleThisnextDayofweek
+  , ruleTimeAfterNext
+  , ruleTimePartofday
+  , ruleTimeofdayLatent
+  , ruleTimeofdayOclock
+  , ruleTimeofdayTimeofdayInterval
+  , ruleTimeofdayTimeofdayInterval2
+  , ruleUntilTimeofday
+  , ruleWeek
+  , ruleWeekend
+  , ruleWithinDuration
+  , ruleYear
+  , ruleYearLatent
+  , ruleYearLatent2
+  , ruleYyyymmdd
+  , ruleTimezone
+  ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
+  ++ ruleSeasons
+  ++ ruleHolidays
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -11,17 +10,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.SV.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
-import Duckling.Ordinal.Types (OrdinalData (..))
+import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Data.Text as Text
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -75,8 +76,7 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -248,7 +248,7 @@
   { name = "last <time>"
   , pattern =
     [ regex "(sista|förra|senaste)"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -330,7 +330,7 @@
   , pattern =
     [ regex "just nu|nu|(i )?detta ögonblick"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleLastCycleOfTime :: Rule
@@ -470,7 +470,7 @@
   , pattern =
     [ regex "i dag|idag"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleThisnextDayofweek :: Rule
@@ -811,17 +811,11 @@
       _ -> Nothing
   }
 
-ruleSeason :: Rule
-ruleSeason = Rule
-  { name = "season"
-  , pattern =
-    [ regex "sommar(en)"
-    ]
-  , prod = \_ ->
-      let from = monthDay 6 21
-          to = monthDay 9 23
-      in Token Time <$> interval TTime.Open from to
-  }
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "sommar"  , "sommar(en)"       , monthDay  6 21, monthDay  9 23 )
+  , ( "vinter"  , "vinter(n)"           , monthDay 12 21, monthDay  3 20 )
+  ]
 
 ruleBetweenDatetimeAndDatetimeInterval :: Rule
 ruleBetweenDatetimeAndDatetimeInterval = Rule
@@ -868,8 +862,7 @@
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time <$> interval TTime.Closed (cycleNth TG.Second 0) td
+      (_:Token Time td:_) -> Token Time <$> interval TTime.Closed now td
       _ -> Nothing
   }
 
@@ -880,9 +873,8 @@
     [ regex "efter jobbet"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleLastNCycle :: Rule
@@ -921,9 +913,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Duration dd:_) ->
-        let from = cycleNth TG.Second 0
-            to = inDuration dd
-        in Token Time <$> interval TTime.Open from to
+        Token Time <$> interval TTime.Open now (inDuration dd)
       _ -> Nothing
   }
 
@@ -1036,7 +1026,7 @@
   , pattern =
     [ regex "((week(\\s|-)?end)|helg)(en)?"
     ]
-  , prod = \_ -> tt weekend
+  , prod = \_ -> tt $ mkOkForThisNext weekend
   }
 
 ruleEomendOfMonth :: Rule
@@ -1082,7 +1072,7 @@
   { name = "next <time>"
   , pattern =
     [ regex "nästa|kommande"
-    , Predicate isNotLatent
+    , Predicate $ and . sequence [isNotLatent, isOkWithThisNext]
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -1198,8 +1188,7 @@
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -1221,7 +1210,7 @@
   { name = "this <time>"
   , pattern =
     [ regex "(denna|detta|i|den här)"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -1249,9 +1238,8 @@
     [ regex "efter (lunch)"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleOnANamedday :: Rule
@@ -1288,18 +1276,6 @@
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
 
-ruleSeason2 :: Rule
-ruleSeason2 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "vinter(n)"
-    ]
-  , prod = \_ ->
-      let from = monthDay 12 21
-          to = monthDay 3 20
-      in Token Time <$> interval TTime.Open from to
-  }
-
 ruleAfterTimeofday :: Rule
 ruleAfterTimeofday = Rule
   { name = "after <time-of-day>"
@@ -1398,9 +1374,8 @@
     [ regex "ikväll"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleYear :: Rule
@@ -1731,8 +1706,6 @@
   , ruleRelativeMinutesTotillbeforeIntegerHourofday
   , ruleQuarterTotillbeforeIntegerHourofday
   , ruleHalfTotillbeforeIntegerHourofday
-  , ruleSeason
-  , ruleSeason2
   , ruleTheCycleAfterTime
   , ruleTheCycleBeforeTime
   , ruleTheCycleOfTime
@@ -1771,3 +1744,4 @@
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ ruleSeasons
diff --git a/Duckling/Time/TR/Corpus.hs b/Duckling/Time/TR/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/TR/Corpus.hs
@@ -0,0 +1,532 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.TR.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.TimeGrain.Types
+    ( Grain(Minute, Hour, Year, Quarter, Week, Month, Day, Second) )
+
+context :: Context
+context = testContext {locale = makeLocale TR Nothing}
+
+-- Tuesday Feb 12, 2013 at 4:30am is the "now" for the tests
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
+             [ "şimdi"
+             , "şu an"
+             ]
+  , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "bugün"
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
+             [ "2014"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "dün"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "yarın"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "yarından sonraki"
+             , "yarından sonraki gün"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "ay sonu"
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
+             [ "yıl sonu"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "pazartesi"
+             , "bu pazartesi"
+             , "18 şubat pazartesi"
+             , "şubat 18 pazartesi"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "salı"
+             , "sal"
+             , "bu salı"
+             , "19 şubat salı"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "perşembe"
+             , "per"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "cuma"
+             , "cum"
+             ]
+  , examples (datetime (2013, 2, 16, 0, 0, 0) Day)
+             [ "cumartesi"
+             , "cmt"
+             ]
+  , examples (datetime (2013, 2, 17, 0, 0, 0) Day)
+             [ "pazar"
+             ]
+  , examples (datetime (2013, 3, 3, 0, 0, 0) Day)
+             [ "martın üçü"
+             , "3 mart"
+             ]
+  , examples (datetime (2013, 3, 15, 0, 0, 0) Day)
+             [ "martın ortası"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "şubatın ortası"
+             ]
+  , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
+             [ "mart 3 2015"
+             , "mart üç 2015"
+             , "3 mart 2015"
+             , "üç mart 2015"
+             , "3/3/2015"
+             , "2015-3-3"
+             , "2015-03-03"
+             ]
+  , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
+             [ "Ağu 8"
+             , "Ağustos 8"
+             ]
+  , examples (datetime (2014, 7, 18, 0, 0, 0) Day)
+             [ "cuma temmuz 18"
+             , "temmuz 18 cuma"
+             , "18 temmuz cuma"
+             ]
+  , examples (datetime (2014, 10, 1, 0, 0, 0) Month)
+             [ "Ekim 2014"
+             ]
+  , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
+             [ "14 nisan 2015"
+             , "nisan 14 2015"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "önümüzdeki salı"
+             , "sonraki salı"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "sonraki cuma"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "önümüzdeki mart"
+             , "sonraki mart"
+             , "sonraki ay"
+             , "önümüzdeki ay"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "önümüzdeki mart"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "pazar 10 şubat"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
+             [ "bu hafta"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
+             [ "önümüzdeki hafta"
+             ]
+  , examples (datetime (2013, 2, 4, 0, 0, 0) Week)
+             [ "geçen hafta"
+             , "geçtiğimiz hafta"
+             , "önceki hafta"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
+             [ "sonraki hafta"
+             , "gelecek hafta"
+             , "önümüzdeki hafta"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
+             [ "geçen ay"
+             , "geçtiğimiz ay"
+             , "önceki ay"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "önümüzdeki ay"
+             , "sonraki ay"
+             , "gelecek ay"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
+             [ "bu çeyrek yıl"
+             ]
+  , examples (datetime (2013, 4, 1, 0, 0, 0) Quarter)
+             [ "sonraki çeyrek yıl"
+             ]
+  , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
+             [ "üçüncü çeyrek yıl"
+             ]
+  , examples (datetime (2013, 10, 1, 0, 0, 0) Quarter)
+             [ "dördüncü çeyrek yıl"
+             ]
+  , examples (datetime (2012, 1, 1, 0, 0, 0) Year)
+             [ "geçen yıl"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Year)
+             [ "bu yıl"
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
+             [ "sonraki yıl"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "geçen pazar"
+             , "geçen hafta pazar"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "geçen salı"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "önümüzdeki salı"
+             , "gelecek salı"
+             , "sonraki salı"
+             ]
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
+             [ "gelecek hafta çarşamba"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "yarından sonraki gün"
+             ]
+  , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
+             [ "sonraki gün saat 17"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "dün değil evvelsi gün"
+             , "dünden önceki gün"
+             , "öbürki gün"
+             , "öbürsü gün"
+             ]
+  , examples (datetime (2013, 2, 10, 8, 0, 0) Hour)
+             [ "dünden önceki gün saat 8"
+             ]
+  , examples (datetime (2013, 10, 1, 0, 0, 0) Day)
+             [ "ekimin birinci salı"
+             , "ekimin birinci salısı"
+             ]
+  , examples (datetime (2014, 10, 1, 0, 0, 0) Day)
+             [ "ekim 2014 birinci çarşambası"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "saat 3"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 0, 0) Hour)
+             [ "sabah saat 10"
+             ]
+  , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
+             [ "3:18"
+             , "03:18"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "saat 15"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Minute)
+             [ "15:00"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 3, 0) Minute)
+             [ "saat 15:03"
+             , "15:03"
+             ]
+  , examples (datetime (2013, 2, 12, 9, 59, 0) Minute)
+             [ "saat dokuz elli dokuz"
+             ]
+  , examples (datetime (2013, 9, 20, 19, 30, 0) Minute)
+             [ "20 eylül cuma saat 19:30"
+             ]
+  , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
+             [ "cumartesi saat 9"
+             , "cumartesi sabah saat 9"
+             ]
+  , examples (datetime (2014, 7, 18, 19, 0, 0) Minute)
+             [ "18 temmuz 2014 cuma saat 19:00"
+             , "saat 19:00 18 temmuz 2014 cuma"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 30, 1) Second)
+             [ "bir saniye içinde"
+             , "bir saniye içerisinde"
+             , "1 saniye içerisinde"
+             , "1 saniye içinde"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 31, 0) Second)
+             [ "bir dakika içinde"
+             , "bir dakika içerisinde"
+             , "1 dakika içinde"
+             , "1 dakika içerisinde"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 32, 0) Second)
+             [ "2 dakika içinde"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Second)
+             [ "60 dakika içinde"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
+             [ "bir saat içinde"
+             ]
+  , examples (datetime (2013, 2, 13, 4, 0, 0) Hour)
+             [ "bir gün sonra"
+             ]
+  , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
+             [ "7 gün içinde"
+             ]
+  , examples (datetime (2017, 2, 1, 17, 0, 0) Hour)
+             [ "4 yıl sonra saat 17"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "1 hafta içinde"
+             , "1 hafta sonra"
+             ]
+  , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
+             [ "7 gün önce"
+             ]
+  , examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
+             [ "14 gün önce"
+             , "iki hafta önce"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "bir hafta önce"
+             , "1 hafta önce"
+             ]
+  , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
+             [ "üç hafta önce"
+             ]
+  , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
+             [ "üç ay önce"
+             ]
+  , examples (datetime (2011, 2, 1, 0, 0, 0) Month)
+             [ "iki yıl önce"
+             ]
+  , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
+             [ "7 gün sonra"
+             ]
+  , examples (datetime (2013, 2, 26, 4, 0, 0) Hour)
+             [ "14 gün sonra"
+             , "iki hafta sonra"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "bir hafta sonra"
+             , "1 hafta sonra"
+             ]
+  , examples (datetime (2013, 3, 5, 0, 0, 0) Day)
+             [ "üç hafta sonra"
+             ]
+  , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
+             [ "üç ay sonra"
+             ]
+  , examples (datetime (2015, 2, 1, 0, 0, 0) Month)
+             [ "iki yıl sonra"
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Day)
+             [ "yılbaşından sonra bir yıl"
+             , "yılbaşından bir yıl sonra"
+             ]
+  , examples (datetimeInterval ((2013, 12, 18, 0, 0, 0), (2013, 12, 29, 0, 0, 0)) Day)
+             [ "18 aralıktan itibaren 10 gün boyunca"
+             , "18 aralıktan itibaren 10 gün süresince"
+             ]
+  , examples (datetime (2013, 2, 12, 16, 30, 0) Minute)
+             [ "saat 16'dan 30 dakika sonra"
+             ]
+  , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
+             [ "bu yaz"
+             ]
+  , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
+             [ "bu kış"
+             ]
+  , examples (datetimeInterval ((2011, 12, 21, 0, 0, 0), (2012, 03, 21, 0, 0, 0)) Day)
+             [ "geçen kış"
+             , "önceki kış"
+             ]
+  , examples (datetimeInterval ((2013, 3, 20, 0, 0, 0), (2013, 6, 22, 0, 0, 0)) Day)
+             [ "gelecek ilkbahar"
+             ]
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "Yılbaşı")
+             [ "yılbaşı"
+             ]
+  , examples (datetimeHoliday (2014, 1, 1, 18, 0, 0) Hour "Yılbaşı")
+             [ "yılbaşı saat 18"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "bu akşam"
+             ]
+  , examples (datetimeInterval ((2013, 2, 8, 18, 0, 0), (2013, 2, 11, 0, 0, 0)) Hour)
+             [ "geçen hafta sonu"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 18, 0, 0), (2013, 2, 14, 0, 0, 0)) Hour)
+             [ "yarın akşam"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 12, 0, 0), (2013, 2, 13, 14, 0, 0)) Hour)
+             [ "yarın öğle yemeği"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "dün akşam"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 18, 0, 0), (2013, 2, 18, 0, 0, 0)) Hour)
+             [ "bu hafta sonu"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
+             [ "pazartesi sabah"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 0, 0, 0), (2013, 2, 15, 12, 0, 0)) Hour)
+             [ "15 şubat sabahı"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 29, 58), (2013, 2, 12, 4, 30, 0)) Second)
+             [ "son 2 saniye"
+             , "son iki saniye"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 1), (2013, 2, 12, 4, 30, 4)) Second)
+             [ "sonraki 3 saniye"
+             , "sonraki üç saniye"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 28, 0), (2013, 2, 12, 4, 30, 0)) Minute)
+             [ "son 2 dakika"
+             , "son iki dakika"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 3, 0, 0), (2013, 2, 12, 4, 0, 0)) Hour)
+             [ "son 1 saat"
+             , "son bir saat"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 5, 0, 0), (2013, 2, 12, 8, 0, 0)) Hour)
+             [ "sonraki 3 saat"
+             , "sonraki üç saat"
+             ]
+  , examples (datetimeInterval ((2013, 2, 10, 0, 0, 0), (2013, 2, 12, 0, 0, 0)) Day)
+             [ "son iki gün"
+             , "son 2 gün"
+             ]
+  , examples (datetimeInterval ((2013, 1, 28, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Week)
+             [ "geçtiğimiz iki hafta"
+             , "önceki iki hafta"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 3, 11, 0, 0, 0)) Week)
+             [ "önümüzdeki üç hafta"
+             , "sonraki üç hafta"
+             ]
+  , examples (datetimeInterval ((2012, 12, 1, 0, 0, 0), (2013, 2, 1, 0, 0, 0)) Month)
+             [ "son 2 ay"
+             , "son iki ay"
+             ]
+  , examples (datetimeInterval ((2011, 1, 1, 0, 0, 0), (2013, 1, 1, 0, 0, 0)) Year)
+             [ "son 2 yıl"
+             , "son iki yıl"
+             ]
+  , examples (datetimeInterval ((2014, 1, 1, 0, 0, 0), (2017, 1, 1, 0, 0, 0)) Year)
+             [ "önümüzdeki üç yıl"
+             , "önümüzdeki 3 yıl"
+             ]
+  , examples (datetimeInterval ((2013, 8, 8, 0, 0, 0), (2013, 8, 13, 0, 0, 0)) Day)
+             [ "8 Ağu - 12 Ağu"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 9, 30, 0), (2013, 2, 12, 11, 1, 0)) Minute)
+             [ "9:30 - 11:00"
+             ]
+  , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 11, 1, 0)) Minute)
+             [ "perşembe 9:30 - 11:00"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 15, 0, 0), (2013, 2, 12, 17, 0, 0)) Hour)
+             [ "saat 15-16"]
+  , examples (datetimeInterval ((2013, 2, 12, 15, 30, 0), (2013, 2, 12, 18, 1, 0)) Minute)
+             [ "saat 15:30 - 18"]
+  , examples (datetimeInterval ((2013, 2, 14, 9, 0, 0), (2013, 2, 14, 12, 0, 0)) Hour)
+             [ "perşembe saat 9-11"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 11, 30, 0), (2013, 2, 12, 13, 31, 0)) Minute)
+             [ "saat 11:30-13:30"
+             ]
+  , examples (datetime (2013, 9, 21, 13, 30, 0) Minute)
+             [ "21 eylül cumartesi saat 13:30"
+             ]
+  , examples (datetime (2013, 2, 26, 0, 0, 0) Day)
+             [ "2 hafta içinde"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 13, 0, 0, 0)) Second)
+             [ "gün sonuna kadar"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 3, 1, 0, 0, 0)) Second)
+             [ "ay sonuna kadar"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "ay sonunda"
+             , "ay sonu"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 30, 0) Minute)
+             [ "saat 10:30 civarı"
+             , "10:30 civarı"
+             , "yaklaşık saat 10:30"
+             , "saat yaklaşık 10:30"
+             ]
+  , examples (datetime (2013, 2, 12, 19, 30, 0) Minute)
+             [ "akşam saat 19:30"
+             ]
+  , examples (datetime (2013, 2, 13, 15, 0, 0) Minute)
+             [ "yarın saat 15:00"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day)
+             [ "hafta boyunca"
+             ]
+  , examples (datetimeHoliday (1950, 7, 16, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "ramazan bayramı 1950"
+             , "1950 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (1975, 10, 6, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "1975 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (1988, 5, 16, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "1988 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (2018, 6, 15, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "2018 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (2013, 8, 8, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "2013 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (2046, 8, 4, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "2046 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (2050, 6, 21, 0, 0, 0) Day "Ramazan Bayramı")
+             [ "2050 ramazan bayramı"
+             ]
+  , examples (datetimeHoliday (2018, 8, 21, 0, 0, 0) Day "Kurban Bayramı")
+             [ "2018 kurban bayramı"
+             ]
+  , examples (datetimeHoliday (1980, 10, 19, 0, 0, 0) Day "Kurban Bayramı")
+             [ "1980 kurban bayramı"
+             ]
+  , examples (datetimeHoliday (1966, 4, 1, 0, 0, 0) Day "Kurban Bayramı")
+             [ "1966 kurban bayramı"
+             ]
+  , examples (datetimeHoliday (1974, 1, 3, 0, 0, 0) Day "Kurban Bayramı")
+             [ "1974 kurban bayramı"
+             ]
+  , examples (datetimeHoliday (2013, 4, 23, 0, 0, 0) Day "Ulusal Egemenlik ve Çocuk Bayramı")
+             [ "ulusal egemenlik ve çocuk bayramı"
+             , "çocuk bayramı"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Emek ve Dayanışma Günü")
+             [ "emek ve dayanışma günü"
+             ]
+  , examples (datetimeHoliday (2013, 5, 19, 0, 0, 0) Day "Atatürk’ü Anma, Gençlik ve Spor Bayramı")
+             [ "gençlik ve spor bayramı"
+             , "gençlik bayramı"
+             , "spor bayramı"
+             ]
+  , examples (datetimeHoliday (2013, 8, 30, 0, 0, 0) Day "Zafer Bayramı")
+             [ "zafer bayramı"
+             ]
+  , examples (datetimeHoliday (2013, 10, 29, 0, 0, 0) Day "Cumhuriyet Bayramı")
+             [ "cumhuriyet bayramı"
+             ]
+  ]
diff --git a/Duckling/Time/TR/Rules.hs b/Duckling/Time/TR/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/TR/Rules.hs
@@ -0,0 +1,1140 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.TR.Rules
+  ( rules
+  ) where
+
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Ordinal.Types (OrdinalData(..))
+import Duckling.Regex.Types (GroupMatch(..))
+import Duckling.Time.Computed
+import Duckling.Time.Helpers
+import Duckling.Time.Types (TimeData(..), TimeIntervalType (Closed, Open))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
+import qualified Duckling.Time.Types as TTime
+import qualified Duckling.TimeGrain.Types as TG
+
+ruleInstants :: [Rule]
+ruleInstants = mkRuleInstants
+  [ ( "now"             , TG.Second,  0, "ş?imdi|şu(\\s)?an"                                )
+  , ( "today"           , TG.Day   ,  0, "bugün"                                                         )
+  , ( "tomorrow"        , TG.Day   ,  1, "yarın"                                                         )
+  , ( "yesterday"       , TG.Day   , -1, "dün"                                                           )
+  , ( "after tomorrow"  , TG.Day   ,  2, "(yarından\\ssonraki)\\s?(gün)?"                                 )
+  , ( "before yesterday", TG.Day   , -2, "(dün\\sdeğil\\sevvelsi|dünden\\sönceki|öbürsü|öbürki)\\s(gün)?")
+  , ( "EOM|End of day",   TG.Day ,    1, "gün\\s(sonu(na|ndan?)?|bitimi(ne|nden?)?)?"                    )
+  , ( "EOM|End of month", TG.Month ,  1, "ay\\s(sonu(na|ndan?)?|bitimi(ne|nden?)?)?"                     )
+  , ( "EOY|End of year" , TG.Year  ,  1, "yıl\\s(sonu(na|ndan?)?|bitimi(ne|nden?)?)?"                    )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
+  [ ( "Pazartesi", "pazartesi'?(si|den|ye)?|pzts?")
+  , ( "Salı"     , "salı?'?(sı|dan|ya)?"          )
+  , ( "Çarşamba" , "çar(şamba)?'?(sı|dan|ya)?"    )
+  , ( "Perşembe" , "per(şembe)?'?(si|den|ye)?"    )
+  , ( "Cuma"     , "cuma?'?(sı|dan|ya)?"          )
+  , ( "Cumartesi", "cumartesi'?(si|den|ye)?|cmt"  )
+  , ( "Pazar"    , "paz(ar)?'?(ı|dan|a)?"         )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = mkRuleMonths
+  [ ( "Ocak"   , "ocak?'?(ğın|tan|ğ?a)?"    )
+  , ( "Şubat"  , "şub(at)?'?(a|ın|tan)?"    )
+  , ( "Mart"   , "mart?'?(ın|a|tan)?"       )
+  , ( "Nisan"  , "nis(an)?'?(ın|a|dan)?"    )
+  , ( "Mayıs"  , "may(ıs)?'?(ın|a|tan)?"    )
+  , ( "Haziran", "haz(iran)?'?(ın|a|dan)?"  )
+  , ( "Temmuz" , "tem(muz)?'?(un|a|dan)?"   )
+  , ( "Ağustos", "ağu(stos)?'?(un|a|tan)?"  )
+  , ( "Eylül"  , "eyl(ül)?'?(ün|e|den)?"    )
+  , ( "Ekim"   , "ekim?'?(in|den|e)?"       )
+  , ( "Kasım"  , "kas(ım)?'?(ın|dan|a)?"    )
+  , ( "Aralık" , "ara(lık?)?'?(ğın|ğa|tan)?")
+  ]
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "yaz",      "yaz(ın|a|dan)?",      monthDay 6  21, monthDay 9  23 )
+  , ( "sonbahar", "sonbahar(ın|a|dan)?", monthDay 9  23, monthDay 12 21 )
+  , ( "kış",      "kış(ın|a|tan)?",      monthDay 12 21, monthDay 3  20 )
+  , ( "ilkbahar", "ilkbahar(ın|a|dan)?", monthDay 3  20, monthDay 6  21 )
+  ]
+
+ruleHolidays :: [Rule]
+ruleHolidays = mkRuleHolidays
+  [ ( "Yılbaşı"                                , "yılbaşı(ndan|na)?|yılbaşı(\\statili(nden|ne))?"                   , monthDay 1   1  )
+  , ( "Ulusal Egemenlik ve Çocuk Bayramı"      , "(ulusal\\segemenlik\\sve\\s)?çocuk\\sbayramı"                     , monthDay 4   23 )
+  , ( "Emek ve Dayanışma Günü"                 , "emek\\sve\\sdayanışma\\sgünü"                                     , monthDay 5   1  )
+  , ( "Atatürk’ü Anma, Gençlik ve Spor Bayramı", "(gençlik\\sve\\sspor|spor|gençlik)\\sbayramı"                     , monthDay 5   19 )
+  , ( "Zafer Bayramı"                          , "zafer\\sbayramı"                                                  , monthDay 8   30 )
+  , ( "Cumhuriyet Bayramı"                     , "cumhuriyet\\sbayramı"                                             , monthDay 10  29 )
+  ]
+
+ruleComputedHolidays:: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ("Kurban Bayramı",  "kurban\\sbayramı",  eidalAdha)
+  , ("Ramazan Bayramı", "ramazan\\sbayramı", eidalFitr)
+  ]
+
+rulePartOfDays :: Rule
+rulePartOfDays = Rule
+  { name = "part of days"
+  , pattern =
+    [ regex "(sabahı?|öğlen?|akşam|gece|öğle\\syemeği)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let (start, end) = case Text.toLower match of
+              "sabah"          -> (hour False 0, hour False 12 )
+              "sabahı"         -> (hour False 0, hour False 12 )
+              "akşam"          -> (hour False 18, hour False 0 )
+              "gece"           -> (hour False 18, hour False 0 )
+              "öğlen"          -> (hour False 12, hour False 14)
+              "öğle"           -> (hour False 12, hour False 14)
+              "öğle yemeği"    -> (hour False 12, hour False 14)
+              _          -> (hour False 12, hour False 19)
+        td <- interval TTime.Open start end
+        tt $ partOfDay $ mkLatent td
+      _ -> Nothing
+  }
+
+rulePrecisionTOD :: Rule
+rulePrecisionTOD = Rule
+  { name = "about|exactly <time-of-day>"
+  , pattern =
+    [ Predicate $ isGrainFinerThan TG.Year
+    , regex "gibi|civarı(nda)?"
+    ]
+  , prod = \case
+      (Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+rulePrecisionTOD2 :: Rule
+rulePrecisionTOD2 = Rule
+  { name = "about|exactly <time-of-day>"
+  , pattern =
+    [ regex "yaklaşık|tam(\\solarak)?"
+    , Predicate $ isGrainFinerThan TG.Year
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleDatetimeDatetimeInterval :: Rule
+ruleDatetimeDatetimeInterval = Rule
+  { name = "<datetime> - <datetime> (interval)"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "\\-"
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleDateDateInterval :: Rule
+ruleDateDateInterval = Rule
+  { name = "dd.(mm.)? - dd.mm.(yy[yy]?)? (interval)"
+  , pattern =
+    [ regex "(?:с\\s+)?(10|20|30|31|[012]?[1-9])\\.?((?<=\\.)(?:10|11|12|0?[1-9])(?:\\.?))?"
+    , regex "\\-|/"
+    , regex "(10|20|30|31|[012]?[1-9])\\.(10|11|12|0?[1-9])\\.?((?<=\\.)\\d{2,4})?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (d1:"":_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:"":_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m2 <- parseInt m2
+          Token Time <$> interval TTime.Closed (monthDay m2 d1) (monthDay m2 d2)
+      (Token RegexMatch (GroupMatch (d1:"":_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:y:_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m2 <- parseInt m2
+          y <- parseInt y
+          Token Time <$> interval TTime.Closed (yearMonthDay y m2 d1) (yearMonthDay y m2 d2)
+      (Token RegexMatch (GroupMatch (d1:m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:"":_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m1 <- parseInt m1
+          m2 <- parseInt m2
+          Token Time <$> interval TTime.Closed (monthDay m1 d1) (monthDay m2 d2)
+      (Token RegexMatch (GroupMatch (d1:m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:y:_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m1 <- parseInt m1
+          m2 <- parseInt m2
+          y <- parseInt y
+          Token Time <$> interval TTime.Closed (yearMonthDay y m1 d1) (yearMonthDay y m2 d2)
+      _ -> Nothing
+  }
+
+ruleInDuration :: Rule
+ruleInDuration = Rule
+  { name = "in <duration>"
+  , pattern =
+    [ dimension Duration
+    , regex "içinde|içerisinde"
+    ]
+  , prod = \case
+      (Token Duration dd:_) ->
+        tt $ inDuration dd
+      _ -> Nothing
+  }
+
+ruleDurationHence :: Rule
+ruleDurationHence = Rule
+  { name = "<duration> hence"
+  , pattern =
+    [ dimension Duration
+    , regex "sonra"
+    ]
+  , prod = \case
+      (Token Duration dd:_) ->
+        tt $ inDuration dd
+      _ -> Nothing
+  }
+
+ruleDurationFromNow :: Rule
+ruleDurationFromNow = Rule
+  { name = "<duration> from now"
+  , pattern =
+    [ regex "(bugünden\\s)?sonra(ki)?"
+    ,  dimension Duration
+    ]
+  , prod = \case
+      (_:Token Duration dd:_) ->
+        tt $ inDuration dd
+      _ -> Nothing
+  }
+
+
+ruleLastCycleOfTime :: Rule
+ruleLastCycleOfTime = Rule
+  { name = "last <cycle> of <time>"
+  , pattern =
+    [ dimension Time
+    , regex "son"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token Time td:_:Token TimeGrain grain:_) ->
+        tt $ cycleLastOf grain td
+      _ -> Nothing
+  }
+
+ruleYearLatent2 :: Rule
+ruleYearLatent2 = Rule
+  { name = "year (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 2101 10000
+    ]
+  , prod = \case
+      (token:_) -> do
+        v <- getIntValue token
+        tt $ mkLatent $ year v
+      _ -> Nothing
+  }
+
+ruleTimeAfterNext :: Rule
+ruleTimeAfterNext = Rule
+  { name = "<time> after next"
+  , pattern =
+    [ regex "sonraki|önümüzdeki"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) ->
+        tt $ predNth 1 True td
+      _ -> Nothing
+  }
+
+ruleNoon :: Rule
+ruleNoon = Rule
+  { name = "noon"
+  , pattern =
+    [ regex "öğle(n|den|ye)?"
+    ]
+  , prod = \_ -> tt $ hour False 12
+  }
+
+ruleThisnextDayofweek :: Rule
+ruleThisnextDayofweek = Rule
+  { name = "this|next <day-of-week>"
+  , pattern =
+    [ regex "bu|sonraki"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (_:Token Time td:_) ->
+        tt $ predNth 0 True td
+      _ -> Nothing
+  }
+
+ruleBetweenTimeofdayAndTimeofdayInterval :: Rule
+ruleBetweenTimeofdayAndTimeofdayInterval = Rule
+  { name = "between <time-of-day> and <time-of-day> (interval)"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "ile"
+    , Predicate isATimeOfDay
+    , regex "arası"
+    ]
+  , prod = \case
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleNextCycle :: Rule
+ruleNextCycle = Rule
+  { name = "next <cycle>"
+  , pattern =
+    [ regex "sonraki|önümüzdeki|gelecek"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 1
+      _ -> Nothing
+  }
+
+ruleLastCycle :: Rule
+ruleLastCycle = Rule
+  { name = "last <cycle>"
+  , pattern =
+    [ regex "son|geçen|geçtiğimiz|önceki"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain (-1)
+      _ -> Nothing
+  }
+
+ruleLunch :: Rule
+ruleLunch = Rule
+  { name = "lunch"
+  , pattern =
+    [ regex "öğlen? (yemeği|arası)"
+    ]
+  , prod = \_ ->
+      let from = hour False 12
+          to = hour False 14
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleAfternoon :: Rule
+ruleAfternoon = Rule
+  { name = "afternoon"
+  , pattern =
+    [ regex "öğleden sonra"
+    ]
+  , prod = \_ ->
+      let from = hour False 12
+          to = hour False 19
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleEvening :: Rule
+ruleEvening = Rule
+  { name = "evening"
+  , pattern =
+    [ regex "akşam(a|dan)?"
+    ]
+  , prod = \_ ->
+      let from = hour False 18
+          to = hour False 0
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleHourofdayIntegerAsRelativeMinutes :: Rule
+ruleHourofdayIntegerAsRelativeMinutes = Rule
+  { name = "<hour-of-day> <integer> (as relative minutes)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
+    , Predicate $ isIntegerBetween 1 59
+    ]
+  , prod = \case
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute is12H hours n
+      _ -> Nothing
+  }
+
+ruleDayofmonthordinalNamedmonth :: Rule
+ruleDayofmonthordinalNamedmonth = Rule
+  { name = "<day-of-month>(ordinal) <named-month>"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleIntervalBy :: Rule
+ruleIntervalBy = Rule
+  { name = "by <time>"
+  , pattern =
+    [ dimension Time
+    ,  regex "kadar"
+    ]
+  , prod = \case
+      (Token Time td:_) -> Token Time <$> interval TTime.Open now td
+      _ -> Nothing
+  }
+
+ruleIntersectBy :: Rule
+ruleIntersectBy = Rule
+  { name = "intersect by ','"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex ","
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleNthTimeAfterTime :: Rule
+ruleNthTimeAfterTime = Rule
+  { name = "nth <time> after <time>"
+  , pattern =
+    [ dimension Time
+    , regex "sonra(ki)?"
+    , dimension Ordinal
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time td1:
+       _:
+       Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td2:
+       _) -> tt $ predNthAfter (v - 1) td1 td2
+      _ -> Nothing
+  }
+
+ruleMmdd :: Rule
+ruleMmdd = Rule
+  { name = "mm/dd"
+  , pattern =
+    [ regex "([012]?[1-9]|10|20|30|31)\\.(10|11|12|0?[1-9])\\.?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        d <- parseInt m1
+        m <- parseInt m2
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleTimeofdayLatent :: Rule
+ruleTimeofdayLatent = Rule
+  { name = "time-of-day (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 0 23
+    ]
+  , prod = \case
+      (token:_) -> do
+        n <- getIntValue token
+        tt $ mkLatent $ hour (n < 12) n
+      _ -> Nothing
+  }
+
+ruleDurationAgo :: Rule
+ruleDurationAgo = Rule
+  { name = "<duration> ago"
+  , pattern =
+    [ dimension Duration
+    , regex "önce"
+    ]
+  , prod = \case
+      (Token Duration dd:_:_) ->
+        tt $ durationAgo dd
+      _ -> Nothing
+  }
+
+ruleIdesOfMonth :: Rule
+ruleIdesOfMonth = Rule
+  { name = "the ides of <named-month>"
+  , pattern =
+    [ Predicate isAMonth
+    , regex "ortası"
+    ]
+  , prod = \case
+      (Token Time td@TimeData {TTime.form = Just (TTime.Month m)}:_) ->
+        Token Time <$>
+          intersect td (dayOfMonth $ if elem m [3, 5, 7, 10] then 15 else 13)
+      _ -> Nothing
+  }
+
+ruleLastNCycle :: Rule
+ruleLastNCycle = Rule
+  { name = "last n <cycle>"
+  , pattern =
+    [ regex "son|geçen|geçtiğimiz|önceki"
+    , Predicate $ isIntegerBetween 1 9999
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:token:Token TimeGrain grain:_) -> do
+        n <- getIntValue token
+        tt $ cycleN True grain (- n)
+      _ -> Nothing
+  }
+
+ruleMidnighteodendOfDay :: Rule
+ruleMidnighteodendOfDay = Rule
+  { name = "midnight|EOD|end of day"
+  , pattern =
+    [ regex "gece\\syarısı|gün\\ssonu|gün\\sbitimi"
+    ]
+  , prod = \_ -> tt $ hour False 0
+  }
+
+ruleDayofmonthNonOrdinalNamedmonth :: Rule
+ruleDayofmonthNonOrdinalNamedmonth = Rule
+  { name = "<day-of-month> (non ordinal) <named-month>"
+  , pattern =
+    [ Predicate isDOMInteger
+    , Predicate isAMonth
+    ]
+  , prod = \case
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate isNotLatent
+    , Predicate isNotLatent
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleUntilTimeofday :: Rule
+ruleUntilTimeofday = Rule
+  { name = "until <time-of-day>"
+  , pattern =
+    [ dimension Time
+    , regex "kadar"
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ withDirection TTime.Before td
+      _ -> Nothing
+  }
+
+ruleAtTimeofday :: Rule
+ruleAtTimeofday = Rule
+  { name = "at <time-of-day>"
+  , pattern =
+    [ regex "saat"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleAtTimeofday2 :: Rule
+ruleAtTimeofday2 = Rule
+  { name = "at <time-of-day>"
+  , pattern =
+    [ regex "saat"
+    , Predicate isATimeOfDay
+    , regex "'?(den|dan)?"
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime :: Rule
+ruleNthTimeOfTime = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Time
+    , dimension Ordinal
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time td1:
+       Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td2:
+       _) -> Token Time . predNth (v - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleTimePartofday :: Rule
+ruleTimePartofday = Rule
+  { name = "<time> <part-of-day>"
+  , pattern =
+    [ dimension Time
+    , Predicate isAPartOfDay
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleWeek :: Rule
+ruleWeek = Rule
+ { name = "week"
+ , pattern =
+   [ regex "((bu\\s)?hafta boyunca)|(bu hafta)|(haftanın geri kalanı)"
+   ]
+ , prod = \case
+     (Token RegexMatch (GroupMatch (match:_)):_) ->
+       let end = cycleNthAfter True TG.Day (-2) $ cycleNth TG.Week 1
+           period = case Text.toLower match of
+                      "hafta boyunca" -> interval Closed (cycleNth TG.Week 0) end
+                      "haftanın geri kalanı" -> interval Open today end
+                      "bu hafta" -> interval Open today end
+                      _ -> Nothing
+       in case Text.toLower match of
+         "bu hafta" -> Token Time . mkLatent <$> period
+         _ -> Token Time <$> period
+     _ -> Nothing
+ }
+
+
+ruleWeekend :: Rule
+ruleWeekend = Rule
+  { name = "week-end"
+  , pattern =
+    [ regex "hafta sonu"
+    ]
+  , prod = \_ -> tt $ mkOkForThisNext weekend
+  }
+
+ruleOrdinalQuarterYear :: Rule
+ruleOrdinalQuarterYear = Rule
+  { name = "<ordinal> quarter <year>"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Ordinal od:_:Token Time td:_) ->
+        tt $ cycleNthAfter False TG.Quarter (TOrdinal.value od - 1) td
+      _ -> Nothing
+  }
+
+ruleYyyymmdd :: Rule
+ruleYyyymmdd = Rule
+  { name = "yyyy-mm-dd"
+  , pattern =
+    [ regex "(\\d{2,4})-(0?[1-9]|10|11|12)-([012]?[1-9]|10|20|30|31)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
+        y <- parseInt m1
+        m <- parseInt m2
+        d <- parseInt m3
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleNextNCycle :: Rule
+ruleNextNCycle = Rule
+  { name = "next n <cycle>"
+  , pattern =
+    [ regex "önümüzdeki|sonraki"
+    , Predicate $ isIntegerBetween 1 9999
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:token:Token TimeGrain grain:_) -> do
+        v <- getIntValue token
+        tt $ cycleN True grain v
+      _ -> Nothing
+  }
+
+ruleMorning :: Rule
+ruleMorning = Rule
+  { name = "morning"
+  , pattern =
+    [ regex "sabah(ı|a|tan)?"
+    ]
+  , prod = \_ ->
+      let from = hour False 3
+          to = hour False 12
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleThisPartofday :: Rule
+ruleThisPartofday = Rule
+  { name = "this <part-of-day>"
+  , pattern =
+    [ regex "bu"
+    , Predicate isAPartOfDay
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
+      _ -> Nothing
+  }
+
+ruleThisCycle :: Rule
+ruleThisCycle = Rule
+  { name = "this <cycle>"
+  , pattern =
+    [ regex "bu"
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 0
+      _ -> Nothing
+  }
+ruleThisTime :: Rule
+ruleThisTime = Rule
+  { name = "this <time>"
+  , pattern =
+    [ regex "bu"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 0 False td
+      _ -> Nothing
+  }
+
+ruleNextTime :: Rule
+ruleNextTime = Rule
+  { name = "next <time>"
+  , pattern =
+    [ regex "önümüzdeki|gelecek|sonraki"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth 0 True td
+      _ -> Nothing
+  }
+
+ruleLastTime :: Rule
+ruleLastTime = Rule
+  { name = "last <time>"
+  , pattern =
+    [ regex "geçen|önceki|geçtiğimiz|son"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ predNth (- 1) False td
+      _ -> Nothing
+  }
+
+ruleYearLatent :: Rule
+ruleYearLatent = Rule
+  { name = "year (latent)"
+  , pattern =
+    [ Predicate $
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
+    ]
+  , prod = \case
+      (token:_) -> do
+        y <- getIntValue token
+        tt $ mkLatent $ year y
+      _ -> Nothing
+  }
+
+ruleAfterTimeofday :: Rule
+ruleAfterTimeofday = Rule
+  { name = "after <time-of-day>"
+  , pattern =
+    [ regex "sonraki|önümüzdeki"
+    , dimension Time
+    ]
+  , prod = \case
+      (_:Token Time td:_) -> tt $ withDirection TTime.After td
+      _ -> Nothing
+  }
+
+ruleNight :: Rule
+ruleNight = Rule
+  { name = "night"
+  , pattern =
+    [ regex "gece(ye|den)?"
+    ]
+  , prod = \_ ->
+      let from = hour False 0
+          to = hour False 4
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleDayofmonthOrdinal :: Rule
+ruleDayofmonthOrdinal = Rule
+  { name = "<day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:_) ->
+        tt $ dayOfMonth v
+      _ -> Nothing
+  }
+
+ruleOrdinalCycleOfTime :: Rule
+ruleOrdinalCycleOfTime = Rule
+  { name = "<ordinal> <cycle> of <time>"
+  , pattern =
+    [ dimension Time
+    , dimension Ordinal
+    , dimension TimeGrain
+    ]
+  , prod = \case
+      (Token Time td:Token Ordinal od:Token TimeGrain grain:_) ->
+        tt $ cycleNthAfter True grain (TOrdinal.value od - 1) td
+      _ -> Nothing
+  }
+
+ruleHhmm :: Rule
+ruleHhmm = Rule
+  { name = "hh:mm"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))[:.ч]([0-5]\\d)(?:час(ов|а|у)?|ч)?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        h <- parseInt m1
+        m <- parseInt m2
+        tt $ hourMinute False h m
+      _ -> Nothing
+  }
+
+ruleYear :: Rule
+ruleYear = Rule
+  { name = "year"
+  , pattern =
+    [ Predicate $ isIntegerBetween 1000 2100
+    ]
+  , prod = \case
+      (token:_) -> do
+        y <- getIntValue token
+        tt $ year y
+      _ -> Nothing
+  }
+
+ruleNamedmonthDayofmonthNonOrdinal :: Rule
+ruleNamedmonthDayofmonthNonOrdinal = Rule
+  { name = "<named-month> <day-of-month> (non ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMInteger
+    ]
+  , prod = \case
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleHhmmMilitary :: Rule
+ruleHhmmMilitary = Rule
+  { name = "hhmm (military)"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))([0-5]\\d)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
+        hh <- parseInt h
+        mm <- parseInt m
+        tt $ mkLatent $ hourMinute False hh mm
+      _ -> Nothing
+  }
+
+ruleAbsorptionOfAfterNamedDay :: Rule
+ruleAbsorptionOfAfterNamedDay = Rule
+  { name = "absorption of , after named day"
+  , pattern =
+    [ Predicate isADayOfWeek
+    , regex ","
+    ]
+  , prod = \case
+      (x:_) -> Just x
+      _ -> Nothing
+  }
+
+ruleLastDayofweekOfTime :: Rule
+ruleLastDayofweekOfTime = Rule
+  { name = "last <day-of-week> of <time>"
+  , pattern =
+    [ dimension Time
+    , regex "son"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \case
+      (
+        Token Time td1:
+        _:
+        Token Time td2:
+        _) -> tt $ predLastOf td1 td2
+      _ -> Nothing
+  }
+
+ruleTimeofdayTimeofdayInterval :: Rule
+ruleTimeofdayTimeofdayInterval = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "\\-"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleTimeofdayTimeofdayInterval2 :: Rule
+ruleTimeofdayTimeofdayInterval2 = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "\\-|/"
+    , Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleIntervalForDurationFrom :: Rule
+ruleIntervalForDurationFrom = Rule
+  { name = "for <duration> from <time>"
+  , pattern =
+    [ dimension Time
+    , regex "itibaren"
+    , dimension Duration
+    , regex "boyunca|süresince"
+    ]
+  , prod = \case
+      (Token Time td1:_:Token Duration dd:_) ->
+        Token Time <$> interval TTime.Closed td1 (durationAfter dd td1)
+      _ -> Nothing
+}
+
+ruleDurationAfterTime :: Rule
+ruleDurationAfterTime = Rule
+  { name = "<duration> after <time>"
+  , pattern =
+    [ dimension Time
+    , regex "sonra(ki)?"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Time td:_:Token Duration dd:_) ->
+        tt $ durationAfter dd td
+      _ -> Nothing
+  }
+
+ruleDurationAfterTime2 :: Rule
+ruleDurationAfterTime2 = Rule
+  { name = "<duration> after <time>"
+  , pattern =
+    [ dimension Time
+    , dimension Duration
+    , regex "sonra"
+    ]
+  , prod = \case
+      (Token Time td:Token Duration dd:_:_) ->
+        tt $ durationAfter dd td
+      _ -> Nothing
+  }
+
+ruleOrdinalQuarter :: Rule
+ruleOrdinalQuarter = Rule
+  { name = "<ordinal> quarter"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    ]
+  , prod = \case
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:_) ->
+        tt $ cycleNthAfter False TG.Quarter (v - 1) $ cycleNth TG.Year 0
+      _ -> Nothing
+  }
+
+ruleDurationBeforeTime :: Rule
+ruleDurationBeforeTime = Rule
+  { name = "<duration> before <time>"
+  , pattern =
+    [ dimension Time
+    , regex "önceki"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Time td:_:Token Duration dd:_) ->
+        tt $ durationBefore dd td
+      _ -> Nothing
+  }
+
+rulePartofdayOfTime :: Rule
+rulePartofdayOfTime = Rule
+  { name = "<part-of-day> of <time>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , dimension Time
+    ]
+  , prod = \case
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleMmddyyyy :: Rule
+ruleMmddyyyy = Rule
+  { name = "mm/dd/yyyy"
+  , pattern =
+    [ regex "([012]?[1-9]|10|20|30|31)\\.(0?[1-9]|10|11|12)\\.(\\d{2,4})"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
+        y <- parseInt m3
+        m <- parseInt m2
+        d <- parseInt m1
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleTimezone :: Rule
+ruleTimezone = Rule
+  { name = "<time> timezone"
+  , pattern =
+    [ 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 = \case
+      (Token Time td:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> Token Time <$> inTimezone (Text.toUpper tz) td
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ruleAbsorptionOfAfterNamedDay
+  , ruleAfterTimeofday
+  , ruleAfternoon
+  , ruleAtTimeofday
+  , ruleAtTimeofday2
+  , ruleBetweenTimeofdayAndTimeofdayInterval
+  , ruleDatetimeDatetimeInterval
+  , ruleDateDateInterval
+  , ruleDayofmonthNonOrdinalNamedmonth
+  , ruleDayofmonthOrdinal
+  , ruleDayofmonthordinalNamedmonth
+  , ruleDurationAfterTime
+  , ruleDurationAfterTime2
+  , ruleIntervalForDurationFrom
+  , ruleDurationAgo
+  , ruleDurationBeforeTime
+  , ruleEvening
+  , ruleHhmm
+  , ruleHhmmMilitary
+  , ruleHourofdayIntegerAsRelativeMinutes
+  , ruleIdesOfMonth
+  , ruleInDuration
+  , ruleIntervalBy
+  , ruleDurationHence
+  , ruleDurationFromNow
+  , ruleIntersect
+  , ruleIntersectBy
+  , ruleLastCycle
+  , ruleLastCycleOfTime
+  , ruleLastDayofweekOfTime
+  , ruleLastNCycle
+  , ruleLastTime
+  , ruleThisTime
+  , ruleNextTime
+  , ruleLunch
+  , ruleMidnighteodendOfDay
+  , ruleMmdd
+  , ruleMmddyyyy
+  , ruleMorning
+  , ruleNamedmonthDayofmonthNonOrdinal
+  , ruleNextCycle
+  , ruleNextNCycle
+  , ruleNight
+  , ruleNoon
+  , ruleNthTimeAfterTime
+  , ruleNthTimeOfTime
+  , ruleOrdinalCycleOfTime
+  , ruleOrdinalQuarter
+  , ruleOrdinalQuarterYear
+  , rulePartOfDays
+  , rulePartofdayOfTime
+  , rulePrecisionTOD
+  , rulePrecisionTOD2
+  , ruleThisCycle
+  , ruleThisPartofday
+  , ruleThisTime
+  , ruleThisnextDayofweek
+  , ruleTimeAfterNext
+  , ruleTimePartofday
+  , ruleTimeofdayLatent
+  , ruleTimeofdayTimeofdayInterval
+  , ruleTimeofdayTimeofdayInterval2
+  , ruleUntilTimeofday
+  , ruleWeek
+  , ruleWeekend
+  , ruleYear
+  , ruleYearLatent
+  , ruleYearLatent2
+  , ruleYyyymmdd
+  , ruleTimezone
+  ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
+  ++ ruleSeasons
+  ++ ruleHolidays
+  ++ ruleComputedHolidays
diff --git a/Duckling/Time/TimeZone/Parse.hs b/Duckling/Time/TimeZone/Parse.hs
--- a/Duckling/Time/TimeZone/Parse.hs
+++ b/Duckling/Time/TimeZone/Parse.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -113,7 +112,7 @@
   , ( "KRAST", TimeZone 480 True "KRAST" )
   , ( "KGT", TimeZone 360 False "KGT" )
   , ( "JST", TimeZone 540 False "JST" )
-  , ( "IST", TimeZone 120 False "IST" )
+  , ( "IST", TimeZone 330 False "IST" )
   , ( "IRST", TimeZone 210 False "IRST" )
   , ( "IRKT", TimeZone 480 False "IRKT" )
   , ( "IRKST", TimeZone 540 True "IRKST" )
@@ -159,12 +158,12 @@
   , ( "CHADT", TimeZone 825 True "CHADT" )
   , ( "CET", TimeZone 60 False "CET" )
   , ( "CEST", TimeZone 120 True "CEST" )
-  , ( "CDT", TimeZone 540 True "CDT" )
+  , ( "CDT", TimeZone (-300) True "CDT" )
   , ( "CCT", TimeZone 390 False "CCT" )
   , ( "CAT", TimeZone 120 False "CAT" )
   , ( "CAST", TimeZone 180 True "CAST" )
   , ( "BTT", TimeZone 360 False "BTT" )
-  , ( "BST", TimeZone (-660) False "BST" )
+  , ( "BST", TimeZone 60 False "BST" )
   , ( "BRT", TimeZone (-180) False "BRT" )
   , ( "BRST", TimeZone (-120) True "BRST" )
   , ( "BOT", TimeZone (-240) False "BOT" )
diff --git a/Duckling/Time/Types.hs b/Duckling/Time/Types.hs
--- a/Duckling/Time/Types.hs
+++ b/Duckling/Time/Types.hs
@@ -2,8 +2,8 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
+{- HLINT ignore "Use foldr1OrError" -}
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -65,18 +65,19 @@
   , direction :: Maybe IntervalDirection
   , okForThisNext :: Bool -- allows specific this+Time
   , holiday :: Maybe Text
+  , hasTimezone :: Bool -- hack to prevent double timezone parsing
   }
 
 instance Eq TimeData where
-  (==) (TimeData _ l1 g1 n1 f1 d1 _ _) (TimeData _ l2 g2 n2 f2 d2 _ _) =
-    l1 == l2 && g1 == g2 && n1 == n2 && f1 == f2 && d1 == d2
+  (==) (TimeData _ l1 g1 n1 f1 d1 _ _ t1) (TimeData _ l2 g2 n2 f2 d2 _ _ t2) =
+    l1 == l2 && g1 == g2 && n1 == n2 && f1 == f2 && d1 == d2 && t1 == t2
 
 instance Hashable TimeData where
-  hashWithSalt s (TimeData _ latent grain imm form dir _ _) = hashWithSalt s
+  hashWithSalt s (TimeData _ latent grain imm form dir _ _ _) = hashWithSalt s
     (0::Int, (latent, grain, imm, form, dir))
 
 instance Ord TimeData where
-  compare (TimeData _ l1 g1 n1 f1 d1 _ _) (TimeData _ l2 g2 n2 f2 d2 _ _) =
+  compare (TimeData _ l1 g1 n1 f1 d1 _ _ _) (TimeData _ l2 g2 n2 f2 d2 _ _ _) =
     case compare g1 g2 of
       EQ -> case compare f1 f2 of
         EQ -> case compare l1 l2 of
@@ -88,13 +89,14 @@
       z -> z
 
 instance Show TimeData where
-  show (TimeData _ latent grain _ form dir _ holiday) =
+  show (TimeData _ latent grain _ form dir _ holiday tz) =
     "TimeData{" ++
     "latent=" ++ show latent ++
     ", grain=" ++ show grain ++
     ", form=" ++ show form ++
     ", direction=" ++ show dir ++
     ", holiday=" ++ show holiday ++
+    ", hasTimezone=" ++ show tz ++
     "}"
 
 instance NFData TimeData where
@@ -109,7 +111,7 @@
       ahead:nextAhead:_
         | notImmediate && isJust (timeIntersect ahead refTime) -> Just nextAhead
       ahead:_ -> Just ahead
-    values <- Just . take 3 $ if List.null future then past else future
+    values <- Just $ take 3 $ if List.null future then past else future
     Just $ case direction of
       Nothing -> (TimeValue (timeValue tzSeries value)
         (map (timeValue tzSeries) values) holiday, latent)
@@ -140,6 +142,7 @@
   , direction = Nothing
   , okForThisNext = False
   , holiday = Nothing
+  , hasTimezone = False
   }
 
 data TimeContext = TimeContext
@@ -238,7 +241,6 @@
   | ReplaceIntersectPredicate Predicate Predicate Predicate
   deriving Show
 
-{-# ANN runPredicate ("HLint: ignore Use foldr1OrError" :: String) #-}
 runPredicate :: Predicate -> SeriesPredicate
 runPredicate EmptyPredicate{} = \_ _ -> ([], [])
 runPredicate (SeriesPredicate (NoShow p)) = p
@@ -427,6 +429,21 @@
       | dow == 7 = (Time.addDays (-2) d, 5)
       | otherwise = (Time.addDays (-1) d, dow-1)
 
+-- Predicate for periodic events with known `given`
+periodicPredicate :: TG.Grain -> Int -> TimeObject -> Predicate
+periodicPredicate grain delta given = mkSeriesPredicate series
+  where
+  series t _ = (past', future')
+    where
+    (past, future) = timeSequence grain delta given
+    (past', future') = if timeBefore t given
+      then
+        let (newer, older) = span (timeBefore t) past
+        in (older, reverse newer ++ future)
+      else
+        let (older, newer) = span (`timeBefore` t) future
+        in (reverse older ++ past, newer)
+
 toMidnight :: Time.Day -> Time.UTCTime
 toMidnight = flip Time.UTCTime (Time.timeOfDayToTime Time.midnight)
 
@@ -815,13 +832,21 @@
   deriving (Eq, Show)
 
 timeInterval :: TimeIntervalType -> TimeObject -> TimeObject -> TimeObject
-timeInterval intervalType t1 t2 = TimeObject
-  { start = start t1
-  , grain = min (grain t1) (grain t2)
+timeInterval
+  intervalType
+  TimeObject{start = s1, grain = g1}
+  TimeObject{start = s2, end = e2, grain = g2} = TimeObject
+  { start = s1
+  , grain = g'
   , end = Just $ case intervalType of
-                   Open -> start t2
-                   Closed -> timeEnd t2
+      Open -> s2
+      Closed -> fromMaybe (TG.add s2 g2' 1) e2
   }
+  where
+    g' = min g1 g2
+    g2'
+      | g1 < TG.Day && g2 < TG.Day = g'
+      | otherwise = g2
 
 timeStartsBeforeTheEndOf :: TimeObject -> TimeObject -> Bool
 timeStartsBeforeTheEndOf t1 t2 = start t1 < timeEnd t2
diff --git a/Duckling/Time/UK/Corpus.hs b/Duckling/Time/UK/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/UK/Corpus.hs
@@ -0,0 +1,527 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.UK.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Data.String
+import Prelude
+
+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)
+
+context :: Context
+context = testContext {locale = makeLocale UK Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (context, testOptions, examples)
+  where
+    examples =
+      [ "1 готель"
+      , "1 пропозиція"
+      , "наступний 5"
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "сьогодні"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "вчора"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "завтра"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "понеділок"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "Понеділок, 18 лютого"
+             , "18 лютого"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "вівторок"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "четвер"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "п'ятниця"
+             ]
+  , examples (datetime (2013, 2, 16, 0, 0, 0) Day)
+             [ "субота"
+             ]
+  , examples (datetime (2013, 2, 17, 0, 0, 0) Day)
+             [ "неділя"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
+             [ "1 березня"
+             , "перше березня"
+             , "1 бер."
+             ]
+  , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
+             [ "3 березня 2015"
+             , "3 бер. 2015"
+             ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "15 лютого"
+             , "15.2"
+             , "15 Лют"
+             ]
+  , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
+             [ "8 серпня"
+             , "8 Сер"
+             ]
+  , examples (datetime (2014, 10, 0, 0, 0, 0) Month)
+             [ "Жовтень 2014"
+             ]
+  , examples (datetime (2014, 11, 0, 0, 0, 0) Month)
+             [ "Листопад 2014"
+             ]
+  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+             [ "31.10.1974"
+             , "31.10.74"
+             ]
+  , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
+             [ "14 квітня 2015"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "Неділя, 10 лют."
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "Середа, 13 лютого"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "Понеділок, 18 лют"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
+             [ "цей тиждень"
+             ]
+  , examples (datetime (2013, 2, 4, 0, 0, 0) Week)
+             [ "минулий тиждень"
+             , "минулого тижня"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Week)
+             [ "наступний тиждень"
+             , "на наступному тижні"
+             ]
+  , examples (datetime (2013, 1, 0, 0, 0, 0) Month)
+             [ "минулого місяця"
+             ]
+  , examples (datetime (2013, 3, 0, 0, 0, 0) Month)
+             [ "наступного місяця"
+             ]
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
+             [ "цей квартал"
+             ]
+  , examples (datetime (2013, 4, 1, 0, 0, 0) Quarter)
+             [ "наступний квартал"
+             ]
+  , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
+             [ "третій квартал"
+             ]
+  , examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
+             [ "четвертий квартал 2018"
+             ]
+  , examples (datetime (2012, 0, 0, 0, 0, 0) Year)
+             [ "в минулому році"
+             ]
+  , examples (datetime (2013, 0, 0, 0, 0, 0) Year)
+             [ "цей рік"
+             ]
+  , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
+             [ "наступний рік"
+             , "в наступному році"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "минулої неділі"
+             , "в минулу неділю"
+             , "неділю на минулому тижні"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "в минулий вівторок"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "наступного вівторка"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "наступна середа"
+             ]
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
+             [ "середа наступного тижня"
+             , "середу після наступної"
+             ]
+  , examples (datetime (2013, 2, 22, 0, 0, 0) Day)
+             [ "п'ятниця після наступного"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "понеділок цього тижня"
+             ]
+  , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "вівторок цього тижня"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "середа цього тижня"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "післязавтра"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "позавчора"
+             ]
+  , examples (datetime (2013, 3, 25, 0, 0, 0) Day)
+             [ "останній понеділок у березні"
+             ]
+  , examples (datetime (2014, 3, 30, 0, 0, 0) Day)
+             [ "останній неділю в березні 2014"
+             ]
+  , examples (datetime (2013, 10, 3, 0, 0, 0) Day)
+             [ "третій день у жовтні"
+             ]
+  , examples (datetime (2014, 10, 6, 0, 0, 0) Week)
+             [ "перший тиждень у жовтні 2014"
+             ]
+  , examples (datetime (2015, 10, 31, 0, 0, 0) Day)
+             [ "останній день у жовтні 2015"
+             ]
+  , examples (datetime (2014, 9, 22, 0, 0, 0) Week)
+             [ "останній тиждень вересня 2014"
+             ]
+  , examples (datetime (2013, 10, 1, 0, 0, 0) Day)
+             [ "перший вівторок у жовтні"
+             ]
+  , examples (datetime (2014, 9, 16, 0, 0, 0) Day)
+             [ "третій вівторок у вересні 2014"
+             ]
+  , examples (datetime (2014, 10, 1, 0, 0, 0) Day)
+             [ "перша середа жовтня 2014"
+             ]
+  , examples (datetime (2014, 10, 8, 0, 0, 0) Day)
+             [ "друга середа жовтня 2014"
+             ]
+  , examples (datetime (2015, 1, 13, 0, 0, 0) Day)
+             [ "третій вівторок після католицького різдва 2014"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 0, 0) Hour)
+             [ "о 4 ранку"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "о 3"
+             , "3 години"
+             , "о три"
+             ]
+  , examples (datetime (2013, 2, 12, 3, 18, 0) Minute)
+             [ "3:18 ранку"
+             ]
+  , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
+             [ "3:18"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
+             [ "о 3 годині дня"
+             , "о 15"
+             , "о 15 годині"
+             , "15 години"
+             , "о 15ч"
+             ]
+  , examples (datetime (2013, 4, 1, 18, 0, 0) Hour)
+             [ "01.04. о 18 годині"
+             ]
+  , examples (datetime (2013, 2, 13, 17, 0, 0) Hour)
+             [ "о 17 годині завтра"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
+             ["15:15"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
+             [ "8 години вечора"
+             , "сьогодні о 8 вечора"
+             ]
+  , examples (datetime (2013, 2, 12, 20, 0, 0) Minute)
+             [ "сьогодні о 20:00"
+             ]
+  , examples (datetime (2013, 9, 20, 19, 30, 0) Minute)
+             [ "о 19:30 20 вер."
+             ]
+  , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
+             [ "в суботу о 9 годині"
+             ]
+  , examples (datetime (2014, 7, 18, 19, 0, 0) Hour)
+             [ "п'ятниця, 18 липня 2014 7 година вечора"
+             ]
+  , examples (datetime (2014, 7, 18, 0, 0, 0) Day)
+             [ "Пт, 18 липня 2014"
+             , "П'ятниця, 18.07.14"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 30, 1) Second)
+             [ "через 1 секунду"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 31, 0) Second)
+             [ "через 1 хвилину"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 32, 0) Second)
+             [ "через 2 хвилини"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Second)
+             [ "через 60 хвилин"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 0, 0) Second)
+             [ "через 30 хвилин"
+             ]
+  , examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
+             [ "через 1 годину"
+             ]
+  , examples (datetime (2013, 2, 12, 6, 30, 0) Minute)
+             [ "через дві години"
+             ]
+  , examples (datetime (2013, 2, 13, 4, 30, 0) Minute)
+             [ "через 24 години"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "завтра"
+             ]
+  , examples (datetime (2016, 2, 0, 0, 0, 0) Month)
+             [ "через 3 роки"
+             ]
+  , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
+             [ "через 7 днів"
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "через 1 тиждень"
+             ]
+  , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
+             [ "7 днів тому"
+             ]
+  , examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
+             [ "14 днів тому"
+             ]
+  , examples (datetime (2013, 1, 29, 0, 0, 0) Day)
+             [ "два тижні тому"
+             ]
+  , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
+             [ "1 тиждень тому"
+             ]
+  , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
+             [ "три тижні тому"
+             ]
+  , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
+             [ "три місяці тому"
+             ]
+  , examples (datetime (2011, 2, 0, 0, 0, 0) Month)
+             [ "два роки тому"
+             ]
+  , examples (datetime (2014, 1, 7, 0, 0, 0) Day)
+             [ "1 рік після різдва"
+             ]
+  , examples (datetimeInterval ((2013, 6, 1, 0, 0, 0), (2013, 9, 1, 0, 0, 0)) Day)
+             [ "це літо"
+             ]
+  , examples (datetimeInterval ((2013, 3, 1, 0, 0, 0), (2013, 6, 1, 0, 0, 0)) Day)
+             [ "ця весна"
+             ]
+  , examples (datetimeInterval ((2012, 12, 1, 0, 0, 0), (2013, 3, 1, 0, 0, 0)) Day)
+             [ "ця зима"
+             ]
+  , examples (datetimeHoliday (2014, 1, 7, 0, 0, 0) Day "Різдво Христове")
+             [ "різдво"
+             ]
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "Новий рік")
+             [ "Новий рік"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "сьогодні ввечері"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 18, 0, 0), (2013, 2, 14, 0, 0, 0)) Hour)
+             [ "завтра ввечері"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 12, 0, 0), (2013, 2, 13, 14, 0, 0)) Hour)
+             [ "завтра в обід"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "вчора ввечері"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 18, 0, 0), (2013, 2, 18, 0, 0, 0)) Hour)
+             [ "в ці вихідні"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 3, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
+             [ "в понеділок вранці"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 3, 0, 0), (2013, 2, 15, 12, 0, 0)) Hour)
+             [ "вранці 15 лютого"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 29, 58), (2013, 2, 12, 4, 30, 0)) Second)
+             [ "останні 2 секунди"
+             , "останні дві секунди"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 1), (2013, 2, 12, 4, 30, 4)) Second)
+             [ "наступні 3 секунди"
+             , "наступні три секунди"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 28, 0), (2013, 2, 12, 4, 30, 0)) Minute)
+             [ "останні 2 хвилини"
+             , "останні дві хвилини"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 31, 0), (2013, 2, 12, 4, 34, 0)) Minute)
+             [ "наступні 3 хвилини"
+             , "наступні три хвилини"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 5, 0, 0), (2013, 2, 12, 8, 0, 0)) Hour)
+             [ "наступні 3 години"
+             , "наступні три години"
+             ]
+  , examples (datetimeInterval ((2013, 2, 10, 0, 0, 0), (2013, 2, 12, 0, 0, 0)) Day)
+             [ "останні 2 дні"
+             , "останні дві дні"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 0, 0, 0), (2013, 2, 16, 0, 0, 0)) Day)
+             [ "наступні 3 дні"
+             , "наступні три дня"
+             ]
+  , examples (datetimeInterval ((2013, 1, 28, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Week)
+             [ "останні 2 тижні"
+             , "останні два тижні"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 3, 11, 0, 0, 0)) Week)
+             [ "наступні 3 тижні"
+             , "наступні три тижні"
+             ]
+  , examples (datetimeInterval ((2012, 12, 0, 0, 0, 0), (2013, 2, 0, 0, 0, 0)) Month)
+             [ "останні 2 місяці"
+             , "останні два місяці"
+             ]
+  , examples (datetimeInterval ((2013, 3, 0, 0, 0, 0), (2013, 6, 0, 0, 0, 0)) Month)
+             [ "наступні 3 місяці"
+             , "наступні три місяці"
+             ]
+  , examples (datetimeInterval ((2011, 0, 0, 0, 0, 0), (2013, 0, 0, 0, 0, 0)) Year)
+             [ "останні 2 роки"
+             , "останні два роки"
+             ]
+  , examples (datetimeInterval ((2014, 0, 0, 0, 0, 0), (2017, 0, 0, 0, 0, 0)) Year)
+             [ "наступні 3 роки"
+             , "наступні три роки"
+             ]
+  , examples (datetimeInterval ((2013, 7, 13, 0, 0, 0), (2013, 7, 16, 0, 0, 0)) Day)
+             [ "13 - 15 липня"
+             , "з 13 по 15 липня"
+             , "13 липня - 15 липня"
+             ]
+  , examples (datetimeInterval ((2013, 8, 8, 0, 0, 0), (2013, 8, 13, 0, 0, 0)) Day)
+             [ "8 сер - 12 сер"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 9, 30, 0), (2013, 2, 12, 11, 1, 0)) Minute)
+             [ "9:30 - 11:00"
+             ]
+  , examples (datetimeInterval ((2013, 2, 14, 9, 30, 0), (2013, 2, 14, 11, 1, 0)) Minute)
+             [ "в четвер з 9:30 до 11:00"
+             , "Четвер 9:30 - 11:00"
+             , "четвер з 9:30 до 11:00"
+             ]
+  , examples (datetimeInterval ((2013, 2, 14, 9, 0, 0), (2013, 2, 14, 12, 0, 0)) Hour)
+             [ "Четвер вранці з 9 до 11"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 11, 30, 0), (2013, 2, 12, 13, 31, 0)) Minute)
+             [ "11:30-13:30"
+             ]
+  , examples (datetime (2013, 9, 21, 1, 30, 0) Minute)
+             [ "1:30 ночі сб, 21 вер."
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 26, 0, 0, 0)) Second)
+             [ "протягом 2 тижнів"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 2, 12, 14, 0, 0) Hour)
+             [ "до 2 годин дня"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 2, 13, 0, 0, 0) Hour)
+             [ "до кінця дня"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 3, 1, 0, 0, 0) Month)
+             [ "до кінця місяця"
+             ]
+  , examples (datetime (2013, 2, 12, 13, 0, 0) Minute)
+             [ "16:00 CET"
+             ]
+  , examples (datetime (2013, 2, 14, 6, 0, 0) Minute)
+             [ "четвер 8:00 GMT"
+             , "четвер 8:00 gmt"
+             ]
+  , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
+             [ "сьогодні о 14 годині"
+             , "о 2"
+             ]
+  , examples (datetime (2013, 2, 13, 15, 0, 0) Hour)
+             [ "завтра о 15 годині"
+             ]
+  , examples (datetimeOpenInterval After (2013, 2, 12, 14, 0, 0) Hour)
+             [ "після 14 годин"
+             , "після 14ч"
+             , "після 2 годин"
+             ]
+  , examples (datetimeOpenInterval Before (2013, 2, 12, 11, 0, 0) Hour)
+             [ "до 11 години"
+             , "до 11 години ранку"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
+             [ "сьогодні днем"
+             ]
+  , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
+             [ "о 13:30 дня"
+             , "13:30"
+             ]
+  , examples (datetime (2013, 2, 12, 4, 45, 0) Second)
+             [ "через 15 хвилин"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 30, 0) Minute)
+             [ "10:30"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "наступного понеділка"
+             ]
+  , examples (datetime (2013, 12, 10, 0, 0, 0) Day)
+             [ "10.12."
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 18, 30, 0), (2013, 2, 12, 19, 1, 0)) Minute)
+             [ "18:30ч - 19:00ч"
+             , "18:30ч/19:00ч"
+             ]
+  , examples (datetimeInterval ((2013, 10, 14, 0, 0, 0), (2013, 10, 16, 0, 0, 0)) Day)
+             [ "14. - 15.10."
+             , "14 - 15.10."
+             , "14. - 15.10"
+             , "14.10. - 15.10."
+             , "14. - 15.10.2013"
+             , "14./15.10."
+             ]
+  , examples (datetimeInterval ((2018, 10, 14, 0, 0, 0), (2018, 10, 16, 0, 0, 0)) Day)
+             [ "14. - 15.10.18"
+             , "14 - 15.10.18"
+             , "14./15.10.2018"
+             , "з 14.10. - 15.10.2018"
+             , "14.10. по 15.10.2018"
+             , "з 14.10. по 15.10.2018"
+             ]
+  , examples (datetime (2013, 10, 10, 0, 0, 0) Day)
+             ["10.10.2013"
+             ]
+  , examples (datetime (2013, 2, 12, 10, 10, 0) Minute)
+             [ "о 10.10"
+             ]
+  , examples (datetime (2013, 2, 12, 17, 10, 0) Minute)
+             [ "17ч10"
+             ]
+  ]
diff --git a/Duckling/Time/UK/Rules.hs b/Duckling/Time/UK/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/UK/Rules.hs
@@ -0,0 +1,1108 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.UK.Rules
+  ( rules
+  ) where
+
+import Prelude
+import Data.Text (Text)
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Ordinal.Types (OrdinalData(..))
+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
+
+ruleInstants :: [Rule]
+ruleInstants = mkRuleInstants
+  [ ( "зараз"         , TG.Second ,  0, "зараз"                 )
+  , ( "сьогодні"      , TG.Day    ,  0, "сьогодні"              )
+  , ( "завтра"        , TG.Day    ,  1, "завтра"                )
+  , ( "вчора"         , TG.Day    , -1, "вчора"                 )
+  , ( "післязавтра"   , TG.Day    ,  2, "післязавтра"           )
+  , ( "позавчора"     , TG.Day    , -2, "позавчора"             )
+  , ( "Кінець місяця" , TG.Month  ,  1, "(кінець|кінця) місяця" )
+  , ( "Кінець року"   , TG.Year   ,  1, "(кінець|кінця) року"   )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = mkRuleDaysOfWeek
+  [ ( "Понеділок" , "понеділ(ок|ка)|пн" )
+  , ( "Вівторок"  , "вівтор(ок|ка)|вт"  )
+  , ( "Середа"    , "серед(а|у)|ср"     )
+  , ( "Четвер"    , "четвер(га)?|чт"    )
+  , ( "П'ятниця"  , "п'ятниц(я|і|ю)|пт" )
+  , ( "Субота"    , "субот(а|и|у)|сб"   )
+  , ( "Неділя"    , "неділ(я|і|ю)|нд"   )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = mkRuleMonths
+  [ ( "Січень"   , "січ(ень|ня|ні)|січ\\.?"   )
+  , ( "Лютий"    , "лют(ий|ого|ому)|лют\\.?"   )
+  , ( "Березень" , "берез(ень|ня|ні)|бер\\.?" )
+  , ( "Квітень"  , "квіт(ень|ня|ні)|квi\\.?"  )
+  , ( "Травень"  , "трав(ень|ня|ні)|тра\\.?"  )
+  , ( "Червень"  , "черв(ень|ня|ні)|чер\\.?"  )
+  , ( "Липень"   , "лип(ень|ня|ні)|лип\\.?"   )
+  , ( "Серпень"  , "серп(ень|ня|ні)|сер\\.?"  )
+  , ( "Вересень" , "верес(ень|ня|ні)|вер\\.?" )
+  , ( "Жовтень"  , "жовт(ень|ня|ні)|жов\\.?"  )
+  , ( "Листопад" , "листопад(а|і)?|лис\\.?"    )
+  , ( "Грудень"  , "груд(ень|ня|ні)|гру\\.?"  )
+  ]
+
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "літо"  , "літо"  , monthDay  6  1, monthDay  8 31 )
+  , ( "осінь" , "осінь" , monthDay  9  1, monthDay 11 30 )
+  , ( "зима"  , "зима"  , monthDay 12  1, monthDay  2 28 )
+  , ( "весна" , "весна" , monthDay  3  1, monthDay  5 31 )
+  ]
+
+ruleHolidays :: [Rule]
+ruleHolidays = mkRuleHolidays
+  [ ( "Новий рік"                 , "новий рік"
+    , monthDay  1  1 )
+  , ( "Різдво Христове"           , "різдв(о|а)"
+    , monthDay  1  7 )
+  , ( "Міжнародний жіночий день"  , "міжнародний жіночий день"
+    , monthDay  3  8 )
+  , ( "День праці"                , "день праці"
+    , monthDay  5  1 )
+  , ( "День Перемоги"             , "день перемоги"
+    , monthDay  5  9 )
+  , ( "День Конституції"          , "день конституції"
+    , monthDay  6 28 )
+  , ( "День незалежності України" , "день незалежності"
+    , monthDay  8 24 )
+  , ( "День захисника України"    , "день захисника"
+    , monthDay 10 14 )
+  , ( "Католицьке Різдво"         , "католицьк(е|ого) різдв(о|а)"
+    , monthDay 12 25 )
+  ]
+
+ruleLastTime :: Rule
+ruleLastTime = Rule
+  { name = "last <time>"
+  , pattern =
+    [ regex "(в )?минул(ий|а|ого|ому|ої|у)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) ->
+        tt $ predNth (-1) False td
+      _ -> Nothing
+  }
+
+ruleDatetimeDatetimeInterval :: Rule
+ruleDatetimeDatetimeInterval = Rule
+  { name = "<datetime> - <datetime> (interval)"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "\\-"
+    , Predicate isNotLatent
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleDateDateInterval :: Rule
+ruleDateDateInterval = Rule
+  { name = "dd.(mm.)? - dd.mm.(yy[yy]?)? (interval)"
+  , pattern =
+    [ regex "(?:з\\s+)?(10|20|30|31|[012]?[1-9])\\.?((?<=\\.)(?:10|11|12|0?[1-9])(?:\\.?))?"
+    , regex "\\-|/|по"
+    , regex "(10|20|30|31|[012]?[1-9])\\.(10|11|12|0?[1-9])\\.?((?<=\\.)\\d{2,4})?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (d1:"":_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:"":_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m2 <- parseInt m2
+          Token Time <$> interval TTime.Closed (monthDay m2 d1) (monthDay m2 d2)
+      (Token RegexMatch (GroupMatch (d1:"":_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:y:_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m2 <- parseInt m2
+          y <- parseInt y
+          Token Time <$> interval TTime.Closed (yearMonthDay y m2 d1) (yearMonthDay y m2 d2)
+      (Token RegexMatch (GroupMatch (d1:m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:"":_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m1 <- parseInt m1
+          m2 <- parseInt m2
+          Token Time <$> interval TTime.Closed (monthDay m1 d1) (monthDay m2 d2)
+      (Token RegexMatch (GroupMatch (d1:m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (d2:m2:y:_)):
+       _) -> do
+          d1 <- parseInt d1
+          d2 <- parseInt d2
+          m1 <- parseInt m1
+          m2 <- parseInt m2
+          y <- parseInt y
+          Token Time <$> interval TTime.Closed (yearMonthDay y m1 d1) (yearMonthDay y m2 d2)
+      _ -> Nothing
+  }
+
+ruleInDuration :: Rule
+ruleInDuration = Rule
+  { name = "in <duration>"
+  , pattern =
+    [ regex "через"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Duration dd:_) ->
+        tt $ inDuration dd
+      _ -> Nothing
+  }
+
+ruleLastCycleOfTime :: Rule
+ruleLastCycleOfTime = Rule
+  { name = "last <cycle> of <time>"
+  , pattern =
+    [ regex "останній"
+    , dimension TimeGrain
+    , regex "в|у"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_:Token Time td:_) ->
+        tt $ cycleLastOf grain td
+      _ -> Nothing
+  }
+
+ruleLastCycleOfTime2 :: Rule
+ruleLastCycleOfTime2 = Rule
+  { name = "last <cycle> of <time>"
+  , pattern =
+    [ regex "останній"
+    , dimension TimeGrain
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:Token Time td:_) ->
+        tt $ cycleLastOf grain td
+      _ -> Nothing
+  }
+
+ruleMonthDdddInterval :: Rule
+ruleMonthDdddInterval = Rule
+  { name = "<month> dd-dd (interval)"
+  , pattern =
+    [ regex "(?:з\\s+)?([012]?\\d|30|31)(го|\\.)?"
+    , regex "\\-|по|до"
+    , regex "([012]?\\d|30|31)(ое|\\.)?"
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (m2:_)):
+       Token Time td:
+       _) -> do
+        v1 <- parseInt m1
+        v2 <- parseInt m2
+        from <- intersect (dayOfMonth v1) td
+        to <- intersect (dayOfMonth v2) td
+        Token Time <$> interval TTime.Closed from to
+      _ -> Nothing
+  }
+
+ruleYearLatent2 :: Rule
+ruleYearLatent2 = Rule
+  { name = "year (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 2101 10000
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        v <- getIntValue token
+        tt . mkLatent $ year v
+      _ -> Nothing
+  }
+
+ruleTimeAfterNext :: Rule
+ruleTimeAfterNext = Rule
+  { name = "<time> after next"
+  , pattern =
+    [ dimension Time
+    , regex "після наступн(ої|ого)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:_:_) ->
+        tt $ predNth 1 True td
+      _ -> Nothing
+  }
+
+ruleNoon :: Rule
+ruleNoon = Rule
+  { name = "noon"
+  , pattern =
+    [ regex "опівдні"
+    ]
+  , prod = \_ -> tt $ hour False 12
+  }
+
+ruleThisnextDayofweek :: Rule
+ruleThisnextDayofweek = Rule
+  { name = "this|next <day-of-week>"
+  , pattern =
+    [ regex "наступн(ого|а)"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) ->
+        tt $ predNth 0 True td
+      _ -> Nothing
+  }
+
+ruleBetweenTimeofdayAndTimeofdayInterval :: Rule
+ruleBetweenTimeofdayAndTimeofdayInterval = Rule
+  { name = "between <time-of-day> and <time-of-day> (interval)"
+  , pattern =
+    [ regex "з"
+    , Predicate isATimeOfDay
+    , regex "до"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleNextCycle :: Rule
+ruleNextCycle = Rule
+  { name = "next <cycle>"
+  , pattern =
+    [ regex "(в |на )?наступн(ий|а|у|ого|ій|ому)"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 1
+      _ -> Nothing
+  }
+
+ruleOnDate :: Rule
+ruleOnDate = Rule
+  { name = "on <date>"
+  , pattern =
+    [ regex "в"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:x:_) -> Just x
+      _ -> Nothing
+  }
+
+ruleLastCycle :: Rule
+ruleLastCycle = Rule
+  { name = "last <cycle>"
+  , pattern =
+    [ regex "(в )?минул(ий|а|ого|ому|ої|у)"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) ->
+        tt . cycleNth grain $ - 1
+      _ -> Nothing
+  }
+
+ruleLunch :: Rule
+ruleLunch = Rule
+  { name = "lunch"
+  , pattern =
+    [ regex "(в )?обід"
+    ]
+  , prod = \_ ->
+      let from = hour False 12
+          to = hour False 14
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleAfternoon :: Rule
+ruleAfternoon = Rule
+  { name = "afternoon"
+  , pattern =
+    [ regex "дня|днем"
+    ]
+  , prod = \_ ->
+      let from = hour False 12
+          to = hour False 19
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleEvening :: Rule
+ruleEvening = Rule
+  { name = "evening"
+  , pattern =
+    [ regex "вечора|ввечері"
+    ]
+  , prod = \_ ->
+      let from = hour False 18
+          to = hour False 0
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleNamedmonthDayofmonthOrdinal :: Rule
+ruleNamedmonthDayofmonthOrdinal = Rule
+  { name = "<named-month> <day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMOrdinal
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+
+ruleHourofdayIntegerAsRelativeMinutes :: Rule
+ruleHourofdayIntegerAsRelativeMinutes = Rule
+  { name = "<hour-of-day> <integer> (as relative minutes)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
+    , Predicate $ isIntegerBetween 1 59
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute is12H hours n
+      _ -> Nothing
+  }
+
+ruleDayofmonthordinalNamedmonth :: Rule
+ruleDayofmonthordinalNamedmonth = Rule
+  { name = "<day-of-month>(ordinal) <named-month>"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleIntersectBy :: Rule
+ruleIntersectBy = Rule
+  { name = "intersect by ','"
+  , 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
+  { name = "nth <time> after <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , regex "після"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td1:
+       _:
+       Token Time td2:
+       _) -> tt $ predNthAfter (v - 1) td1 td2
+      _ -> Nothing
+  }
+
+ruleMmdd :: Rule
+ruleMmdd = Rule
+  { name = "mm/dd"
+  , pattern =
+    [ regex "([012]?[1-9]|10|20|30|31)\\.(10|11|12|0?[1-9])\\.?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        d <- parseInt m1
+        m <- parseInt m2
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleTimeofdayLatent :: Rule
+ruleTimeofdayLatent = Rule
+  { name = "time-of-day (latent)"
+  , pattern =
+    [ Predicate $ isIntegerBetween 0 23
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ hour (n < 12) n
+      _ -> Nothing
+  }
+
+ruleDurationAgo :: Rule
+ruleDurationAgo = Rule
+  { name = "<duration> ago"
+  , pattern =
+    [ dimension Duration
+    , regex "тому"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Duration dd:_:_) ->
+        tt $ durationAgo dd
+      _ -> Nothing
+  }
+
+ruleLastNCycle :: Rule
+ruleLastNCycle = Rule
+  { name = "last n <cycle>"
+  , pattern =
+    [ regex "останні"
+    , Predicate $ isIntegerBetween 1 9999
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:Token TimeGrain grain:_) -> do
+        n <- getIntValue token
+        tt $ cycleN True grain (- n)
+      _ -> Nothing
+  }
+
+ruleWithinDuration :: Rule
+ruleWithinDuration = Rule
+  { name = "within <duration>"
+  , pattern =
+    [ regex "протягом"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Duration dd:_) -> Token Time <$>
+        interval TTime.Open now (inDuration dd)
+      _ -> Nothing
+  }
+
+ruleMidnighteodendOfDay :: Rule
+ruleMidnighteodendOfDay = Rule
+  { name = "midnight|EOD|end of day"
+  , pattern =
+    [ regex "(кінця|концеції) дня"
+    ]
+  , prod = \_ -> tt $ hour False 0
+  }
+
+ruleDayofmonthNonOrdinalNamedmonth :: Rule
+ruleDayofmonthNonOrdinalNamedmonth = Rule
+  { name = "<day-of-month> (non ordinal) <named-month>"
+  , pattern =
+    [ Predicate isDOMInteger
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (token:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+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
+  }
+
+ruleUntilTimeofday :: Rule
+ruleUntilTimeofday = Rule
+  { name = "until <time-of-day>"
+  , pattern =
+    [ regex "до"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> tt $ withDirection TTime.Before td
+      _ -> Nothing
+  }
+
+ruleAtTimeofday :: Rule
+ruleAtTimeofday = Rule
+  { name = "at <time-of-day>"
+  , pattern =
+    [ regex "о"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime :: Rule
+ruleNthTimeOfTime = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , regex "в|у"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td1:
+       _:
+       Token Time td2:
+       _) -> Token Time . predNth (v - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleNthTimeOfTime2 :: Rule
+ruleNthTimeOfTime2 = Rule
+  { name = "nth <time> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension Time
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:
+       Token Time td1:
+       Token Time td2:
+       _) -> Token Time . predNth (v - 1) False <$> intersect td2 td1
+      _ -> Nothing
+  }
+
+ruleTimePartofday :: Rule
+ruleTimePartofday = Rule
+  { name = "<time> <part-of-day>"
+  , pattern =
+    [ dimension Time
+    , Predicate isAPartOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleWeekend :: Rule
+ruleWeekend = Rule
+  { name = "week-end"
+  , pattern =
+    [ regex "вихідні"
+    ]
+  , prod = \_ -> tt $ mkOkForThisNext weekend
+  }
+
+ruleOrdinalQuarterYear :: Rule
+ruleOrdinalQuarterYear = Rule
+  { name = "<ordinal> quarter <year>"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal od:_:Token Time td:_) ->
+        tt $ cycleNthAfter False TG.Quarter (TOrdinal.value od - 1) td
+      _ -> Nothing
+  }
+
+ruleYyyymmdd :: Rule
+ruleYyyymmdd = Rule
+  { name = "yyyy-mm-dd"
+  , pattern =
+    [ regex "(\\d{2,4})-(0?[1-9]|10|11|12)-([012]?[1-9]|10|20|30|31)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
+        y <- parseInt m1
+        m <- parseInt m2
+        d <- parseInt m3
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleIntersectByOfFromS :: Rule
+ruleIntersectByOfFromS = Rule
+  { name = "intersect by 'of', 'from', 's"
+  , pattern =
+    [ Predicate isNotLatent
+    , regex "на"
+    , Predicate isNotLatent
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleNextNCycle :: Rule
+ruleNextNCycle = Rule
+  { name = "next n <cycle>"
+  , pattern =
+    [ regex "наступні"
+    , Predicate $ isIntegerBetween 1 9999
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:Token TimeGrain grain:_) -> do
+        v <- getIntValue token
+        tt $ cycleN True grain v
+      _ -> Nothing
+  }
+
+ruleMorning :: Rule
+ruleMorning = Rule
+  { name = "morning"
+  , pattern =
+    [ regex "ранку|вранці"
+    ]
+  , prod = \_ ->
+      let from = hour False 3
+          to = hour False 12
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleThisPartofday :: Rule
+ruleThisPartofday = Rule
+  { name = "this <part-of-day>"
+  , pattern =
+    [ regex "(на |в )?(цьому|ця|цей|цього|це|ці)"
+    , Predicate isAPartOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td
+      _ -> Nothing
+  }
+
+ruleThisCycle :: Rule
+ruleThisCycle = Rule
+  { name = "this <cycle>"
+  , pattern =
+    [ regex "(на |в )?(цьому|ця|цей|цього|це|ці)"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) ->
+        tt $ cycleNth grain 0
+      _ -> Nothing
+  }
+
+ruleThisTime :: Rule
+ruleThisTime = Rule
+  { name = "this <time>"
+  , pattern =
+    [ regex "(на |в )?(цьому|ця|цей|цього|це|ці)"
+    , Predicate isOkWithThisNext
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) ->
+        tt $ predNth 0 False td
+      _ -> Nothing
+  }
+
+ruleYearLatent :: Rule
+ruleYearLatent = Rule
+  { name = "year (latent)"
+  , pattern =
+    [ Predicate $
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        y <- getIntValue token
+        tt . mkLatent $ year y
+      _ -> Nothing
+  }
+
+ruleAfterTimeofday :: Rule
+ruleAfterTimeofday = Rule
+  { name = "after <time-of-day>"
+  , pattern =
+    [ regex "після"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> tt $ withDirection TTime.After td
+      _ -> Nothing
+  }
+
+ruleNight :: Rule
+ruleNight = Rule
+  { name = "night"
+  , pattern =
+    [ regex "ночі"
+    ]
+  , prod = \_ ->
+      let from = hour False 0
+          to = hour False 4
+      in Token Time . mkLatent . partOfDay <$>
+           interval TTime.Open from to
+  }
+
+ruleDayofmonthOrdinal :: Rule
+ruleDayofmonthOrdinal = Rule
+  { name = "<day-of-month> (ordinal)"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:_) ->
+        tt $ dayOfMonth v
+      _ -> Nothing
+  }
+
+ruleOrdinalCycleOfTime :: Rule
+ruleOrdinalCycleOfTime = Rule
+  { name = "<ordinal> <cycle> of <time>"
+  , pattern =
+    [ dimension Ordinal
+    , dimension TimeGrain
+    , regex "у|в"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal od:Token TimeGrain grain:_:Token Time td:_) ->
+        tt $ cycleNthAfter True grain (TOrdinal.value od - 1) 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 (m1:m2:_)):_) -> do
+        h <- parseInt m1
+        m <- parseInt m2
+        tt $ hourMinute False h m
+      _ -> Nothing
+  }
+
+ruleYear :: Rule
+ruleYear = Rule
+  { name = "year"
+  , pattern =
+    [ Predicate $ isIntegerBetween 1000 2100
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        y <- getIntValue token
+        tt $ year y
+      _ -> Nothing
+  }
+
+ruleNamedmonthDayofmonthNonOrdinal :: Rule
+ruleNamedmonthDayofmonthNonOrdinal = 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
+  }
+
+ruleHhmmMilitary :: Rule
+ruleHhmmMilitary = Rule
+  { name = "hhmm (military)"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))([0-5]\\d)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
+        hh <- parseInt h
+        mm <- parseInt m
+        tt . mkLatent $ hourMinute False hh mm
+      _ -> Nothing
+  }
+
+ruleAbsorptionOfAfterNamedDay :: Rule
+ruleAbsorptionOfAfterNamedDay = Rule
+  { name = "absorption of , after named day"
+  , pattern =
+    [ Predicate isADayOfWeek
+    , regex ","
+    ]
+  , prod = \tokens -> case tokens of
+      (x:_) -> Just x
+      _ -> Nothing
+  }
+
+ruleLastDayofweekOfTime :: Rule
+ruleLastDayofweekOfTime = Rule
+  { name = "last <day-of-week> of <time>"
+  , pattern =
+    [ regex "останній"
+    , Predicate isADayOfWeek
+    , regex "у|в"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td1:_:Token Time td2:_) ->
+        tt $ predLastOf td1 td2
+      _ -> Nothing
+  }
+
+ruleTimeofdayTimeofdayInterval :: Rule
+ruleTimeofdayTimeofdayInterval = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "\\-"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleTimeofdayTimeofdayInterval2 :: Rule
+ruleTimeofdayTimeofdayInterval2 = Rule
+  { name = "<time-of-day> - <time-of-day> (interval)"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "\\-|/"
+    , Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time <$> interval TTime.Closed td1 td2
+      _ -> Nothing
+  }
+
+ruleDurationAfterTime :: Rule
+ruleDurationAfterTime = Rule
+  { name = "<duration> after <time>"
+  , pattern =
+    [ dimension Duration
+    , regex "після"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Duration dd:_:Token Time td:_) ->
+        tt $ durationAfter dd td
+      _ -> Nothing
+  }
+
+ruleOrdinalQuarter :: Rule
+ruleOrdinalQuarter = Rule
+  { name = "<ordinal> quarter"
+  , pattern =
+    [ dimension Ordinal
+    , Predicate $ isGrain TG.Quarter
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Ordinal OrdinalData{TOrdinal.value = v}:_) -> tt .
+        cycleNthAfter False TG.Quarter (v - 1) $ cycleNth TG.Year 0
+      _ -> Nothing
+  }
+
+ruleDurationBeforeTime :: Rule
+ruleDurationBeforeTime = Rule
+  { name = "<duration> before <time>"
+  , pattern =
+    [ dimension Duration
+    , regex "перед"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Duration dd:_:Token Time td:_) ->
+        tt $ durationBefore dd td
+      _ -> Nothing
+  }
+
+rulePartofdayOfTime :: Rule
+rulePartofdayOfTime = Rule
+  { name = "<part-of-day> of <time>"
+  , pattern =
+    [ Predicate isAPartOfDay
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:Token Time td2:_) ->
+        Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+ruleMmddyyyy :: Rule
+ruleMmddyyyy = Rule
+  { name = "mm/dd/yyyy"
+  , pattern =
+    [ regex "([012]?[1-9]|10|20|30|31)\\.(0?[1-9]|10|11|12)\\.(\\d{2,4})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
+        y <- parseInt m3
+        m <- parseInt m2
+        d <- parseInt m1
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleTimeofdayOclock :: Rule
+ruleTimeofdayOclock = Rule
+  { name = "<time-of-day>  o'clock"
+  , pattern =
+    [ Predicate isATimeOfDay
+    , regex "годин(и|і|а)?|ч(?:[\\s'\"-_{}\\[\\]()]|$)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:_) ->
+        tt $ notLatent td
+      _ -> Nothing
+  }
+
+ruleDayofmonthordinalNamedmonthYear :: Rule
+ruleDayofmonthordinalNamedmonthYear = Rule
+  { name = "<day-of-month>(ordinal) <named-month> year"
+  , pattern =
+    [ Predicate isDOMOrdinal
+    , Predicate isAMonth
+    , regex "(\\d{2,4})"
+    ]
+  , prod = \tokens -> case tokens of
+      (token:
+       Token Time td:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+        n <- parseInt match
+        dom <- intersectDOM td token
+        Token Time <$> intersect dom (year n)
+      _ -> Nothing
+  }
+
+ruleTimezone :: Rule
+ruleTimezone = Rule
+  { name = "<time> timezone"
+  , pattern =
+    [ 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
+      (Token Time td:
+       Token RegexMatch (GroupMatch (tz:_)):
+       _) -> Token Time <$> inTimezone (Text.toUpper tz) td
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ruleAbsorptionOfAfterNamedDay
+  , ruleAfterTimeofday
+  , ruleAfternoon
+  , ruleAtTimeofday
+  , ruleBetweenTimeofdayAndTimeofdayInterval
+  , ruleDatetimeDatetimeInterval
+  , ruleDateDateInterval
+  , ruleDayofmonthNonOrdinalNamedmonth
+  , ruleDayofmonthOrdinal
+  , ruleDayofmonthordinalNamedmonth
+  , ruleDayofmonthordinalNamedmonthYear
+  , ruleDurationAfterTime
+  , ruleDurationAgo
+  , ruleDurationBeforeTime
+  , ruleEvening
+  , ruleHhmm
+  , ruleHhmmMilitary
+  , ruleHourofdayIntegerAsRelativeMinutes
+  , ruleInDuration
+  , ruleIntersect
+  , ruleIntersectBy
+  , ruleIntersectByOfFromS
+  , ruleLastCycle
+  , ruleLastCycleOfTime
+  , ruleLastCycleOfTime2
+  , ruleLastDayofweekOfTime
+  , ruleLastNCycle
+  , ruleLastTime
+  , ruleLunch
+  , ruleMidnighteodendOfDay
+  , ruleMmdd
+  , ruleMmddyyyy
+  , ruleMonthDdddInterval
+  , ruleMorning
+  , ruleNamedmonthDayofmonthNonOrdinal
+  , ruleNamedmonthDayofmonthOrdinal
+  , ruleNextCycle
+  , ruleNextNCycle
+  , ruleNight
+  , ruleNoon
+  , ruleNthTimeAfterTime
+  , ruleNthTimeOfTime
+  , ruleNthTimeOfTime2
+  , ruleOnDate
+  , ruleOrdinalCycleOfTime
+  , ruleOrdinalQuarter
+  , ruleOrdinalQuarterYear
+  , rulePartofdayOfTime
+  , ruleThisCycle
+  , ruleThisPartofday
+  , ruleThisTime
+  , ruleThisnextDayofweek
+  , ruleTimeAfterNext
+  , ruleTimePartofday
+  , ruleTimeofdayLatent
+  , ruleTimeofdayOclock
+  , ruleTimeofdayTimeofdayInterval
+  , ruleTimeofdayTimeofdayInterval2
+  , ruleUntilTimeofday
+  , ruleWeekend
+  , ruleWithinDuration
+  , ruleYear
+  , ruleYearLatent
+  , ruleYearLatent2
+  , ruleYyyymmdd
+  , ruleTimezone
+  ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
+  ++ ruleSeasons
+  ++ ruleHolidays
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
@@ -2,13 +2,13 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.VI.Corpus
   ( corpus
+  , negativeCorpus
   ) where
 
 import Data.String
@@ -21,14 +21,22 @@
 import Duckling.Time.Types hiding (Month, refTime)
 import Duckling.TimeGrain.Types hiding (add)
 
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (context, testOptions, examples)
+  where
+    examples =
+      [ "có ngày chính xác"
+      ]
+
 corpus :: Corpus
 corpus = (context, testOptions, allExamples)
-  where
-    context = testContext
-      { locale = makeLocale VI Nothing
-      , referenceTime = refTime (2017, 2, 2, 3, 55, 0) (-2)
-      }
 
+context :: Context
+context = testContext
+  { locale = makeLocale VI Nothing
+  , referenceTime = refTime (2017, 2, 2, 3, 55, 0) (-2)
+  }
+
 allExamples :: [Example]
 allExamples = concat
   [ examples (datetime (2017, 2, 2, 3, 55, 0) Second)
@@ -68,7 +76,7 @@
   , examples (datetime (2017, 2, 5, 0, 0, 0) Day)
              [ "chủ nhật"
              ]
-  , examples (datetime (2017, 6, 0, 0, 0, 0) Month)
+  , examples (datetime (2017, 6, 1, 0, 0, 0) Month)
              [ "tháng 6"
              , "tháng sáu"
              ]
@@ -93,7 +101,7 @@
              , "7/3"
              , "07/03"
              ]
-  , examples (datetime (2017, 10, 0, 0, 0, 0) Month)
+  , examples (datetime (2017, 10, 1, 0, 0, 0) Month)
              [ "tháng 10 năm 2017"
              , "tháng mười năm 2017"
              ]
@@ -110,7 +118,7 @@
              [ "thứ năm tuần tới"
              , "thứ 5 tuần sau"
              ]
-  , examples (datetime (2017, 3, 0, 0, 0, 0) Month)
+  , examples (datetime (2017, 3, 1, 0, 0, 0) Month)
              [ "tháng 3 tới"
              ]
   , examples (datetime (2017, 4, 9, 0, 0, 0) Day)
@@ -134,10 +142,10 @@
   , examples (datetime (2017, 2, 6, 0, 0, 0) Week)
              [ "tuần sau"
              ]
-  , examples (datetime (2017, 1, 0, 0, 0, 0) Month)
+  , examples (datetime (2017, 1, 1, 0, 0, 0) Month)
              [ "tháng trước"
              ]
-  , examples (datetime (2017, 3, 0, 0, 0, 0) Month)
+  , examples (datetime (2017, 3, 1, 0, 0, 0) Month)
              [ "tháng sau"
              ]
   , examples (datetime (2017, 1, 1, 0, 0, 0) Quarter)
@@ -153,14 +161,14 @@
   , examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
              [ "quý 4 năm 2018"
              ]
-  , examples (datetime (2016, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2016, 1, 1, 0, 0, 0) Year)
              [ "năm trước"
              , "năm ngoái"
              ]
-  , examples (datetime (2017, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2017, 1, 1, 0, 0, 0) Year)
              [ "năm nay"
              ]
-  , examples (datetime (2018, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2018, 1, 1, 0, 0, 0) Year)
              [ "năm sau"
              ]
   , examples (datetime (2017, 1, 1, 0, 0, 0) Quarter)
@@ -179,14 +187,14 @@
   , examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
              [ "quý 4 của năm 2018"
              ]
-  , examples (datetime (2016, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2016, 1, 1, 0, 0, 0) Year)
              [ "năm ngoái"
              , "năm trước"
              ]
-  , examples (datetime (2017, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2017, 1, 1, 0, 0, 0) Year)
              [ "năm nay"
              ]
-  , examples (datetime (2018, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2018, 1, 1, 0, 0, 0) Year)
              [ "năm tiếp theo"
              , "năm kế tiếp"
              , "năm tới"
@@ -316,18 +324,18 @@
              [ "3 ngày tới"
              , "3 ngày tiếp theo"
              ]
-  , examples (datetimeInterval ((2016, 12, 0, 0, 0, 0), (2017, 2, 0, 0, 0, 0)) Month)
+  , examples (datetimeInterval ((2016, 12, 1, 0, 0, 0), (2017, 2, 1, 0, 0, 0)) Month)
              [ "2 tháng vừa rồi"
              , "2 tháng qua"
              ]
-  , examples (datetimeInterval ((2017, 3, 0, 0, 0, 0), (2017, 6, 0, 0, 0, 0)) Month)
+  , examples (datetimeInterval ((2017, 3, 1, 0, 0, 0), (2017, 6, 1, 0, 0, 0)) Month)
              [ "3 tháng tới"
              , "ba tháng tiếp theo"
              ]
-  , examples (datetimeInterval ((2015, 0, 0, 0, 0, 0), (2017, 0, 0, 0, 0, 0)) Year)
+  , examples (datetimeInterval ((2015, 1, 1, 0, 0, 0), (2017, 1, 1, 0, 0, 0)) Year)
              [ "2 năm vừa rồi"
              ]
-  , examples (datetimeInterval ((2018, 0, 0, 0, 0, 0), (2021, 0, 0, 0, 0, 0)) Year)
+  , examples (datetimeInterval ((2018, 1, 1, 0, 0, 0), (2021, 1, 1, 0, 0, 0)) Year)
              [ "3 năm tới"
              , "3 năm tiếp theo"
              ]
@@ -341,6 +349,9 @@
   , examples (datetime (2017, 4, 23, 16, 0, 0) Minute)
              [ "lúc 4:00 chiều ngày 23/4"
              ]
+  , examples (datetime (2017, 10, 12, 0, 0, 0) Day)
+             [ "ngày 12/10"
+             ]
   , examples (datetime (2017, 4, 23, 16, 0, 0) Hour)
              [ "lúc 4 giờ chiều ngày 23 tháng 4"
              ]
@@ -364,8 +375,12 @@
              [ "thứ hai tới"
              , "thứ 2 tới"
              ]
-  , examples (datetime (2017, 4, 0, 0, 0, 0) Month)
+  , examples (datetime (2017, 4, 1, 0, 0, 0) Month)
              [ "tháng 4"
              , "tháng tư"
+             ]
+  , examples (datetime (2017, 12, 25, 0, 0, 0) Day)
+             [ "giáng sinh"
+             , "ngày giáng sinh"
              ]
   ]
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
@@ -2,27 +2,28 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.VI.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Prelude
 import Data.Text (Text)
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers (isGrain)
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Ordinal.Types (OrdinalData(..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
-import Duckling.Time.Types (TimeData (..))
+import Duckling.Time.Types (TimeData(..))
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Ordinal.Types as TOrdinal
@@ -162,8 +163,7 @@
     , regex "(h(ô)m )?nay"
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td:_) ->
-        Token Time . partOfDay <$> intersect (cycleNth TG.Day 0) td
+      (Token Time td:_) -> Token Time . partOfDay <$> intersect today td
       _ -> Nothing
   }
 
@@ -172,7 +172,7 @@
   { name = "ngày dd/mm/yyyy"
   , pattern =
     [ regex "ng(à)y"
-    , regex "(3[01]|[12]\\d|0?[1-9])[-/](0?[1-9]|1[0-2])[/-](\\d{2,4})"
+    , regex "(3[01]|[12]\\d|0?[1-9])[-/](1[0-2]|0?[1-9])[/-](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (_:Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do
@@ -330,7 +330,7 @@
   , pattern =
     [ regex "((ngay )?h(ô)m|b(ữ)a) nay"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleAtHhmm :: Rule
@@ -521,8 +521,7 @@
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 17) (hour False 21)
-      Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+      Token Time . partOfDay . notLatent <$> intersect today td
   }
 
 ruleLastNCycle :: Rule
@@ -620,7 +619,7 @@
 ruleTimeTrc = Rule
   { name = "<time> trước"
   , pattern =
-    [ dimension Time
+    [ Predicate $ not . isGrainFinerThan TG.Day
     , regex "tr(ư)(ớ)c|v(ừ)a r(ồ)i"
     ]
   , prod = \tokens -> case tokens of
@@ -733,8 +732,7 @@
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 13) (hour False 17)
-      Token Time . partOfDay . notLatent <$>
-        intersect (cycleNth TG.Day 0) td
+      Token Time . partOfDay . notLatent <$> intersect today td
   }
 
 ruleSeason2 :: Rule
@@ -831,7 +829,6 @@
     [ regex "(t(ố)i|(đ)(ê)m)( h(ô)m)? nay"
     ]
   , prod = \_ -> do
-      let today = cycleNth TG.Day 0
       evening <- interval TTime.Open (hour False 18) (hour False 0)
       Token Time . partOfDay . notLatent <$> intersect today evening
   }
@@ -856,7 +853,7 @@
   , pattern =
     [ regex "(ngay )?(b(â)y gi(ờ)|l(ú)c n(à)y)"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleNgyDdmm :: Rule
@@ -864,7 +861,7 @@
   { name = "ngày dd/mm"
   , pattern =
     [ regex "ng(à)y"
-    , regex "(3[01]|[12]\\d|0?[1-9])/(0?[1-9]|1[0-2])"
+    , regex "(3[01]|[12]\\d|0?[1-9])/(1[0-2]|0?[1-9])"
     ]
   , prod = \tokens -> case tokens of
       (_:Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
@@ -927,7 +924,7 @@
 ruleGingSinh = Rule
   { name = "giáng sinh"
   , pattern =
-    [ regex "(ng(à)y )(xmas|christmas|gi(á)ng sinh)?"
+    [ regex "(ngày )?(xmas|christmas|giáng sinh)"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -936,7 +933,7 @@
 ruleNgyHmKia = Rule
   { name = "ngày hôm kia"
   , pattern =
-    [ regex "(ng(à)y )?h(ô)m kia"
+    [ regex "(ngày )?hôm kia"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
diff --git a/Duckling/Time/ZH/CN/Corpus.hs b/Duckling/Time/ZH/CN/Corpus.hs
--- a/Duckling/Time/ZH/CN/Corpus.hs
+++ b/Duckling/Time/ZH/CN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Time/ZH/CN/Rules.hs b/Duckling/Time/ZH/CN/Rules.hs
--- a/Duckling/Time/ZH/CN/Rules.hs
+++ b/Duckling/Time/ZH/CN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -61,6 +60,10 @@
              , "後天"
              , "後日"
              ]
+  , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "大後日"
+             , "大後天"
+             ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
              [ "前天"
              , "前日"
@@ -178,6 +181,7 @@
              , "3/3/15"
              , "2015-3-3"
              , "2015-03-03"
+             , "二零一五年三月三號"
              ]
   , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
              [ "2013年2月15号"
@@ -189,6 +193,7 @@
              , "2月15號"
              , "二月十五號"
              , "2/15"
+             , "二零一三年二月十五號"
              ]
   , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
              [ "10/31/1974"
@@ -275,29 +280,46 @@
              , "下礼拜"
              , "下禮拜"
              ]
-  , examples (datetime (2013, 1, 0, 0, 0, 0) Month)
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
              [ "上月"
              , "上个月"
              , "上個月"
              ]
-  , examples (datetime (2013, 3, 0, 0, 0, 0) Month)
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
              [ "下月"
              , "下个月"
              , "下個月"
+             , "3月"
+             , "3月份"
+             , "三月"
              ]
-  , examples (datetime (2012, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
+             [ "今個月二十號"
+             , "今個月20号"
+             , "今個月廿號"
+             ]
+  , examples (datetime (2013, 3, 20, 0, 0, 0) Day)
+             [ "下個月二十號"
+             , "下個月20号"
+             , "下個月廿號"
+             ]
+  , examples (datetime (2012, 1, 1, 0, 0, 0) Year)
              [ "去年"
              , "上年"
              ]
-  , examples (datetime (2013, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Year)
              [ "今年"
              , "这一年"
              , "這一年"
              ]
-  , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
              [ "明年"
              , "下年"
              ]
+  , examples (datetime (2014, 9, 1, 0, 0, 0) Month)
+             [ "下年9月"
+             , "明年九月"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 29, 58), (2013, 2, 12, 4, 30, 0)) Second)
              [ "上两秒"
              , "上二秒"
@@ -447,7 +469,46 @@
              , "3:15p"
              , "下午三點十五"
              , "晏晝三點十五"
+             , "下午三点十五分"
+             , "下午三點十五分"
+             , "晏晝三點十五分"
+             , "晏晝三點三"
+             , "晏晝三點踏三"
+             , "晏晝三點搭三"
+             , "晏晝三點三個字"
              ]
+  , examples (datetime (2013, 2, 12, 15, 05, 0) Minute)
+             [ "下午三点零五"
+             , "下午3:05"
+             , "15:05"
+             , "3:05pm"
+             , "3:05PM"
+             , "3:05p"
+             , "下午三點零五"
+             , "晏晝三點零五"
+             , "下午三点零五分"
+             , "下午三點零五分"
+             , "晏晝三點零五分"
+             , "晏晝三點一"
+             , "晏晝三點踏一"
+             , "晏晝三點搭一"
+             , "晏晝三點一個字"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
+             [ "下午三点半"
+             , "下午3:30"
+             , "15:30"
+             , "3:30pm"
+             , "3:30PM"
+             , "3:30p"
+             , "下午三點半"
+             , "晏晝三點半"
+             , "下午三点三十分"
+             , "下午三點三十分"
+             , "晏晝三點三十分"
+             , "晏晝三點踏半"
+             , "晏晝三點搭半"
+             ]
   , examples (datetime (2013, 2, 12, 13, 0, 0) Minute)
              [ "4pm CET"
              ]
@@ -521,5 +582,309 @@
   , examples (datetimeIntervalHoliday ((2013, 2, 14, 18, 0, 0), (2013, 2, 15, 0, 0, 0)) Hour "情人节")
              [ "情人节晚上"
              , "情人節晚上"
+             ]
+   , examples (datetimeHoliday (2013, 9, 13, 0, 0, 0) Day "赎罪日")
+            [ "赎罪日"
+            , "贖罪日"
+            ]
+ , examples (datetimeHoliday (2013, 9, 13, 0, 0, 0) Day "赎罪日")
+            [ "赎罪日"
+            , "贖罪日"
+            ]
+  , examples (datetimeHoliday (2013, 2, 13, 0, 0, 0) Day "大斋首日")
+             [ "大斋首日"
+             , "聖灰星期三"
+             , "灰日"
+             , "圣灰礼仪日"
+             , "圣灰日"
+             ]
+  , examples (datetimeHoliday (2013, 11, 13, 0, 0, 0) Day "阿舒拉节")
+             [ "阿舒拉節"
+             ]
+  -- wiki says 11/8
+  , examples (datetimeHoliday (2013, 11, 9, 0, 0, 0) Day "克哈特普迦节")
+             [ "克哈特普迦节"
+             ]
+   , examples (datetimeHoliday (2014, 1, 31, 0, 0, 0) Day "春节")
+             [ "春节"
+             , "农历新年"
+             , "新春"
+             , "正月正时"
+             , "正月朔日"
+             , "正月正時"
+             ]
+  , examples (datetimeHoliday (2013, 5, 30, 0, 0, 0) Day "基督圣体节")
+             [ "基督聖體节"
+             , "基督聖體聖血瞻礼"
+             , "基督聖體聖血節"
+             ]
+  , examples (datetimeHoliday (2013, 11, 3, 0, 0, 0) Day "排灯节")
+             [ "万灯节"
+             , "印度燈節"
+             , "排灯节"
+             ]
+  , examples (datetimeHoliday (2013, 4, 1, 0, 0, 0) Day "复活节星期一")
+             [ "复活节星期一"
+             , "復活節星期一"
+             ]
+  , examples (datetimeHoliday (2013, 3, 31, 0, 0, 0) Day "复活节")
+             [ "复活节"
+             , "復活節"
+             , "主復活日"
+             ]
+  , examples (datetimeHoliday (2013, 10, 15, 0, 0, 0) Day "古尔邦节")
+             [ "古尔邦节"
+             , "古爾邦節"
+             , "宰牲节"
+             ]
+  , examples (datetimeHoliday (2013, 8, 8, 0, 0, 0) Day "开斋节")
+             [ "开斋节"
+             , "開齋節"
+             , "肉孜节"
+             , "尔代节"
+             , "爾代節"
+             ]
+  , examples (datetimeHoliday (2013, 3, 29, 0, 0, 0) Day "耶稣受难日")
+             [ "主受难日"
+             , "主受难节"
+             , "沈默周五"
+             , "聖週五"
+             , "耶穌受難日"
+             ]
+  , examples (datetimeHoliday (2013, 3, 26, 0, 0, 0) Day "侯丽节")
+             [ "侯丽节"
+             , "荷麗节"
+             , "洒红节"
+             , "灑紅节"
+             , "欢悦节"
+             , "五彩節"
+             , "胡里节"
+             , "好利节"
+             , "霍利節"
+             ]
+  , examples (datetimeHoliday (2013, 3, 30, 0, 0, 0) Day "圣周六")
+             [ "神圣周六"
+             , "聖週六"
+             , "耶稣受难日翌日"
+             , "主受難節翌日"
+             , "復活節前夜"
+             , "黑色星期六"
+             ]
+  , examples (datetimeHoliday (2013, 11, 4, 0, 0, 0) Day "伊斯兰新年")
+             [ "伊斯兰新年"
+             , "伊斯兰教新年"
+             , "伊斯兰历新年"
+             ]
+  , examples (datetimeHoliday (2013, 6, 6, 0, 0, 0) Day "登霄节")
+             [ "登霄节"
+             , "夜行登霄節"
+             ]
+  , examples (datetimeHoliday (2014, 1, 16, 0, 0, 0) Day "印度丰收节第四天")
+             [ "印度丰收节第四天"
+             , "龐格爾節第四天"
+             , "庞格尔节第四天"
+             ]
+  , examples (datetimeHoliday (2013, 4, 27, 0, 0, 0) Day "篝火节")
+             [ "篝火节"
+             , "犹太教篝火节"
+             , "猶太教篝火節"
+             ]
+  , examples (datetimeHoliday (2013, 8, 4, 0, 0, 0) Day "法令之夜")
+             [ "法令之夜"
+             , "权力之夜"
+             ]
+  , examples (datetimeHoliday (2013, 4, 27, 0, 0, 0) Day "拉撒路圣周六")
+             [ "拉撒路聖週六"
+             , "拉匝路周六"
+             ]
+  , examples (datetimeHoliday (2014, 1, 15, 0, 0, 0) Day "印度丰收节第三天")
+             [ "印度丰收节第三天"
+             , "龐格爾節第三天"
+             , "庞格尔节第三天"
+             ]
+  , examples (datetimeHoliday (2013, 3, 28, 0, 0, 0) Day "神圣星期四")
+             [ "濯足節"
+             , "神聖星期四"
+             , "圣周星期四"
+             , "圣周四"
+             , "設立聖餐日"
+             ]
+  , examples (datetimeHoliday (2014, 1, 13, 0, 0, 0) Day "圣纪节")
+             [ "圣纪节"
+             , "聖紀節"
+             ]
+  , examples (datetimeHoliday (2013, 5, 6, 0, 0, 0) Day "东正教复活节星期一")
+             [ "东正教复活节星期一"
+             , "東正教復活節星期一"
+             ]
+  , examples (datetimeHoliday (2013, 5, 4, 0, 0, 0) Day "东正教圣周六")
+             [ "東正教神聖週六"
+             , "東正教聖週六"
+             , "東正教耶稣受难日翌日"
+             , "東正教主受難節翌日"
+             , "東正教复活节前夜"
+             ]
+  , examples (datetimeHoliday (2013, 5, 3, 0, 0, 0) Day "东正教耶稣受难日")
+             [ "東正教耶穌受难日"
+             , "东正教主受难节"
+             , "东正教圣周五"
+             , "東正教聖週五"
+             , "東正教沈默週五"
+             ]
+  , examples (datetimeHoliday (2013, 4, 28, 0, 0, 0) Day "东正教棕枝主日")
+             [ "东正教棕枝主日"
+             , "东正教圣枝主日"
+             , "东正教聖樹主日"
+             , "東正教基督苦難主日"
+             ]
+  , examples (datetimeHoliday (2013, 3, 24, 0, 0, 0) Day "棕枝主日")
+             [ "棕枝主日"
+             , "圣枝主日"
+             , "聖樹主日"
+             , "基督苦難主日"
+             ]
+  , examples (datetimeHoliday (2013, 5, 19, 0, 0, 0) Day "五旬节")
+             [ "五旬节"
+             , "圣灵降临节"
+             , "聖靈降臨日"
+             ]
+  , examples (datetimeHoliday (2013, 8, 20, 0, 0, 0) Day "印度兄妹节")
+             [ "印度兄妹节"
+             , "拉克沙班丹節"
+             ]
+  , examples (datetimeHoliday (2013, 9, 25, 0, 0, 0) Day "圣会节")
+              [ "圣会节"
+              , "聖会節"
+              ]
+   , examples (datetimeHoliday (2013, 2, 12, 0, 0, 0) Day "忏悔节")
+              [ "忏悔節"
+              , "忏悔火曜日"
+              , "煎餅星期二"
+              ]
+   , examples (datetimeHoliday (2013, 9, 26, 0, 0, 0) Day "西赫托拉节")
+              [ "西赫托拉节"
+              , "西赫妥拉节"
+              , "诵经节"
+              , "誦經节"
+              , "转经节"
+              , "轉經節"
+              , "律法節"
+              , "歡慶聖法節"
+              ]
+   , examples (datetimeHoliday (2014, 1, 14, 0, 0, 0) Day "印度丰收节")
+              [ "印度丰收节"
+              , "淡米爾豐收節"
+              , "淡米尔丰收节"
+              ]
+   , examples (datetimeHoliday (2013, 8, 20, 0, 0, 0) Day "欧南节")
+              [ "欧南节"
+              , "欧南節"
+              ]
+   , examples (datetimeHoliday (2013, 7, 15, 0, 0, 0) Day "圣殿被毁日")
+              [ "圣殿被毁日"
+              , "禁食日"
+              , "聖殿被毁日"
+              ]
+   , examples (datetimeHoliday (2013, 5, 26, 0, 0, 0) Day "圣三一主日")
+              [ "圣三一主日"
+              , "天主三一主日"
+              , "天主聖三一节"
+              , "聖三主日"
+              , "圣三节"
+              ]
+   , examples (datetimeHoliday (2013, 10, 14, 0, 0, 0) Day "十胜节")
+              [ "十勝節"
+              , "凯旋节"
+              , "圣母节"
+              ]
+   , examples (datetimeHoliday (2014, 1, 15, 0, 0, 0) Day "犹太植树节")
+              [ "犹太植树节"
+              , "猶太植樹節"
+              , "图比舍巴特节"
+              , "圖比舍巴特節"
+              , "树木新年"
+              , "樹木新年"
+              ]
+   , examples (datetimeHoliday (2013, 5, 24, 0, 0, 0) Day "卫塞节")
+              [ "卫塞节"
+              , "衛塞節"
+              , "威瑟节"
+              , "比萨宝蕉节"
+              , "比薩寶蕉節"
+              ]
+   , examples (datetimeHoliday (2013, 4, 15, 0, 0, 0) Day "以色列独立日")
+              [ "以色列独立日"
+              , "以色列獨立日"
+              , "以色列国庆节"
+              , "以色列國慶節"
+              ]
+   , examples (datetimeHoliday (2013, 9, 13, 0, 0, 0) Day "赎罪日")
+              [ "赎罪日"
+              , "贖罪日"
+              ]
+   , examples (datetimeHoliday (2013, 5, 20, 0, 0, 0) Day "圣灵节庆日")
+              [ "圣灵节庆日"
+              , "聖靈節慶日"
+              ]
+   , examples (datetimeHoliday (2013, 10, 16, 0, 0, 0) Day "老板节")
+              [ "老板节"
+              , "老闆節"
+              ]
+   , examples (datetimeIntervalHoliday ((2013, 4, 26, 0, 0, 0), (2013, 4, 29, 0, 0, 0)) Day "全球青年服务日")
+              [ "全球青年服务日"
+              , "全球青年服務日"
+              ]
+   , examples (datetimeIntervalHoliday ((2018, 2, 19, 0, 0, 0), (2018, 3, 31, 0, 0, 0)) Day "四旬节")
+              [ "2018年四旬节"
+              , "2018年四旬節"
+              ]
+   , examples (datetimeIntervalHoliday ((2018, 12, 2, 0, 0, 0), (2018, 12, 10, 0, 0, 0)) Day "光明节")
+              [ "2018年光明节"
+              , "2018年修殿节"
+              , "2018年献殿节"
+              , "2018年獻殿节"
+              , "2018年烛光节"
+              , "2018年哈努卡节"
+              , "2018年馬加比節"
+              ]
+   , examples (datetimeIntervalHoliday ((2018, 2, 14, 0, 0, 0), (2018, 4, 1, 0, 0, 0)) Day "大斋期")
+              [ "2018年大斋期"
+              , "2018年大齋節"
+              , "2018年大斋节"
+              ]
+    , examples (datetimeIntervalHoliday ((2018, 10, 9, 0, 0, 0), (2018, 10, 19, 0, 0, 0)) Day "九夜节")
+               [ "2018年九夜节"
+               , "2018年难近母节"
+               , "2018年難近母節"
+               ]
+   , examples (datetimeIntervalHoliday ((2018, 3, 30, 0, 0, 0), (2018, 4, 8, 0, 0, 0)) Day "逾越节")
+              [ "2018年逾越节"
+              , "2018年逾越節"
+              ]
+    , examples (datetimeIntervalHoliday ((2034, 11, 12, 0, 0, 0), (2034, 12, 12, 0, 0, 0)) Day "斋月")
+               [ "2034年斋月"
+               , "2034年穆斯林斋月"
+               , "2034年穆斯林齋月"
+               ]
+   , examples (datetimeIntervalHoliday ((2018, 9, 9, 0, 0, 0), (2018, 9, 12, 0, 0, 0)) Day "犹太新年")
+              [ "2018年犹太新年"
+              , "2018年猶太新年"
+              ]
+  , examples (datetimeIntervalHoliday ((2018, 5, 19, 0, 0, 0), (2018, 5, 22, 0, 0, 0)) Day "七七节")
+             [ "2018年七七节"
+             , "2018年沙夫幼特节"
+             , "2018年週日節"
+             , "2018年收获节"
+             , "2018年新果实节"
+             , "2018年新果實節"
+             , "2018年收穫節"
+             ]
+   , examples (datetimeIntervalHoliday ((2018, 9, 23, 0, 0, 0), (2018, 10, 2, 0, 0, 0)) Day "住棚节")
+              [ "2018年住棚节"
+              , "2018年住棚節"
+              ]
+  , examples (datetimeIntervalHoliday ((2016, 3, 19, 20, 30, 0), (2016, 3, 19, 21, 31, 0)) Minute "地球一小时")
+             [ "2016年地球一小时"
+             , "2016年地球一小時"
              ]
   ]
diff --git a/Duckling/Time/ZH/HK/Corpus.hs b/Duckling/Time/ZH/HK/Corpus.hs
--- a/Duckling/Time/ZH/HK/Corpus.hs
+++ b/Duckling/Time/ZH/HK/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Time/ZH/HK/Rules.hs b/Duckling/Time/ZH/HK/Rules.hs
--- a/Duckling/Time/ZH/HK/Rules.hs
+++ b/Duckling/Time/ZH/HK/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Time/ZH/MO/Corpus.hs b/Duckling/Time/ZH/MO/Corpus.hs
--- a/Duckling/Time/ZH/MO/Corpus.hs
+++ b/Duckling/Time/ZH/MO/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Time/ZH/MO/Rules.hs b/Duckling/Time/ZH/MO/Rules.hs
--- a/Duckling/Time/ZH/MO/Rules.hs
+++ b/Duckling/Time/ZH/MO/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -14,19 +13,21 @@
   ( rules
   ) where
 
-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 Duckling.Regex.Types
+import Duckling.Time.Computed
 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 qualified Duckling.Numeral.Types as TNumeral
 
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
@@ -37,6 +38,15 @@
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
+ruleTwoDaysAfterTomorrow :: Rule
+ruleTwoDaysAfterTomorrow = Rule
+  { name = "two days after tomorrow"
+  , pattern =
+    [ regex "大后天|大後天|大後日"
+    ]
+  , prod = \_ -> tt $ cycleNth TG.Day 3
+  }
+
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
@@ -48,8 +58,7 @@
   , prod = \tokens -> case tokens of
       (Token Time td:_:token:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
@@ -64,18 +73,17 @@
   , prod = \tokens -> case tokens of
       (Token Time td:_:token:_) -> do
         n <- getIntValue token
-        t <- minutesBefore n td
-        Just $ Token Time t
+        Token Time <$> minutesBefore n td
       _ -> Nothing
   }
 
 ruleRelativeMinutesAfterpastIntegerHourofday :: Rule
 ruleRelativeMinutesAfterpastIntegerHourofday = Rule
-  { name = "relative minutes after|past <integer> (hour-of-day)"
+  { name = "relative (10-59) minutes after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
     , regex "点|點"
-    , Predicate $ isIntegerBetween 1 59
+    , Predicate $ isIntegerBetween 10 59
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -87,6 +95,117 @@
       _ -> Nothing
   }
 
+ruleRelativeMinutesAfterpastIntegerHourofday2 :: Rule
+ruleRelativeMinutesAfterpastIntegerHourofday2 = Rule
+  { name = "relative (10-59) minutes after|past <integer> (hour-of-day)"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "点|點"
+    , Predicate $ isIntegerBetween 10 59
+    , regex "分"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       _:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute True hours n
+      _ -> Nothing
+  }
+
+ruleRelativeMinutesAfterpastIntegerHourofday3 :: Rule
+ruleRelativeMinutesAfterpastIntegerHourofday3 = Rule
+  { name = "relative (1-9) minutes after|past <integer> (hour-of-day)"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "点零|點零"
+    , Predicate $ isIntegerBetween 1 9
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       _:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute True hours n
+      _ -> Nothing
+  }
+
+ruleRelativeMinutesAfterpastIntegerHourofday4 :: Rule
+ruleRelativeMinutesAfterpastIntegerHourofday4 = Rule
+  { name = "relative (1-9) minutes after|past <integer> (hour-of-day)"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "点零|點零"
+    , Predicate $ isIntegerBetween 1 9
+    , regex "分"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       _:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute True hours n
+      _ -> Nothing
+  }
+
+ruleRelativeMinutesAfterpastIntegerHourofday5 :: Rule
+ruleRelativeMinutesAfterpastIntegerHourofday5 = Rule
+  { name = "number of 5 minutes after|past <integer> (hour-of-day)"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "点踏|點踏|点搭|點搭"
+    , Predicate $ isIntegerBetween 1 11
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       _:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute True hours (5*n)
+      _ -> Nothing
+  }
+
+ruleRelativeMinutesAfterpastIntegerHourofday6 :: Rule
+ruleRelativeMinutesAfterpastIntegerHourofday6 = Rule
+  { name = "number of 5 minutes after|past <integer> (hour-of-day)"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "点|點"
+    , Predicate $ isIntegerBetween 1 9
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       _:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute True hours (5*n)
+      _ -> Nothing
+  }
+
+ruleRelativeMinutesAfterpastIntegerHourofday7 :: Rule
+ruleRelativeMinutesAfterpastIntegerHourofday7 = Rule
+  { name = "number of 5 minutes after|past <integer> (hour-of-day)"
+  , pattern =
+    [ Predicate isAnHourOfDay
+    , regex "点|點"
+    , Predicate $ isIntegerBetween 1 11
+    , regex "個字"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
+       _:
+       token:
+       _) -> do
+        n <- getIntValue token
+        tt $ hourMinute True hours (5*n)
+      _ -> Nothing
+  }
+
 ruleRelativeMinutesAfterpastNoonmidnight :: Rule
 ruleRelativeMinutesAfterpastNoonmidnight = Rule
   { name = "relative minutes after|past noon|midnight"
@@ -185,7 +304,7 @@
   { name = "half after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "点|點"
+    , regex "(点|點)(踏|搭)?"
     , regex "半"
     ]
   , prod = \tokens -> case tokens of
@@ -229,8 +348,7 @@
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ predNth 0 False td
+      (_:Token Time td:_) -> tt $ predNth 0 False td
       _ -> Nothing
   }
 
@@ -254,11 +372,10 @@
   { name = "last <time>"
   , pattern =
     [ regex "去|上(个|個)?"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ predNth (-1) False td
+      (_:Token Time td:_) -> tt $ predNth (-1) False td
       _ -> Nothing
   }
 
@@ -270,8 +387,7 @@
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Duration dd:_) ->
-        tt $ inDuration dd
+      (_:Token Duration dd:_) -> tt $ inDuration dd
       _ -> Nothing
   }
 
@@ -281,7 +397,7 @@
   , pattern =
     [ regex "现在|此时|此刻|当前|現在|此時|當前|\x5b9c\x5bb6|\x800c\x5bb6|\x4f9d\x5bb6"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
+  , prod = \_ -> tt now
   }
 
 ruleTheCycleAfterTime :: Rule
@@ -320,7 +436,7 @@
   , pattern =
     [ regex "中午"
     ]
-  , prod = \_ -> tt $ hour False 12
+  , prod = \_ -> tt $ mkOkForThisNext $ hour False 12
   }
 
 ruleToday :: Rule
@@ -329,7 +445,7 @@
   , pattern =
     [ regex "今天|今日"
     ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
+  , prod = \_ -> tt today
   }
 
 ruleNextDayofweek :: Rule
@@ -393,6 +509,20 @@
       _ -> Nothing
   }
 
+
+ruleLastDuration :: Rule
+ruleLastDuration = Rule
+  { name = "last <duration>"
+  , pattern =
+    [ regex "上(个|個)?"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Duration dd:_) ->
+        tt $ durationAgo dd
+      _ -> Nothing
+  }
+
 ruleAfternoon :: Rule
 ruleAfternoon = Rule
   { name = "afternoon"
@@ -412,7 +542,7 @@
   , pattern =
     [ regex "午夜|凌晨|半夜"
     ]
-  , prod = \_ -> tt $ hour False 0
+  , prod = \_ -> tt $ mkOkForThisNext $ hour False 0
   }
 
 ruleInduringThePartofday :: Rule
@@ -483,6 +613,27 @@
       _ -> Nothing
   }
 
+ruleYearNumericWithYearSymbol2 :: Rule
+ruleYearNumericWithYearSymbol2 = Rule
+  { name = "xxxx year"
+  , pattern =
+    [ dimension Numeral
+    , dimension Numeral
+    , dimension Numeral
+    , dimension Numeral
+    , regex "年"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = y1}:
+        Token Numeral NumeralData{TNumeral.value = y2}:
+        Token Numeral NumeralData{TNumeral.value = y3}:
+        Token Numeral NumeralData{TNumeral.value = y4}:
+        _) -> do
+        let v = floor(y1*1000 + y2*100 + y3*10 + y4)
+        tt $ year v
+      _ -> Nothing
+  }
+
 ruleDurationAgo :: Rule
 ruleDurationAgo = Rule
   { name = "<duration> ago"
@@ -573,7 +724,7 @@
   , pattern =
     [ regex "周末|週末"
     ]
-  , prod = \_ -> tt weekend
+  , prod = \_ -> tt $ mkOkForThisNext weekend
   }
 
 ruleLastYear :: Rule
@@ -603,7 +754,7 @@
   { name = "next <time>"
   , pattern =
     [ regex "明|下(个|個)?"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -696,7 +847,7 @@
   { name = "this <time>"
   , pattern =
     [ regex "今(个|個)?|这(个)?|這(個)?"
-    , dimension Time
+    , Predicate isOkWithThisNext
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -751,6 +902,20 @@
       _ -> Nothing
   }
 
+ruleDayOfMonth :: Rule
+ruleDayOfMonth = Rule
+  { name = "<time> <day-of-month>"
+  , pattern =
+    [ Predicate $ isIntegerBetween 1 31
+    , regex "号|號|日"
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        v <- getIntValue token
+        tt $ dayOfMonth v
+      _ -> Nothing
+  }
+
 rulePartofdayDimTime :: Rule
 rulePartofdayDimTime = Rule
   { name = "<part-of-day> <dim time>"
@@ -764,20 +929,6 @@
       _ -> Nothing
   }
 
-ruleMonthNumericWithMonthSymbol :: Rule
-ruleMonthNumericWithMonthSymbol = Rule
-  { name = "month (numeric with month symbol)"
-  , pattern =
-    [ Predicate $ isIntegerBetween 1 12
-    , regex "月"
-    ]
-  , prod = \tokens -> case tokens of
-      (token:_) -> do
-        v <- getIntValue token
-        tt . mkLatent $ month v
-      _ -> Nothing
-  }
-
 ruleTonight :: Rule
 ruleTonight = Rule
   { name = "tonight"
@@ -785,9 +936,8 @@
     [ regex "今晚|今天晚上"
     ]
   , prod = \_ -> do
-      let td1 = cycleNth TG.Day 0
       td2 <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay <$> intersect td1 td2
+      Token Time . partOfDay <$> intersect today td2
   }
 
 ruleTomorrowNight :: Rule
@@ -900,18 +1050,18 @@
 
 ruleMonths :: [Rule]
 ruleMonths = mkRuleMonths
-  [ ( "January", "一月(份)?" )
-  , ( "February", "二月(份)?" )
-  , ( "March", "三月(份)?" )
-  , ( "April", "四月(份)?" )
-  , ( "May", "五月(份)?" )
-  , ( "June", "六月(份)?" )
-  , ( "July", "七月(份)?" )
-  , ( "August", "八月(份)?" )
-  , ( "September", "九月(份)?" )
-  , ( "October", "十月(份)?" )
-  , ( "November", "十一月(份)?" )
-  , ( "December", "十二月(份)?" )
+  [ ( "January", "(一|1)月(份)?" )
+  , ( "February", "(二|2)月(份)?" )
+  , ( "March", "(三|3)月(份)?" )
+  , ( "April", "(四|4)月(份)?" )
+  , ( "May", "(五|5)月(份)?" )
+  , ( "June", "(六|6)月(份)?" )
+  , ( "July", "(七|7)月(份)?" )
+  , ( "August", "(八|8)月(份)?" )
+  , ( "September", "(九|9)月(份)?" )
+  , ( "October", "(十|10)月(份)?" )
+  , ( "November", "(十一|11)月(份)?" )
+  , ( "December", "(十二|12)月(份)?" )
   ]
 
 rulePeriodicHolidays :: [Rule]
@@ -974,6 +1124,155 @@
   , ( "母亲节", "母(亲节|親節)", nthDOWOfMonth 2 7 5 )
   ]
 
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "耶稣升天节", "耶(稣|穌)升天(节|節|日)"
+    , cycleNthAfter False TG.Day 39 easterSunday )
+  , ( "大斋首日", "大(斋|齋)首日|(圣|聖)灰((礼仪|禮儀)?日|星期三)|灰日"
+    , cycleNthAfter False TG.Day (-46) easterSunday )
+  , ( "阿舒拉节", "阿舒拉(节|節)"
+    , cycleNthAfter False TG.Day 9 muharram )
+  , ( "克哈特普迦节", "克哈特普迦(节|節)"
+    , cycleNthAfter False TG.Day 8 dhanteras )
+  , ( "春节", "春(节|節)|(农历|農曆|唐人)新年|新(正|春)|正月(正(时|時)|朔日)|岁首"
+    , chineseNewYear )
+  , ( "基督圣体节", "基督(圣体|聖體)((圣|聖)血)?((节|節)|瞻(礼|禮))"
+    , cycleNthAfter False TG.Day 60 easterSunday )
+  , ( "排灯节", "(排|万|萬|印度)(灯节|燈節)"
+    , cycleNthAfter False TG.Day 2 dhanteras )
+  , ( "复活节星期一", "(复|復)活(节|節)星期一"
+    , cycleNthAfter False TG.Day 1 easterSunday )
+  , ( "复活节", "(复|復)活(节|節)|主(复|復)活日", easterSunday )
+  , ( "古尔邦节", "古(尔|爾)邦(节|節)|宰牲(节|節)"
+    , eidalAdha )
+  , ( "开斋节", "(开斋|開齋|肉孜|(尔|爾)代)(节|節)", eidalFitr )
+  , ( "耶稣受难日", "(耶(稣|穌)|主)受(难|難)(节|節|日)|(圣|聖|沈默)(周|週)五"
+    , cycleNthAfter False TG.Day (-2) easterSunday )
+  , ( "侯丽节", "((侯|荷)(丽|麗)|洒红|灑紅|欢悦|歡悅|五彩|胡里|好利|霍利)(节|節)"
+    , cycleNthAfter False TG.Day 39 vasantPanchami )
+  , ( "圣周六"
+    , "神?(圣周|聖週)六|(耶(稣|穌)|主)受(难|難)(节|節|日)翌日|(复|復)活(节|節)前夜|黑色星期六"
+    , cycleNthAfter False TG.Day (-1) easterSunday )
+  , ( "伊斯兰新年", "伊斯兰(教)?(历)?新年"
+    , muharram )
+  , ( "登霄节"
+    , "(夜行)?登霄(节|節)"
+    , cycleNthAfter False TG.Day 26 rajab
+    )
+  , ( "印度丰收节第四天", "(印度(丰|豐)收|(庞|龐)格(尔|爾))(节|節)第四天"
+    , cycleNthAfter False TG.Day 2 thaiPongal )
+  , ( "篝火节", "((犹|猶)太教)?篝火(节|節)", lagBaOmer )
+  , ( "法令之夜"
+    , "(法令|命运|权力)之夜"
+    , cycleNthAfter False TG.Day 26 ramadan )
+  , ( "拉撒路圣周六", "拉撒路(圣周|聖週)六|拉匝路(周|週)六"
+    , cycleNthAfter False TG.Day (-8) orthodoxEaster )
+  , ( "印度丰收节第三天", "(印度(丰|豐)收|(庞|龐)格(尔|爾))(节|節)第三天"
+    , cycleNthAfter False TG.Day 1 thaiPongal )
+  , ( "神圣星期四"
+    , "濯足(节|節)|神(圣|聖)星期四|(圣周|聖週)(星期)?四|(设|設)立(圣|聖)餐日"
+    , cycleNthAfter False TG.Day (-3) easterSunday )
+  , ( "圣纪节" , "圣纪节|聖紀節", mawlid )
+  , ( "东正教复活节星期一", "(东|東)正教(复|復)活(节|節)星期一"
+    , cycleNthAfter False TG.Day 1 orthodoxEaster )
+  , ( "东正教复活节", "(东|東)正教((复|復)活(节|節)|主(复|復)活日)"
+    , orthodoxEaster )
+  , ( "东正教圣周六"
+    , "(东|東)正教(神?(圣周|聖週)六|(耶(稣|穌)|主)受(难|難)(节|節|日)翌日|(复|復)活(节|節)前夜)"
+    , cycleNthAfter False TG.Day (-1) orthodoxEaster )
+  , ( "东正教耶稣受难日", "(东|東)正教((耶(稣|穌)|主)受(难|難)(节|節|日)|(圣|聖|沈默)(周|週)五)"
+    , cycleNthAfter False TG.Day (-2) orthodoxEaster )
+  , ( "东正教棕枝主日", "(东|東)正教((棕|圣|聖)枝|圣树|聖樹|基督苦(难|難))主日"
+    , cycleNthAfter False TG.Day (-7) orthodoxEaster )
+  , ( "棕枝主日", "((棕|圣|聖)枝|圣树|聖樹|基督苦(难|難))主日"
+    , cycleNthAfter False TG.Day (-7) easterSunday )
+  , ( "五旬节", "五旬(节|節)|(圣灵|聖靈)降(临|臨)(日|节|節)"
+    , cycleNthAfter False TG.Day 49 easterSunday )
+  , ( "印度兄妹节", "(印度兄妹|拉克沙班丹)(节|節)", rakshaBandhan )
+  , ( "圣会节", "(圣|聖)会(节|節)"
+    , cycleNthAfter False TG.Day 21 roshHashana )
+  , ( "忏悔节", "忏悔(节|節|火曜日)|煎(饼|餅)星期二"
+    , cycleNthAfter False TG.Day (-47) easterSunday )
+  , ( "西赫托拉节", "(西赫(托拉|妥拉)|诵经|誦經|转经|轉經|律法|(欢庆圣|歡慶聖)法)(节|節)"
+    , cycleNthAfter False TG.Day 22 roshHashana )
+  , ( "印度丰收节", "(印度|淡米(尔|爾))(丰|豐)收(节|節)", thaiPongal )
+  , ( "欧南节", "欧南(节|節)", thiruOnam )
+  , ( "圣殿被毁日", "((圣|聖)殿被毁|禁食)日", tishaBAv )
+  , ( "圣三一主日", "((天主)?(圣|聖)?三一|(圣|聖)三)(主日|节|節)"
+    , cycleNthAfter False TG.Day 56 easterSunday )
+  , ( "十胜节", "(十(胜|勝)|(凯|凱)旋|(圣|聖)母)(节|節)"
+    , cycleNthAfter False TG.Day 9 navaratri )
+  -- 15th day of Shevat
+  , ( "犹太植树节", "((犹|猶)太植(树|樹)|(图|圖)比舍巴特)(节|節)|(树|樹)木新年", tuBishvat )
+  -- day of the full moon in May in the Gregorian calendar
+  , ( "卫塞节", "((卫|衛)塞|威瑟|比(萨宝|薩寶)蕉)(节|節)", vesak )
+  , ( "以色列独立日", "以色列((独|獨)立日|国庆节|國慶節)", yomHaatzmaut )
+  , ( "赎罪日", "(赎|贖)罪日", cycleNthAfter False TG.Day 9 roshHashana )
+  , ( "圣灵节庆日", "(圣灵节庆|聖靈節慶)日"
+    , cycleNthAfter False TG.Day 50 easterSunday )
+
+  -- Other
+  , ( "老板节", "老(板节|闆節)"
+    , predNthClosest 0 weekday (monthDay 10 16) )
+  ]
+
+ruleComputedHolidays' :: [Rule]
+ruleComputedHolidays' = mkRuleHolidays'
+  [ ( "全球青年服务日", "全球青年服(务|務)日"
+    , let start = globalYouthServiceDay
+          end = cycleNthAfter False TG.Day 2 globalYouthServiceDay
+        in interval TTime.Open start end )
+  , ( "四旬节", "四旬(节|節)"
+    , let start = cycleNthAfter False TG.Day (-48) orthodoxEaster
+          end = cycleNthAfter False TG.Day (-9) orthodoxEaster
+        in interval TTime.Open start end )
+  , ( "光明节", "(光明|修殿|(献|獻)殿|(烛|燭)光|哈努卡|(马|馬)加比)(节|節)"
+    , let start = chanukah
+          end = cycleNthAfter False TG.Day 7 chanukah
+        in interval TTime.Open start end )
+  , ( "大斋期", "大(斋|齋)(期|节|節)"
+    , let start = cycleNthAfter False TG.Day (-46) easterSunday
+          end = cycleNthAfter False TG.Day (-1) easterSunday
+        in interval TTime.Open start end )
+  , ( "九夜节", "(九夜|(难|難)近母)(节|節)"
+    , let start = navaratri
+          end = cycleNthAfter False TG.Day 9 navaratri
+        in interval TTime.Open start end )
+  , ( "逾越节", "逾越(节|節)"
+    , let start = passover
+          end = cycleNthAfter False TG.Day 8 passover
+        in interval TTime.Open start end )
+  , ( "斋月", "(穆斯林)?(斋|齋)月"
+    , let start = ramadan
+          end = cycleNthAfter False TG.Day (-1) eidalFitr
+        in interval TTime.Open start end )
+  , ( "犹太新年", "(犹|猶)太新年"
+    , let start = roshHashana
+          end = cycleNthAfter False TG.Day 2 roshHashana
+        in interval TTime.Open start end )
+  , ( "七七节", "(七七|沙夫幼特|(周|週)日|收(获|穫)|新果(实|實))(节|節)"
+    , let start = cycleNthAfter False TG.Day 50 passover
+          end = cycleNthAfter False TG.Day 52 passover
+        in interval TTime.Open start end )
+  , ( "住棚节", "住棚(节|節)"
+    , let start = cycleNthAfter False TG.Day 14 roshHashana
+          end = cycleNthAfter False TG.Day 22 roshHashana
+        in interval TTime.Open start end )
+
+  -- Other
+  -- Last Saturday of March unless it falls on Holy Saturday
+  -- In which case it's the Saturday before
+  , ( "地球一小时", "地球一小(时|時)"
+    , let holySaturday = cycleNthAfter False TG.Day (-1) easterSunday
+          tentative = predLastOf (dayOfWeek 6) (month 3)
+          alternative = cycleNthAfter False TG.Day (-7) tentative
+        in do
+          day <- intersectWithReplacement holySaturday tentative alternative
+          start <- intersect day $ hourMinute True 20 30
+          interval TTime.Closed start $ cycleNthAfter False TG.Minute 60 start )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleAbsorptionOfAfterNamedDay
@@ -998,7 +1297,6 @@
   , ruleMidnight
   , ruleMmdd
   , ruleMmddyyyy
-  , ruleMonthNumericWithMonthSymbol
   , ruleMorning
   , ruleNamedmonthDayofmonth
   , ruleNextCycle
@@ -1026,6 +1324,7 @@
   , ruleTheCycleAfterTime
   , ruleTheCycleBeforeTime
   , ruleTheDayAfterTomorrow
+  , ruleTwoDaysAfterTomorrow
   , ruleTheDayBeforeYesterday
   , ruleThisCycle
   , ruleThisDayofweek
@@ -1040,10 +1339,21 @@
   , ruleTonight
   , ruleWeekend
   , ruleYearNumericWithYearSymbol
+  , ruleYearNumericWithYearSymbol2
   , ruleYesterday
   , ruleYyyymmdd
   , ruleTimezone
+  , ruleRelativeMinutesAfterpastIntegerHourofday2
+  , ruleRelativeMinutesAfterpastIntegerHourofday3
+  , ruleRelativeMinutesAfterpastIntegerHourofday4
+  , ruleRelativeMinutesAfterpastIntegerHourofday5
+  , ruleRelativeMinutesAfterpastIntegerHourofday6
+  , ruleRelativeMinutesAfterpastIntegerHourofday7
+  , ruleLastDuration
+  , ruleDayOfMonth
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ ruleComputedHolidays
+  ++ ruleComputedHolidays'
   ++ rulePeriodicHolidays
diff --git a/Duckling/Time/ZH/TW/Corpus.hs b/Duckling/Time/ZH/TW/Corpus.hs
--- a/Duckling/Time/ZH/TW/Corpus.hs
+++ b/Duckling/Time/ZH/TW/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Time/ZH/TW/Rules.hs b/Duckling/Time/ZH/TW/Rules.hs
--- a/Duckling/Time/ZH/TW/Rules.hs
+++ b/Duckling/Time/ZH/TW/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/AR/Rules.hs b/Duckling/TimeGrain/AR/Rules.hs
--- a/Duckling/TimeGrain/AR/Rules.hs
+++ b/Duckling/TimeGrain/AR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/TimeGrain/BG/Rules.hs b/Duckling/TimeGrain/BG/Rules.hs
--- a/Duckling/TimeGrain/BG/Rules.hs
+++ b/Duckling/TimeGrain/BG/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/DE/Rules.hs b/Duckling/TimeGrain/DE/Rules.hs
--- a/Duckling/TimeGrain/DE/Rules.hs
+++ b/Duckling/TimeGrain/DE/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -22,7 +21,7 @@
 
 grains :: [(Text, String, TG.Grain)]
 grains = [ ("second (grain)", "sekunden?", TG.Second)
-         , ("minute (grain)", "minuten?", TG.Minute)
+         , ("minute (grain)", "min(uten?)?", TG.Minute)
          , ("hour (grain)", "stunden?", TG.Hour)
          , ("day (grain)", "tage?n?", TG.Day)
          , ("week (grain)", "wochen?", TG.Week)
diff --git a/Duckling/TimeGrain/EL/Rules.hs b/Duckling/TimeGrain/EL/Rules.hs
--- a/Duckling/TimeGrain/EL/Rules.hs
+++ b/Duckling/TimeGrain/EL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/TimeGrain/EN/Rules.hs b/Duckling/TimeGrain/EN/Rules.hs
--- a/Duckling/TimeGrain/EN/Rules.hs
+++ b/Duckling/TimeGrain/EN/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -22,7 +21,7 @@
 
 grains :: [(Text, String, TG.Grain)]
 grains = [ ("second (grain) ", "sec(ond)?s?",      TG.Second)
-         , ("minute (grain)" , "min(ute)?s?",      TG.Minute)
+         , ("minute (grain)" , "m(in(ute)?s?)?",   TG.Minute)
          , ("hour (grain)"   , "h(((ou)?rs?)|r)?", TG.Hour)
          , ("day (grain)"    , "days?",            TG.Day)
          , ("week (grain)"   , "weeks?",           TG.Week)
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/FI/Rules.hs b/Duckling/TimeGrain/FI/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/FI/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.TimeGrain.FI.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) ", "sekuntia?|s", TG.Second)
+         , ("minute (grain)" , "minuuttia?|min", TG.Minute)
+         , ("hour (grain)"   , "tuntia?|h", TG.Hour)
+         , ("day (grain)"    , "päivä(ä)?|vuorokau(si|tta)|vrk|d", TG.Day)
+         , ("week (grain)"   , "viikkoa?|vko?", TG.Week)
+         , ("month (grain)"  , "kuukau(si|tta)|kk", TG.Month)
+         , ("quarter (grain)", "kvartaali(a)?|neljännesvuo(si|tta)", TG.Quarter)
+         , ("year (grain)"   , "vuo(si|tta)|v\\.?|a", 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/FR/Rules.hs b/Duckling/TimeGrain/FR/Rules.hs
--- a/Duckling/TimeGrain/FR/Rules.hs
+++ b/Duckling/TimeGrain/FR/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/TimeGrain/HI/Rules.hs b/Duckling/TimeGrain/HI/Rules.hs
--- a/Duckling/TimeGrain/HI/Rules.hs
+++ b/Duckling/TimeGrain/HI/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/TimeGrain/HU/Rules.hs b/Duckling/TimeGrain/HU/Rules.hs
--- a/Duckling/TimeGrain/HU/Rules.hs
+++ b/Duckling/TimeGrain/HU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/TimeGrain/IT/Rules.hs b/Duckling/TimeGrain/IT/Rules.hs
--- a/Duckling/TimeGrain/IT/Rules.hs
+++ b/Duckling/TimeGrain/IT/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/KA/Rules.hs b/Duckling/TimeGrain/KA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/KA/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.TimeGrain.KA.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.TimeGrain.Types
+import Duckling.Types
+
+grains :: [(Text, String, Grain)]
+grains = [ ("second (grain)" , "წამ(ით|ი|ში|ს)?", Second)
+         , ("minute (grain)" , "წუთ(ით|ი|ში|ს)?", Minute)
+         , ("hour (grain)" , "საათ(ით|ი|ში|ს)?", Hour)
+         , ("day (grain)" , "დღით|დღის|დღე?(ში)?ს?", Day)
+         , ("week (grain)" , "კვირ(აში)?(ას|ით|ის|ა)?", Week)
+         , ("month (grain)" , "თვ(ეში|ით|ის|ეს|ს|ე)?", Month)
+         , ("quarter (grain)" , "კვარტა?ლ(ით|ი|ში|ს)?", Quarter)
+         , ("year (grain)" , "წლით|წელიწადი?(ით|ი|ში|ის|ს)?|წე?ლი?(ით|ის|ში|ს|იდან)?", Year)
+         ]
+
+rules :: [Rule]
+rules = map go grains
+  where
+    go (name, regexPattern, grain) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = const $ Just $ Token TimeGrain grain
+      }
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/MN/Rules.hs b/Duckling/TimeGrain/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/MN/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.TimeGrain.MN.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.TimeGrain.Types
+import Duckling.Types
+
+grains :: [(Text, String, Grain)]
+grains = [ ("second (grain) ", "сек(унд)?",   Second)
+         , ("minute (grain)" , "мин(ут)?",    Minute)
+         , ("hour (grain)"   , "ц(аг)?",       Hour)
+         , ("day (grain)"    , "өдөр?",       Day)
+         , ("week (grain)"   , "долоо хоног?",     Week)
+         , ("month (grain)"  , "сар?",        Month)
+         , ("quarter (grain)", "улирал?",         Quarter)
+         , ("year (grain)"   , "жил?|жил",           Year)
+         ]
+
+rules :: [Rule]
+rules = map go grains
+  where
+    go (name, regexPattern, grain) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> Just $ Token TimeGrain grain
+      }
diff --git a/Duckling/TimeGrain/NB/Rules.hs b/Duckling/TimeGrain/NB/Rules.hs
--- a/Duckling/TimeGrain/NB/Rules.hs
+++ b/Duckling/TimeGrain/NB/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/NL/Rules.hs b/Duckling/TimeGrain/NL/Rules.hs
--- a/Duckling/TimeGrain/NL/Rules.hs
+++ b/Duckling/TimeGrain/NL/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,23 +2,23 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.TimeGrain.PT.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
 import Data.Text (Text)
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Dimensions.Types
-import qualified Duckling.TimeGrain.Types as TG
 import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
 
 grains :: [(Text, String, TG.Grain)]
 grains = [ ("segundo (grain)", "seg(undo)?s?", TG.Second)
@@ -27,6 +27,7 @@
          , ("dia (grain)", "d(í|i)as?", TG.Day)
          , ("semana (grain)", "semanas?", TG.Week)
          , ("mes (grain)", "m(e|ê)s(es)?", TG.Month)
+         , ("trimestre (grain)", "trimestres?", TG.Quarter)
          , ("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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/TimeGrain/RU/Rules.hs b/Duckling/TimeGrain/RU/Rules.hs
--- a/Duckling/TimeGrain/RU/Rules.hs
+++ b/Duckling/TimeGrain/RU/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -21,14 +20,14 @@
 import qualified Duckling.TimeGrain.Types  as TG
 
 grains :: [(Text, String, TG.Grain)]
-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ün",             TG.Day)
-         , ("hafta (grain)",      "hafta",                TG.Week)
-         , ("ay (grain)",         "ay",                   TG.Month)
-         , ("çeyrek yıl (grain)", "\231eyrek y\305l",     TG.Quarter)
-         , ("yıl (grain)",        "y\305l",               TG.Year)
+grains = [ ("saniye (grain)",     "sa?n(iye)?(nin)?",           TG.Second)
+         , ("dakika (grain)",     "da?k(ika)?(nın)?",           TG.Minute)
+         , ("saat (grain)",       "sa(at)?(in)?",              TG.Hour)
+         , ("gün (grain)",        "gün(ün)?",             TG.Day)
+         , ("hafta (grain)",      "hafta(nın)?",                TG.Week)
+         , ("ay (grain)",         "ay(ın)?",                   TG.Month)
+         , ("çeyrek yıl (grain)", "\231eyrek y\305l(ın)?",     TG.Quarter)
+         , ("yıl (grain)",        "y\305l(ın)?",               TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/Types.hs b/Duckling/TimeGrain/Types.hs
--- a/Duckling/TimeGrain/Types.hs
+++ b/Duckling/TimeGrain/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
diff --git a/Duckling/TimeGrain/UK/Rules.hs b/Duckling/TimeGrain/UK/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/UK/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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.TimeGrain.UK.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)", "секунд(а|и|і|у)?|сек", 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]
+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/VI/Rules.hs b/Duckling/TimeGrain/VI/Rules.hs
--- a/Duckling/TimeGrain/VI/Rules.hs
+++ b/Duckling/TimeGrain/VI/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -24,7 +23,7 @@
 grains = [ ("second (grain)", "秒(钟|鐘)?", TG.Second)
          , ("minute (grain)", "分(钟|鐘)?", TG.Minute)
          , ("hour (grain)",
-             "小时|小時|鐘(\x982d)?", TG.Hour)
+             "小时|小時|個鐘|鐘(\x982d)?", TG.Hour)
          , ("day (grain)", "天|日", TG.Day)
          , ("week (grain)",
              "周|週|礼拜|禮拜|星期", TG.Week)
diff --git a/Duckling/Types.hs b/Duckling/Types.hs
--- a/Duckling/Types.hs
+++ b/Duckling/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE AllowAmbiguousTypes #-}
@@ -13,7 +12,9 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE StandaloneDeriving #-}
@@ -27,21 +28,25 @@
 import Data.GADT.Compare
 import Data.GADT.Show
 import Data.Hashable
+import Data.HashMap.Strict (HashMap)
 import Data.HashSet (HashSet)
+import Data.List (intersperse, sortOn)
 import Data.Maybe
-import Data.Some
-import Data.Text (Text)
+import Data.Text (Text, toLower, unpack)
 import Data.Typeable ((:~:)(Refl), eqT, Typeable)
 import GHC.Generics
 import Prelude
 import TextShow (TextShow(..))
 import qualified Data.ByteString.Lazy as LB
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as TT
 import qualified Data.Text.Encoding as Text
 import qualified Text.Regex.Base as R
 import qualified Text.Regex.PCRE as PCRE
 import qualified TextShow as TS
 
 import Duckling.AmountOfMoney.Types (AmountOfMoneyData)
+import Duckling.CreditCardNumber.Types (CreditCardNumberData)
 import Duckling.Distance.Types (DistanceData)
 import Duckling.Duration.Types (DurationData)
 import Duckling.Email.Types (EmailData)
@@ -50,7 +55,7 @@
 import Duckling.Ordinal.Types (OrdinalData)
 import Duckling.PhoneNumber.Types (PhoneNumberData)
 import Duckling.Quantity.Types (QuantityData)
-import Duckling.Regex.Types (GroupMatch)
+import Duckling.Regex.Types
 import Duckling.Resolve
 import Duckling.Temperature.Types (TemperatureData)
 import Duckling.Time.Types (TimeData)
@@ -77,14 +82,32 @@
   rnf (Token _ v) = rnf v
 
 -- -----------------------------------------------------------------
+-- Seal
+
+data Seal s where
+  Seal :: s a -> Seal s
+
+instance GEq s => Eq (Seal s) where
+  Seal x == Seal y =
+    defaultEq x y
+
+instance GShow s => Show (Seal s) where
+  showsPrec p (Seal s)
+    = showParen (p > 10) (showString "Seal " . gshowsPrec 11 s)
+
+withSeal :: Seal s -> (forall t. s t -> r) -> r
+withSeal (Seal x) f = f x
+
+-- -----------------------------------------------------------------
 -- Dimension
 
-class (Show a, Typeable a) => CustomDimension a where
+class (Show a, Typeable a, Typeable (DimensionData  a)) =>
+    CustomDimension a where
   type DimensionData a
   dimRules :: a -> [Rule]
   dimLangRules :: Lang -> a -> [Rule]
   dimLocaleRules :: Region -> a -> [Rule]
-  dimDependents :: a -> HashSet (Some Dimension)
+  dimDependents :: a -> HashSet (Seal Dimension)
 
 -- | GADT for differentiating between dimensions
 -- Each dimension should have its own constructor and provide the data structure
@@ -92,6 +115,7 @@
 data Dimension a where
   RegexMatch :: Dimension GroupMatch
   AmountOfMoney :: Dimension AmountOfMoneyData
+  CreditCardNumber :: Dimension CreditCardNumberData
   Distance :: Dimension DistanceData
   Duration :: Dimension DurationData
   Email :: Dimension EmailData
@@ -109,6 +133,7 @@
 -- Show
 instance Show (Dimension a) where
   show RegexMatch = "RegexMatch"
+  show CreditCardNumber = "CreditCardNumber"
   show Distance = "Distance"
   show Duration = "Duration"
   show Email = "Email"
@@ -128,12 +153,12 @@
 -- TextShow
 instance TextShow (Dimension a) where
   showb d = TS.fromString $ show d
-instance TextShow (Some Dimension) where
-  showb (This d) = showb d
+instance TextShow (Seal Dimension) where
+  showb (Seal d) = showb d
 
 -- Hashable
-instance Hashable (Some Dimension) where
-  hashWithSalt s (This a) = hashWithSalt s a
+instance Hashable (Seal Dimension) where
+  hashWithSalt s (Seal a) = hashWithSalt s a
 instance Hashable (Dimension a) where
   hashWithSalt s RegexMatch          = hashWithSalt s (0::Int)
   hashWithSalt s Distance            = hashWithSalt s (1::Int)
@@ -150,10 +175,13 @@
   hashWithSalt s Url                 = hashWithSalt s (12::Int)
   hashWithSalt s Volume              = hashWithSalt s (13::Int)
   hashWithSalt s (CustomDimension _) = hashWithSalt s (14::Int)
+  hashWithSalt s CreditCardNumber    = hashWithSalt s (15::Int)
 
 instance GEq Dimension where
   geq RegexMatch RegexMatch = Just Refl
   geq RegexMatch _ = Nothing
+  geq CreditCardNumber CreditCardNumber = Just Refl
+  geq CreditCardNumber _ = Nothing
   geq Distance Distance = Just Refl
   geq Distance _ = Nothing
   geq Duration Duration = Just Refl
@@ -308,3 +336,21 @@
 
 dimension :: Typeable a => Dimension a -> PatternItem
 dimension value = Predicate $ isDimension value
+
+-- -----------------------------------------------------------------
+-- Rule Construction helpers
+
+singleStringLookupRule :: HashMap Text a -> Text -> (a -> Maybe Token) -> Rule
+singleStringLookupRule hashMap name production = Rule
+  { name = name
+  , pattern = [ regex $ unpack regexString ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (toLower match) hashMap >>= production
+      _ -> Nothing
+  }
+  where
+    regexString =
+      "(" <> mconcat
+      (intersperse "|" $ sortOn (negate . TT.length) $ HashMap.keys hashMap)
+      <> ")"
diff --git a/Duckling/Types/Document.hs b/Duckling/Types/Document.hs
--- a/Duckling/Types/Document.hs
+++ b/Duckling/Types/Document.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE FlexibleContexts #-}
@@ -136,7 +135,7 @@
   b >= a && (firstNonAdjacent Array.! a >= b)
 
 isAdjacentSeparator :: Char -> Bool
-isAdjacentSeparator c = elem c [' ', '\t', '-']
+isAdjacentSeparator c = elem c [' ', '\t']
 
 (!) :: Document -> Int -> Char
 (!) Document { indexable = s } ix = s Array.! ix
diff --git a/Duckling/Types/Stash.hs b/Duckling/Types/Stash.hs
--- a/Duckling/Types/Stash.hs
+++ b/Duckling/Types/Stash.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE RecordWildCards #-}
diff --git a/Duckling/Url/Corpus.hs b/Duckling/Url/Corpus.hs
--- a/Duckling/Url/Corpus.hs
+++ b/Duckling/Url/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/Duckling/Url/Helpers.hs b/Duckling/Url/Helpers.hs
--- a/Duckling/Url/Helpers.hs
+++ b/Duckling/Url/Helpers.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 
diff --git a/Duckling/Url/Rules.hs b/Duckling/Url/Rules.hs
--- a/Duckling/Url/Rules.hs
+++ b/Duckling/Url/Rules.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
diff --git a/Duckling/Url/Types.hs b/Duckling/Url/Types.hs
--- a/Duckling/Url/Types.hs
+++ b/Duckling/Url/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -39,4 +38,5 @@
   toJSON (UrlData value domain) = object
     [ "value"  .= value
     , "domain" .= domain
+    , "type"   .= ("value" :: Text)
     ]
diff --git a/Duckling/Volume/AR/Corpus.hs b/Duckling/Volume/AR/Corpus.hs
--- a/Duckling/Volume/AR/Corpus.hs
+++ b/Duckling/Volume/AR/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,41 +23,41 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 مل"
              , "250مل"
              , "250 ميليلتر"
              , "250 ملي لتر"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 لتر"
              , "لتران"
              , "لترين"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 غالون"
              , "3 جالون"
              , "3 غالونات"
              , "3 جالونات"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 هكتوليتر"
              , "3 هكتو ليتر"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "نصف لتر"
              , "نص لتر"
              ]
-  , examples (VolumeValue Litre 0.25)
+  , examples (simple Litre 0.25)
              [ "ربع لتر"
              ]
-  , examples (VolumeValue Litre 1.5)
+  , examples (simple Litre 1.5)
              [ "لتر ونصف"
              , "لتر و نص"
              , "لتر و نصف"
              , "لتر ونص"
              ]
-  , examples (VolumeValue Litre 1.25)
+  , examples (simple Litre 1.25)
              [ "لتر وربع"
              , "لتر و ربع"
              ]
diff --git a/Duckling/Volume/AR/Rules.hs b/Duckling/Volume/AR/Rules.hs
--- a/Duckling/Volume/AR/Rules.hs
+++ b/Duckling/Volume/AR/Rules.hs
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.AR.Rules
@@ -19,25 +19,56 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
+import qualified Duckling.Numeral.Types as TNumeral
 
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "مي?لي?( ?لي?تي?ر)?"  , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "(هي?كتو ?لي?تر)"     , TVolume.Hectolitre)
+          , ("<vol> liters"       , "لي?تي?ر(ات)?"        , TVolume.Litre)
+          , ("<latent vol> gallon", "[جغق]الون(ين|ان|ات)?", TVolume.Gallon)
+          ]
+
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
+
+ruleQuarterLiter :: Rule
+ruleQuarterLiter = Rule
+  { name = "quarter liter"
+  , pattern =
+    [ regex "ربع لي?تي?ر"
+    ]
+  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ valueOnly 0.25
+  }
+
 ruleHalfLiter :: Rule
 ruleHalfLiter = Rule
   { name = "half liter"
   , pattern =
     [ regex "نصف? لي?تي?ر"
     ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
+  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ valueOnly 0.5
   }
 
-ruleQuartorOfLiter :: Rule
-ruleQuartorOfLiter = Rule
-  { name = "quartor of liter"
+ruleLiterAndQuarter :: Rule
+ruleLiterAndQuarter = Rule
+  { name = "liter and quarter"
   , pattern =
-    [ regex "ربع لي?تي?ر"
+    [ regex "لي?تي?ر و ?ربع"
     ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.25
+  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ valueOnly 1.25
   }
 
 ruleLiterAndHalf :: Rule
@@ -46,7 +77,7 @@
   , pattern =
     [ regex "لي?تي?ر و ?نصف?"
     ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 1.5
+  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ valueOnly 1.5
   }
 
 ruleTwoLiters :: Rule
@@ -55,44 +86,14 @@
   , pattern =
     [ regex "لي?تي?ر(ان|ين)"
     ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 2
-  }
-
-ruleLiterAndQuartor :: Rule
-ruleLiterAndQuartor = Rule
-  { name = "liter and quartor"
-  , pattern =
-    [ regex "لي?تي?ر و ?ربع"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 1.25
+  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ valueOnly 2
   }
 
-volumes :: [(Text, String, TVolume.Unit)]
-volumes =
-  [ ("<latent vol> ml"    , "مي?لي?( ?لي?تي?ر)?"  , TVolume.Millilitre)
-  , ("<vol> hectoliters"  , "هي?كتو ?لي?تر"       , TVolume.Hectolitre)
-  , ("<vol> liters"       , "لي?تي?ر(ات)?"        , TVolume.Litre)
-  , ("<latent vol> gallon", "[جغق]الون(ين|ان|ات)?", TVolume.Gallon)
-  ]
-
-ruleVolumes :: [Rule]
-ruleVolumes = map go volumes
-  where
-    go :: (Text, String, TVolume.Unit) -> Rule
-    go (name, regexPattern, u) = Rule
-      { name = name
-      , pattern = [ dimension Volume, regex regexPattern ]
-      , prod = \tokens -> case tokens of
-          (Token Volume vd:_) -> Just . Token Volume $ withUnit u vd
-          _ -> Nothing
-      }
-
 rules :: [Rule]
-rules =
-  [ ruleHalfLiter
-  , ruleTwoLiters
-  , ruleQuartorOfLiter
-  , ruleLiterAndHalf
-  , ruleLiterAndQuartor
-  ]
-  ++ ruleVolumes
+rules = [ ruleHalfLiter
+        , ruleQuarterLiter
+        , ruleTwoLiters
+        , ruleLiterAndHalf
+        , ruleLiterAndQuarter
+        ]
+        ++ rulesVolumes
diff --git a/Duckling/Volume/DE/Corpus.hs b/Duckling/Volume/DE/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/DE/Corpus.hs
@@ -0,0 +1,85 @@
+-- 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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.DE.Corpus
+  ( corpus ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+import Duckling.Volume.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale DE Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Litre 1)
+             [ "1 liter"
+             --, "ein liter"
+             ]
+  , examples (simple Litre 2)
+             [ "2 liter"
+             , "2l"
+             ]
+  , examples (simple Litre 1000)
+             [ "1000 liter"
+             , "tausend liter"
+             ]
+  , examples (simple Litre 0.5)
+             [ "halber liter"
+            , "ein halber liter"
+             ]
+  , examples (simple Litre 0.25)
+             [ "viertel liter"
+            , "ein viertel liter"
+             ]
+  , examples (simple Millilitre 1)
+             [ "ein milliliter"
+             , "ein ml"
+             , "1ml"
+             ]
+  , examples (simple Millilitre 250)
+             [ "250 milliliter"
+             , "250ml"
+             , "250 ml"
+             ]
+  , examples (simple Hectolitre 3)
+             [ "3 hektoliter"
+             ]
+  , examples (between Litre (100,1000))
+             [ "zwischen 100 und 1000 litern"
+             , "100-1000 liter"
+             , "von 100 bis 1000 l"
+             , "100 - 1000 l"
+             ]
+  , examples (between Litre (2,7))
+             [ "etwa 2 -7 l"
+             , "~2-7 liter"
+             , "von 2 bis 7 l"
+             , "zwischen 2,0 l und ungefähr 7,0 l"
+             , "zwischen 2l und etwa 7l"
+             , "2 - ~7 liter"
+             ]
+  , examples (under Hectolitre 2)
+             [ "nicht mehr als 2 hektoliter"
+             , "höchstens zwei hektoliter"
+             , "unter 2 hektolitern"
+             , "weniger als 2 hektoliter"
+             ]
+  , examples (above Millilitre 4)
+             [ "mehr als 4 ml"
+             , "wenigstens 4,0 ml"
+             , "über vier milliliter"
+             , "mindestens vier ml"
+             ]
+  ]
diff --git a/Duckling/Volume/DE/Rules.hs b/Duckling/Volume/DE/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/DE/Rules.hs
@@ -0,0 +1,165 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.DE.Rules
+  ( rules ) where
+
+import Data.Text (Text)
+import Prelude
+import Data.String
+
+import Duckling.Dimensions.Types
+import Duckling.Types
+import Duckling.Regex.Types
+import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
+import qualified Duckling.Volume.Types as TVolume
+import qualified Duckling.Numeral.Types as TNumeral
+
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml", "m(l|illiliter[ns]?)", TVolume.Millilitre)
+          , ("<vol> hectoliters", "hektoliter[ns]?", TVolume.Hectolitre)
+          , ("<vol> liters", "l(iter[ns]?)?", TVolume.Litre)
+          ]
+
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
+
+fractions :: [(Text, String, Double)]
+fractions = [ ("one","ein(e[ns])?", 1)
+            , ("half", "(ein(e[ns])? )?halb(e[rn])? ", 1/2)
+            , ("third", "(ein(e[ns])? )?dritttel ", 1/3)
+            , ("fourth", "(ein(e[ns])? )?viertel ", 1/4)
+            , ("fifth", "(ein(e[ns])? )?fünftel ", 1/5)
+            , ("tenth", "(ein(e[ns])? )?zehntel ", 1/10)
+            ]
+
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about <volume>"
+  , pattern =
+    [ regex "\\~|(ganz )?genau|präzise|(in )?etwa|ungefähr|um( die)?|fast"
+    , dimension Volume
+    ]
+    , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> and|to <volume>"
+  , pattern =
+    [ regex "zwischen|von"
+    , Predicate isPositive
+    , regex "und|bis( zu)?"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Numeral TNumeral.NumeralData{TNumeral.value = from}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) | from < to ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <volume> to|and <volume>"
+  , pattern =
+    [ regex "zwischen|von"
+    , Predicate isSimpleVolume
+    , regex "bis( zu)?|und"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                  , TVolume.unit = Just u1}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "at most <volume>"
+  , pattern =
+    [ regex "unter|weniger( als)?|höchstens|nicht mehr als"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) ->
+        Just . Token Volume . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "more than <volume>"
+  , pattern =
+      [ regex "über|mindestens|wenigstens|mehr als|größer( als)?"
+      , Predicate isSimpleVolume
+      ]
+    , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                    , TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+rules :: [Rule]
+rules = [ rulePrecision
+        , ruleIntervalBetweenNumeral
+        , ruleIntervalBetween
+        , ruleIntervalMax
+        , ruleIntervalMin
+        ]
+        ++ rulesVolumes
+        ++ rulesFractionalVolume
diff --git a/Duckling/Volume/EN/Corpus.hs b/Duckling/Volume/EN/Corpus.hs
--- a/Duckling/Volume/EN/Corpus.hs
+++ b/Duckling/Volume/EN/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -22,21 +21,90 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Litre 1)
+             [ "1 liter"
+             , "1 litre"
+             , "one liter"
+             , "a liter"
+             ]
+  , examples (simple Litre 2)
+             [ "2 liters"
+             , "2l"
+             ]
+  , examples (simple Litre 1000)
+             [ "1000 liters"
+             , "thousand liters"
+             ]
+  , examples (simple Litre 0.5)
+             [ "half liter"
+             , "half-litre"
+             , "half a liter"
+             ]
+  , examples (simple Litre 0.25)
+             [ "quarter-litre"
+             , "fourth of liter"
+             ]
+  , examples (simple Millilitre 1)
+             [ "one milliliter"
+             , "an ml"
+             , "a millilitre"
+             ]
+  , examples (simple Millilitre 250)
              [ "250 milliliters"
+             , "250 millilitres"
              , "250ml"
+             , "250mls"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
-             [ "2 liters" ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 gallons"
              , "3 gal"
+             , "3gal"
+             , "around three gallons"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Gallon 0.5)
+             [ "0.5 gals"
+             , "1/2 gallon"
+             , "half a gallon"
+             ]
+  , examples (simple Gallon 0.1)
+             [ "0.1 gallons"
+             , "tenth of a gallon"
+             ]
+  , examples (simple Hectolitre 3)
              [ "3 hectoliters"
              ]
-  , examples (VolumeValue Litre 0.5)
-             [ "half liter"
+  , examples (between Litre (100,1000))
+             [ "between 100 and 1000 liters"
+             , "100-1000 liters"
+             , "from 100 to 1000 l"
+             , "100 - 1000 l"
+             ]
+  , examples (between Litre (2,7))
+             [ "around 2 -7 l"
+             , "~2-7 liters"
+             , "from 2 to 7 l"
+             , "between 2.0 l and about 7.0 l"
+             , "between 2l and about 7l"
+             , "2 - ~7 litres"
+             ]
+  , examples (under Gallon 6)
+             [ "less than six gallons"
+             , "under six gallon"
+             , "no more than 6 gals"
+             , "below 6.0gal"
+             , "at most six gallons"
+             ]
+  , examples (above Hectolitre 2)
+             [ "exceeding 2 hectoliters"
+             , "at least two hectolitres"
+             , "over 2 hectolitre"
+             , "more than 2 hectoliter"
+             ]
+  , examples (above Millilitre 4)
+             [ "exceeding 4 ml"
+             , "at least 4.0 ml"
+             , "over four milliliters"
+             , "more than four mls"
              ]
   ]
diff --git a/Duckling/Volume/EN/Rules.hs b/Duckling/Volume/EN/Rules.hs
--- a/Duckling/Volume/EN/Rules.hs
+++ b/Duckling/Volume/EN/Rules.hs
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.EN.Rules
@@ -18,34 +18,149 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern = [ regex "half lit(er|re)" ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
 volumes :: [(Text, String, TVolume.Unit)]
-volumes = [ ("<latent vol> ml"    , "m(l|illilit(er|re)s?)", TVolume.Millilitre)
-          , ("<vol> hectoliters"  , "hectolit(er|re)s?"    , TVolume.Hectolitre)
-          , ("<vol> liters"       , "l(it(er|re)s?)?"      , TVolume.Litre)
-          , ("<latent vol> gallon", "gal(l?ons?)?"         , TVolume.Gallon)
+volumes = [ ("<latent vol> ml", "m(l(s?)|illilit(er|re)s?)", TVolume.Millilitre)
+          , ("<vol> hectoliters", "hectolit(er|re)s?", TVolume.Hectolitre)
+          , ("<vol> liters", "l(it(er|re)s?)?", TVolume.Litre)
+          , ("<latent vol> gallon", "gal((l?ons?)|s)?", TVolume.Gallon)
           ]
 
-ruleVolumes :: [Rule]
-ruleVolumes = map go volumes
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
   where
     go :: (Text, String, TVolume.Unit) -> Rule
     go (name, regexPattern, u) = Rule
       { name = name
-      , pattern = [ dimension Volume, regex regexPattern ]
-      , prod = \tokens -> case tokens of
-          (Token Volume vd:_) -> Just . Token Volume $ withUnit u vd
-          _ -> Nothing
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
       }
 
+fractions :: [(Text, String, Double)]
+fractions = [ ("one", "an? ", 1)
+            , ("half", "half(-|(( of)?( a(n?))?))?", 1/2)
+            , ("third", "third(-|(( of)?( a(n?))?))?", 1/3)
+            , ("fourth", "(quarter|fourth)(-|(( of)?( a(n?))?))?", 1/4)
+            , ("fifth", "fifth(-|(( of)?( a(n?))?))?", 1/5)
+            , ("tenth", "tenth(-|(( of)?( a(n?))?))?", 1/10)
+            ]
+
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about <volume>"
+  , pattern =
+    [ regex "\\~|exactly|precisely|about|approx(\\.|imately)?|close to|near( to)?|around|almost"
+    , dimension Volume
+    ]
+    , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> and|to <volume>"
+  , pattern =
+    [ regex "between|from"
+    , Predicate isPositive
+    , regex "to|and"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Numeral TNumeral.NumeralData{TNumeral.value = from}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) | from < to ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <volume> to|and <volume>"
+  , pattern =
+    [ regex "between|from"
+    , Predicate isSimpleVolume
+    , regex "to|and"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                  , TVolume.unit = Just u1}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "at most <volume>"
+  , pattern =
+    [ regex "under|below|at most|(less|lower|not? more) than"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) ->
+        Just . Token Volume . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "more than <volume>"
+  , pattern =
+      [ regex "over|above|exceeding|beyond|at least|(more|larger|bigger|heavier) than"
+      , Predicate isSimpleVolume
+      ]
+    , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                    , TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
 rules :: [Rule]
-rules = ruleHalfLiter:ruleVolumes
+rules = [ rulePrecision
+        , ruleIntervalBetweenNumeral
+        , ruleIntervalBetween
+        , ruleIntervalMax
+        , ruleIntervalMin
+        ]
+        ++ rulesVolumes
+        ++ rulesFractionalVolume
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,21 +23,21 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 mililitros"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 litros"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 galón"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hectolitros"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "medio litro"
              ]
   ]
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
@@ -2,90 +2,72 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.ES.Rules
   ( rules ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(l|ililitros?)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "hectolitros?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "m(l|ililitros?)" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "(hectolitros?)"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "l(itros?)?"     , TVolume.Litre)
+          , ("<latent vol> gallon", "gal(o|ó)ne?s?"   , TVolume.Gallon)
+          ]
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "l(itros?)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "medio litros?"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "medio", 1/2)
+            ]
 
-ruleLatentVolGallon :: Rule
-ruleLatentVolGallon = Rule
-  { name = "<latent vol> gallon"
-  , pattern =
-    [ dimension Volume
-    , regex "gal(o|ó)ne?s?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleHalfLiter
-  , ruleLatentVolGallon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,23 +23,31 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 millilitres"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Centilitre 25)
+             [ "25 centilitres"
+             , "25cl"
+             , "25 cl"
+             ]
+  , examples (simple Litre 2)
              [ "2 litres"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 gallons"
              , "3 gal"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hectolitres"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "demi-litre"
              , "demi litre"
+             ]
+  , examples (simple Litre 0.25)
+             [ "quart de litre"
              ]
   ]
diff --git a/Duckling/Volume/FR/Rules.hs b/Duckling/Volume/FR/Rules.hs
--- a/Duckling/Volume/FR/Rules.hs
+++ b/Duckling/Volume/FR/Rules.hs
@@ -2,90 +2,74 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.FR.Rules
   ( rules ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(l|illilitres?)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "hectolitres?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "m(l|illilitres?)" , TVolume.Millilitre)
+          , ("<latent vol> cl"    , "c(l|entilitres?)" , TVolume.Centilitre)
+          , ("<vol> hectoliters"  , "(hectolitres?)"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "l(itres?)?"     , TVolume.Litre)
+          , ("<latent vol> gallon", "gal(l?ons?)?"   , TVolume.Gallon)
+          ]
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "l(itres?)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "demi( |-)?litre"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("quart", "quart de", 1/4)
+            , ("half", "demi-?", 1/2)
+            ]
 
-ruleLatentVolGallon :: Rule
-ruleLatentVolGallon = Rule
-  { name = "<latent vol> gallon"
-  , pattern =
-    [ dimension Volume
-    , regex "gal(l?ons?)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleHalfLiter
-  , ruleLatentVolGallon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,16 +23,20 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 millilítir"
              , "250 millilitir"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 lítir"
              ]
-  , examples (VolumeValue Gallon 5)
+  , examples (simple Gallon 5)
              [ "5 galúin"
+             ]
+  , examples (simple Hectolitre 20)
+             [ "20 heictilitear"
+             , "2 kl"
              ]
   ]
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
@@ -2,94 +2,66 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.GA.Rules
   ( rules ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(l\\.?|h?illil(í|i)t(ea|i)r)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
-
-ruleLatentVolKl :: Rule
-ruleLatentVolKl = Rule
-  { name = "<latent vol> kl"
-  , pattern =
-    [ dimension Volume
-    , regex "(kl\\.?|g?ch?illil(í|i)t(ea|i)r)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHeictiltir :: Rule
-ruleVolHeictiltir = Rule
-  { name = "<vol> heictilítir"
-  , pattern =
-    [ dimension Volume
-    , regex "heictil(í|i)t(ea|i)r"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml", "m(l\\.?|h?illil(í|i)t(ea|i)r)"
+            , TVolume.Millilitre)
+          , ("<vol> hectoliters" , "heictil(í|i)t(ea|i)r"
+            , TVolume.Hectolitre)
+          , ("<vol> liters", "(l(í|i)t(ea|i)r|l\\.?)"
+            , TVolume.Litre)
+          , ("<latent vol> gallon", "n?gh?al(ú|u)i?n"
+            , TVolume.Gallon)
+          ]
 
-ruleVolLtear :: Rule
-ruleVolLtear = Rule
-  { name = "<vol> lítear"
-  , pattern =
-    [ dimension Volume
-    , regex "(l(í|i)t(ea|i)r|l\\.?)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleLatentVolGaln :: Rule
-ruleLatentVolGaln = Rule
-  { name = "<latent vol> galún"
+ruleKiloliter :: Rule
+ruleKiloliter = Rule
+  { name = "kiloliter"
   , pattern =
-    [ dimension Volume
-    , regex "n?gh?al(ú|u)i?n"
+    [ Predicate isPositive
+    , regex "(kl\\.?|g?ch?illil(í|i)t(ea|i)r)"
     ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
+  , prod = \case
+    (Token Numeral TNumeral.NumeralData{TNumeral.value = v}:
+     _:_) ->
+      Just . Token Volume . withUnit TVolume.Hectolitre $ valueOnly (10.0 * v)
+    _ -> Nothing
   }
 
 rules :: [Rule]
-rules =
-  [ ruleLatentVolGaln
-  , ruleLatentVolKl
-  , ruleLatentVolMl
-  , ruleVolHeictiltir
-  , ruleVolLtear
-  ]
+rules = [ ruleKiloliter
+        ]
+        ++ rulesVolumes
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -23,22 +22,22 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 mililitara"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 litre"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 galona"
              , "3 gal"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hektolitra"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "pola litre"
              ]
   ]
diff --git a/Duckling/Volume/HR/Rules.hs b/Duckling/Volume/HR/Rules.hs
--- a/Duckling/Volume/HR/Rules.hs
+++ b/Duckling/Volume/HR/Rules.hs
@@ -2,89 +2,71 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.HR.Rules
   ( rules ) where
 
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(l|ililita?ra?)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHektolitar :: Rule
-ruleVolHektolitar = Rule
-  { name = "<vol> hektolitar"
-  , pattern =
-    [ dimension Volume
-    , regex "hektolita?ra?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "m(l|ililita?ra?)" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "(hektolita?ra?)"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "l(it(a)?r(a|e)?)?"     , TVolume.Litre)
+          , ("<latent vol> gallon", "gal(ona?)?"   , TVolume.Gallon)
+          ]
 
-ruleVolLitra :: Rule
-ruleVolLitra = Rule
-  { name = "<vol> litra"
-  , pattern =
-    [ dimension Volume
-    , regex "l(it(a)?r(a|e)?)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-rulePolaLitre :: Rule
-rulePolaLitre = Rule
-  { name = "pola litre"
-  , pattern =
-    [ regex "pola litre"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "pola", 1/2)
+            ]
 
-ruleLatentVolGalon :: Rule
-ruleLatentVolGalon = Rule
-  { name = "<latent vol> galon"
-  , pattern =
-    [ dimension Volume
-    , regex "gal(ona?)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleLatentVolGalon
-  , ruleLatentVolMl
-  , rulePolaLitre
-  , ruleVolHektolitar
-  , ruleVolLitra
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
diff --git a/Duckling/Volume/Helpers.hs b/Duckling/Volume/Helpers.hs
--- a/Duckling/Volume/Helpers.hs
+++ b/Duckling/Volume/Helpers.hs
@@ -2,28 +2,83 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
+{-# LANGUAGE GADTs #-}
+
+
 module Duckling.Volume.Helpers
-  ( volume
+  ( isSimpleVolume
+  , isUnitOnly
+  , volume
+  , unitOnly
+  , valueOnly
   , withUnit
+  , withValue
+  , withInterval
+  , withMin
+  , withMax
   ) where
 
+import Data.Text (Text)
 import Prelude
 
-import Duckling.Volume.Types (VolumeData(..))
+import Duckling.Dimensions.Types
+import Duckling.Volume.Types (Unit(..), VolumeData(..))
+import Duckling.Types
 import qualified Duckling.Volume.Types as TVolume
 
 -- -----------------------------------------------------------------
 -- Patterns
 
+isSimpleVolume :: Predicate
+isSimpleVolume (Token Volume VolumeData {TVolume.value = Just _
+                                        , TVolume.minValue = Nothing
+                                        , TVolume.maxValue = Nothing}) = True
+isSimpleVolume _ = False
+
+isUnitOnly :: Predicate
+isUnitOnly (Token Volume VolumeData {TVolume.value = Nothing
+                                    , TVolume.unit = Just _
+                                    , TVolume.minValue = Nothing
+                                    , TVolume.maxValue = Nothing}) = True
+isUnitOnly _ = False
+
 -- -----------------------------------------------------------------
 -- Production
 
-volume :: Double -> VolumeData
-volume x = VolumeData {TVolume.value = x, TVolume.unit = Nothing}
+volume :: Unit -> Double -> VolumeData
+volume u v = VolumeData {TVolume.unit = Just u
+                        , TVolume.value = Just v
+                        , TVolume.minValue = Nothing
+                        , TVolume.maxValue = Nothing}
 
-withUnit :: TVolume.Unit -> VolumeData -> VolumeData
-withUnit value vd = vd {TVolume.unit = Just value}
+unitOnly :: Unit -> VolumeData
+unitOnly u = VolumeData {TVolume.unit = Just u
+                        , TVolume.value = Nothing
+                        , TVolume.minValue = Nothing
+                        , TVolume.maxValue = Nothing}
+
+valueOnly :: Double -> VolumeData
+valueOnly v = VolumeData {TVolume.unit = Nothing
+                        , TVolume.value = Just v
+                        , TVolume.minValue = Nothing
+                        , TVolume.maxValue = Nothing}
+
+withUnit :: Unit -> VolumeData -> VolumeData
+withUnit u vd = vd {TVolume.unit = Just u}
+
+withValue :: Double -> VolumeData -> VolumeData
+withValue v vd = vd {TVolume.value = Just v}
+
+withInterval :: (Double, Double) -> VolumeData -> VolumeData
+withInterval (from, to) vd = vd {TVolume.value = Nothing
+                                , TVolume.minValue = Just from
+                                , TVolume.maxValue = Just to}
+
+withMin :: Double -> VolumeData -> VolumeData
+withMin from vd = vd {TVolume.minValue = Just from}
+
+withMax :: Double -> VolumeData -> VolumeData
+withMax to vd = vd {TVolume.maxValue = Just to}
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,23 +23,23 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 millilitri"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 litri"
              , "2l"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 galloni"
              , "3 gal"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 ettolitri"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "mezzo litro"
              ]
   ]
diff --git a/Duckling/Volume/IT/Rules.hs b/Duckling/Volume/IT/Rules.hs
--- a/Duckling/Volume/IT/Rules.hs
+++ b/Duckling/Volume/IT/Rules.hs
@@ -2,88 +2,72 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.IT.Rules
   ( rules ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(l|illilitr(i|o))"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "ettolitr(i|o)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "m(l|illilitr(i|o))" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "ettolitr(i|o)"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "l(itr(i|o))?"    , TVolume.Litre)
+          , ("<latent vol> gallon", "gal(lon(e|i))?"   , TVolume.Gallon)
+          ]
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "l(itr(i|o))?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) -> Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "mezzo litro"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "mezzo", 1/2)
+            ]
 
-ruleLatentVolGallon :: Rule
-ruleLatentVolGallon = Rule
-  { name = "<latent vol> gallon"
-  , pattern =
-    [ dimension Volume
-    , regex "gal(lon(e|i))?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) -> Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleHalfLiter
-  , ruleLatentVolGallon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
diff --git a/Duckling/Volume/KM/Corpus.hs b/Duckling/Volume/KM/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/KM/Corpus.hs
@@ -0,0 +1,66 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.KM.Corpus
+  ( corpus ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Volume.Types
+import Duckling.Testing.Types
+
+context :: Context
+context = testContext{locale = makeLocale KM Nothing}
+
+corpus :: Corpus
+corpus = (context, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Litre 1)
+             [ "1 លីត្រ"
+             , "1l"
+             , "១លីត្រ"
+             ]
+  , examples (simple Litre 0.5)
+             [ "កន្លះលីត្រ"
+             , "១/២លីត្រ"
+             ]
+  , examples (simple Litre 0.25)
+             [ "មួយភាគបួនលីត្រ"
+             , "១/៤លីត្រ"
+             ]
+  , examples (simple Millilitre 1)
+             [ "1 មីលីលីត្រ"
+             , "1ml"
+             , "១មីលីលីត្រ"
+             ]
+ , examples (between Litre (2,7))
+             [ "ចាប់ពី 2 ដល់ 7 l"
+             , "ចន្លោះពី ២ ដល់ ៧លីត្រ"
+             , "ចន្លោះ ២លីត្រ និង ៧លីត្រ"
+             , "ប្រហែល ២-៧ លីត្រ"
+             , "~2-7លីត្រ"
+             ]
+  , examples (under Millilitre 500)
+             [ "តិចជាងប្រាំរយមីលីលីត្រ"
+             , "មិនលើសប្រាំរយមីលីលីត្រ"
+             , "ក្រោមប្រាំរយមីលីលីត្រ"
+             , "យ៉ាងច្រើនប្រាំរយមីលីលីត្រ"
+             ]
+  , examples (above Millilitre 500)
+             [ "ច្រើនជាងប្រាំរយមីលីលីត្រ"
+             , "មិនតិចជាងប្រាំរយមីលីលីត្រ"
+             , "លើសពីប្រាំរយមីលីលីត្រ"
+             , "យ៉ាងតិចប្រាំរយមីលីលីត្រ"
+             ]
+  ]
diff --git a/Duckling/Volume/KM/Rules.hs b/Duckling/Volume/KM/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/KM/Rules.hs
@@ -0,0 +1,162 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.KM.Rules
+  ( rules ) where
+
+import Data.Text (Text)
+import Prelude
+import Data.String
+
+import Duckling.Dimensions.Types
+import Duckling.Types
+import Duckling.Regex.Types
+import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
+import qualified Duckling.Volume.Types as TVolume
+import qualified Duckling.Numeral.Types as TNumeral
+
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml", "ml|មីលីលីត្រ", TVolume.Millilitre)
+          , ("<vol> liters", "l|លីត្រ", TVolume.Litre)
+          ]
+
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
+
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "កន្លះ|១\\/២", 1/2)
+            , ("third", "មួយភាគបី|១\\/៣", 1/3)
+            , ("fourth", "មួយភាគបួន|១\\/៤", 1/4)
+            , ("fifth", "មួយភាគប្រាំ|១\\/៥", 1/5)
+            ]
+
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about <volume>"
+  , pattern =
+    [ regex "\\~|ប្រហែល"
+    , dimension Volume
+    ]
+    , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> and|to <volume>"
+  , pattern =
+    [ regex "ចន្លោះ(ពី)?|ចាប់ពី"
+    , Predicate isPositive
+    , regex "និង|ដល់"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Numeral TNumeral.NumeralData{TNumeral.value = from}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) | from < to ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <volume> to|and <volume>"
+  , pattern =
+    [ regex "ចន្លោះ(ពី)?|ចាប់ពី"
+    , Predicate isSimpleVolume
+    , regex "និង|ដល់"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                  , TVolume.unit = Just u1}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "at most <volume>"
+  , pattern =
+    [ regex "ក្រោម|តិចជាង|មិនដល់|យ៉ាងច្រើន|មិនលើស"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) ->
+        Just . Token Volume . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "more than <volume>"
+  , pattern =
+      [ regex "លើស(ពី)?|មិនតិចជាង|លើ|ច្រើនជាង|យ៉ាងតិច|យ៉ាងហោច"
+      , Predicate isSimpleVolume
+      ]
+    , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                    , TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+rules :: [Rule]
+rules = [ rulePrecision
+        , ruleIntervalBetweenNumeral
+        , ruleIntervalBetween
+        , ruleIntervalMax
+        , ruleIntervalMin
+        ]
+        ++ rulesVolumes
+        ++ rulesFractionalVolume
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,26 +23,26 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 밀리리터"
              , "250 미리리터"
              , "이백오십미리리터"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 리터"
              , "이리터"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 갤론"
              , "삼 갤론"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 헥토리터"
              , "삼 헥토리터"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "반 리터"
              ]
   ]
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
@@ -2,80 +2,49 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.KO.Rules
   ( rules ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "ml|(밀|미)리리터"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
-
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "(핵|헥)토리터"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "l|리터"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "ml|(밀|미)리리터" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "(핵|헥)토리터"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "(l|리터)"     , TVolume.Litre)
+          , ("<latent vol> gallon", "gal(l?ons?)?|갤(런|론)"   , TVolume.Gallon)
+          ]
 
-ruleLatentVolGallon :: Rule
-ruleLatentVolGallon = Rule
-  { name = "<latent vol> gallon"
-  , pattern =
-    [ dimension Volume
-    , regex "gal(l?ons?)?|갤(런|론)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleLatentVolGallon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
diff --git a/Duckling/Volume/MN/Corpus.hs b/Duckling/Volume/MN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/MN/Corpus.hs
@@ -0,0 +1,50 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.MN.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+import Duckling.Volume.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale MN Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Millilitre 250)
+             [ "250 миллилитр"
+             , "250мл"
+             , "250 мл"
+             ]
+  , examples (simple Litre 2)
+             [ "2 литр"
+             , "2 л"
+             , "хоёр литр"
+             ]
+  , examples (simple Litre 1)
+             [ "1 литр"
+             , "нэг литр"
+             , "1л"
+             ]
+  , examples (simple Gallon 3)
+             [ "3 галлон"
+             ]
+  , examples (simple Hectolitre 3)
+             [ "3 гектолитр"
+             , "3 гл"
+             , "3гл"
+             ]
+  ]
diff --git a/Duckling/Volume/MN/Rules.hs b/Duckling/Volume/MN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/MN/Rules.hs
@@ -0,0 +1,51 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.MN.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Types
+import Duckling.Regex.Types
+import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
+import qualified Duckling.Volume.Types as TVolume
+import qualified Duckling.Numeral.Types as TNumeral
+
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "мл|миллилитр" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "гл|гектолитр" , TVolume.Hectolitre)
+          , ("<vol> liters"       , "л(итр(ийн|ээр)?)?"      , TVolume.Litre)
+          , ("<latent vol> gallon", "галлон"       , TVolume.Gallon)
+          ]
+
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
+
+rules :: [Rule]
+rules = [ 
+        ]
+        ++ rulesVolumes
+
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,23 +23,22 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
-             [ "250 mililiter"
+  [ examples (simple Millilitre 250)
+             [ "250 milliliter"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 liter"
+             , "2 liters"
              , "2l"
              , "2 l"
              ]
-  , examples (VolumeValue Gallon 3)
-             [ "3 gallon"
-             ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hectoliter"
+             , "3 hl"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "halve liter"
              ]
   ]
diff --git a/Duckling/Volume/NL/Rules.hs b/Duckling/Volume/NL/Rules.hs
--- a/Duckling/Volume/NL/Rules.hs
+++ b/Duckling/Volume/NL/Rules.hs
@@ -2,90 +2,72 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.NL.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types (GroupMatch(..))
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(ili)?l(iter)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "hectoliter?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "m(illi)?l(iter)?" , TVolume.Millilitre)
+          , ("<vol> hl"           , "h(ecto)?l(iter)?"   , TVolume.Hectolitre)
+          , ("<vol> liters"       , "l(iters?)?"    , TVolume.Litre)
+          ]
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "l(iter)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "halve liter?"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "halve", 1/2)
+            ]
 
-ruleLatentVolGallon :: Rule
-ruleLatentVolGallon = Rule
-  { name = "<latent vol> gallon"
-  , pattern =
-    [ dimension Volume
-    , regex "gallon?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleHalfLiter
-  , ruleLatentVolGallon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,24 +23,24 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 mililitros"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 litros"
              ]
-  , examples (VolumeValue Gallon 1)
+  , examples (simple Gallon 1)
              [ "1 galão"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 galões"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hectolitros"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "meio litro"
              ]
   ]
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
@@ -2,90 +2,72 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.PT.Rules
   ( rules ) where
 
-import Prelude
 import Data.String
+import Data.Text (Text)
+import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "m(l|ililitros?)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "hectolitros?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "m(l|ililitros?)" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "(hectolitros?)"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "l(itros?)?"     , TVolume.Litre)
+          , ("<latent vol> gallon", "gal(a|ã|o|õ)o?e?s?"   , TVolume.Gallon)
+          ]
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "l(itros?)?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "meio litros?"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "meio", 1/2)
+            ]
 
-ruleLatentVolGallon :: Rule
-ruleLatentVolGallon = Rule
-  { name = "<latent vol> gallon"
-  , pattern =
-    [ dimension Volume
-    , regex "gal(a|ã|o|õ)o?e?s?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleHalfLiter
-  , ruleLatentVolGallon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -25,30 +24,30 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 mililitri"
              , "250 de mililitri"
              , "250ml"
              , "250 ml"
              , "250 de ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 litri"
              , "2 l"
              , "2l"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 galoane"
              , "3 gal"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hectolitri"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "jumatate de litru"
              , "jumătate de litru"
              ]
-  , examples (VolumeValue Gallon 20)
+  , examples (simple Gallon 20)
              [ "douazeci de galoane"
              ]
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
@@ -15,79 +14,61 @@
   ) where
 
 import Data.String
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleLatentVolMl :: Rule
-ruleLatentVolMl = Rule
-  { name = "<latent vol> ml"
-  , pattern =
-    [ dimension Volume
-    , regex "(de )?m(ililitr[ui]|l)"
-    ]
-  , prod = \case
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Millilitre vd
-      _ -> Nothing
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
-ruleVolHectoliters :: Rule
-ruleVolHectoliters = Rule
-  { name = "<vol> hectoliters"
-  , pattern =
-    [ dimension Volume
-    , regex "(de )?hectolitr[ui]"
-    ]
-  , prod = \case
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Hectolitre vd
-      _ -> Nothing
-  }
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml"    , "(de )?m(ililitr[ui]|l)" , TVolume.Millilitre)
+          , ("<vol> hectoliters"  , "(de )?hectolitr[ui]"    , TVolume.Hectolitre)
+          , ("<vol> liters"       , "(de )?l(itr[ui])?"     , TVolume.Litre)
+          , ("<latent vol> gallon", "(de )?gal(oane|on)?"   , TVolume.Gallon)
+          ]
 
-ruleVolLiters :: Rule
-ruleVolLiters = Rule
-  { name = "<vol> liters"
-  , pattern =
-    [ dimension Volume
-    , regex "(de )?l(itr[ui])?"
-    ]
-  , prod = \case
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Litre vd
-      _ -> Nothing
-  }
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
 
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "jum(a|ă)tate de litr[ui]"
-    ]
-  , prod = const . Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "jum(a|ă)tate", 1/2)
+            ]
 
-ruleLatentVolGalon :: Rule
-ruleLatentVolGalon = Rule
-  { name = "<latent vol> galon"
-  , pattern =
-    [ dimension Volume
-    , regex "(de )?gal(oane|on)?"
-    ]
-  , prod = \case
-      (Token Volume vd:_) ->
-        Just . Token Volume $ withUnit TVolume.Gallon vd
-      _ -> Nothing
-  }
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
 
 rules :: [Rule]
 rules =
-  [ ruleHalfLiter
-  , ruleLatentVolGalon
-  , ruleLatentVolMl
-  , ruleVolHectoliters
-  , ruleVolLiters
+  [
   ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
diff --git a/Duckling/Volume/RU/Corpus.hs b/Duckling/Volume/RU/Corpus.hs
--- a/Duckling/Volume/RU/Corpus.hs
+++ b/Duckling/Volume/RU/Corpus.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -25,35 +24,35 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 миллилитров"
              , "250мл"
              , "250 мл"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 литра"
              , "2 л"
              , "два литра"
              ]
-  , examples (VolumeValue Litre 1)
+  , examples (simple Litre 1)
              [ "1 литр"
              , "один литр"
              , "1л"
              ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 галлона"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 гектолитра"
              , "3 гл"
              , "3гл"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "пол-литра"
              , "поллитра"
              , "пол литра"
              ]
-  , examples (VolumeValue Litre 1.5)
+  , examples (simple Litre 1.5)
              [ "полтора литра"
              ]
   ]
diff --git a/Duckling/Volume/RU/Rules.hs b/Duckling/Volume/RU/Rules.hs
--- a/Duckling/Volume/RU/Rules.hs
+++ b/Duckling/Volume/RU/Rules.hs
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.RU.Rules
@@ -19,17 +19,11 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern =
-    [ regex "пол[-\\s]?литра"
-    ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
 volumes :: [(Text, String, TVolume.Unit)]
 volumes = [ ("<latent vol> ml"    , "мл|миллилитр(а|ов)?" , TVolume.Millilitre)
@@ -38,17 +32,51 @@
           , ("<latent vol> gallon", "галлон(а|ов)?"       , TVolume.Gallon)
           ]
 
-ruleVolumes :: [Rule]
-ruleVolumes = map go volumes
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
   where
     go :: (Text, String, TVolume.Unit) -> Rule
     go (name, regexPattern, u) = Rule
       { name = name
-      , pattern = [ dimension Volume, regex regexPattern ]
-      , prod = \tokens -> case tokens of
-          (Token Volume vd:_) -> Just . Token Volume $ withUnit u vd
-          _ -> Nothing
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
       }
 
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "пол[-\\s]?", 1/2)
+            ]
+
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
+
+ruleHalfLiter :: Rule
+ruleHalfLiter = Rule
+  { name = "half liter"
+  , pattern =
+    [ regex "поллитра"
+    ]
+  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ valueOnly 0.5
+  }
+
 rules :: [Rule]
-rules = ruleHalfLiter:ruleVolumes
+rules = [ ruleHalfLiter
+        ]
+        ++ rulesVolumes
+        ++ rulesFractionalVolume
diff --git a/Duckling/Volume/Rules.hs b/Duckling/Volume/Rules.hs
--- a/Duckling/Volume/Rules.hs
+++ b/Duckling/Volume/Rules.hs
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.Rules
@@ -15,26 +15,84 @@
 
 import Data.String
 import Prelude
+import Data.String
 
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
+import qualified Duckling.Volume.Types as TVolume
 import qualified Duckling.Numeral.Types as TNumeral
 
 ruleNumeralAsVolume :: Rule
 ruleNumeralAsVolume = Rule
   { name = "number as volume"
   , pattern =
-    [ dimension Numeral
+    [ Predicate isPositive
     ]
-  , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData {TNumeral.value = v}:_) ->
-        Just . Token Volume $ volume v
+  , prod = \case
+    (Token Numeral TNumeral.NumeralData {TNumeral.value = v}:
+     _) ->
+      Just . Token Volume $ valueOnly v
+    _ -> Nothing
+  }
+
+ruleNumeralVolumes :: Rule
+ruleNumeralVolumes = Rule
+  { name = "<number> <volume>"
+  , pattern =
+    [ Predicate isPositive
+    , Predicate isUnitOnly
+    ]
+  , prod = \case
+    (Token Numeral TNumeral.NumeralData{TNumeral.value = v}:
+     Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+     _) ->
+      Just . Token Volume $ volume u v
+    _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <volume>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "\\-"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (Token Numeral TNumeral.NumeralData{TNumeral.value = from}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) | from < to ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u
       _ -> Nothing
   }
 
+ruleIntervalDash :: Rule
+ruleIntervalDash = Rule
+  { name = "<volume> - <volume>"
+  , pattern =
+    [ Predicate isSimpleVolume
+    , regex "\\-"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                  , TVolume.unit = Just u1}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
 rules :: [Rule]
-rules =
-  [ ruleNumeralAsVolume
-  ]
+rules = [ ruleNumeralAsVolume
+        , ruleNumeralVolumes
+        , ruleIntervalNumeralDash
+        , ruleIntervalDash
+        ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,21 +23,21 @@
 
 allExamples :: [Example]
 allExamples = concat
-  [ examples (VolumeValue Millilitre 250)
+  [ examples (simple Millilitre 250)
              [ "250 mililitre"
              , "250ml"
              , "250 ml"
              ]
-  , examples (VolumeValue Litre 2)
+  , examples (simple Litre 2)
              [ "2 litre" ]
-  , examples (VolumeValue Gallon 3)
+  , examples (simple Gallon 3)
              [ "3 galon"
              , "3 gal"
              ]
-  , examples (VolumeValue Hectolitre 3)
+  , examples (simple Hectolitre 3)
              [ "3 hektolitre"
              ]
-  , examples (VolumeValue Litre 0.5)
+  , examples (simple Litre 0.5)
              [ "yarım litre"
              ]
   ]
diff --git a/Duckling/Volume/TR/Rules.hs b/Duckling/Volume/TR/Rules.hs
--- a/Duckling/Volume/TR/Rules.hs
+++ b/Duckling/Volume/TR/Rules.hs
@@ -2,11 +2,11 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Volume.TR.Rules
@@ -18,34 +18,56 @@
 
 import Duckling.Dimensions.Types
 import Duckling.Types
+import Duckling.Regex.Types
 import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
 import qualified Duckling.Volume.Types as TVolume
-
-ruleHalfLiter :: Rule
-ruleHalfLiter = Rule
-  { name = "half liter"
-  , pattern = [ regex "yar\305m l(t|itre)" ]
-  , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
-  }
+import qualified Duckling.Numeral.Types as TNumeral
 
 volumes :: [(Text, String, TVolume.Unit)]
 volumes = [ ("<latent vol> ml"    , "m(l|ililitre)" , TVolume.Millilitre)
-          , ("<vol> hectoliters"  , "hektolitre"    , TVolume.Hectolitre)
+          , ("<vol> hectoliters"  , "(hektolitre)"  , TVolume.Hectolitre)
           , ("<vol> liters"       , "l(t|itre)"     , TVolume.Litre)
           , ("<latent vol> gallon", "gal(l?on?)?"   , TVolume.Gallon)
           ]
 
-ruleVolumes :: [Rule]
-ruleVolumes = map go volumes
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
   where
     go :: (Text, String, TVolume.Unit) -> Rule
     go (name, regexPattern, u) = Rule
       { name = name
-      , pattern = [ dimension Volume, regex regexPattern ]
-      , prod = \tokens -> case tokens of
-          (Token Volume vd:_) -> Just . Token Volume $ withUnit u vd
-          _ -> Nothing
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
       }
 
+fractions :: [(Text, String, Double)]
+fractions = [ ("half", "yar\305m", 1/2)
+            ]
+
+rulesFractionalVolume :: [Rule]
+rulesFractionalVolume = map go fractions
+  where
+    go :: (Text, String, Double) -> Rule
+    go (name, regexPattern, f) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        , Predicate isUnitOnly
+        ]
+      , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume $ volume u f
+        _ -> Nothing
+      }
+
 rules :: [Rule]
-rules = ruleHalfLiter:ruleVolumes
+rules =
+  [
+  ]
+  ++ rulesVolumes
+  ++ rulesFractionalVolume
diff --git a/Duckling/Volume/Types.hs b/Duckling/Volume/Types.hs
--- a/Duckling/Volume/Types.hs
+++ b/Duckling/Volume/Types.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE DeriveAnyClass #-}
@@ -19,16 +18,17 @@
 import Data.Aeson
 import Data.Hashable
 import Data.Text (Text)
-import qualified Data.Text as Text
 import GHC.Generics
 import Prelude
-
 import Duckling.Resolve (Resolve (..))
+import qualified Data.Text as Text
+import qualified Data.HashMap.Strict as H
 
 data Unit
   = Gallon
   | Hectolitre
   | Litre
+  | Centilitre
   | Millilitre
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
 
@@ -36,26 +36,84 @@
   toJSON = String . Text.toLower . Text.pack . show
 
 data VolumeData = VolumeData
-  { unit :: Maybe Unit
-  , value :: Double
+  { value :: Maybe Double
+  , unit :: Maybe Unit
+  , minValue :: Maybe Double
+  , maxValue :: Maybe Double
   }
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
 
 instance Resolve VolumeData where
   type ResolvedValue VolumeData = VolumeValue
-  resolve _ _ VolumeData {unit = Nothing} = Nothing
-  resolve _ _ VolumeData {unit = Just unit, value} = Just (VolumeValue
-    {vValue = value, vUnit = unit}, False)
+  resolve _ _ VolumeData {value = Just v, unit = Just u} =
+    Just (simple u v, False)
+  resolve _ _ VolumeData {value = Nothing, unit = Just u
+                         , minValue = Just from, maxValue = Just to} =
+    Just (between u (from, to), False)
+  resolve _ _ VolumeData {value = Nothing, unit = Just u
+                         , minValue = Just v, maxValue = Nothing} =
+    Just (above u v, False)
+  resolve _ _ VolumeData {value = Nothing, unit = Just u
+                         , minValue = Nothing, maxValue = Just v} =
+    Just (under u v, False)
+  resolve _ _ _ = Nothing
 
-data VolumeValue = VolumeValue
+data IntervalDirection = Above | Under
+  deriving (Eq, Generic, Hashable, Ord, Show, NFData)
+
+data SingleValue = SingleValue
   { vUnit :: Unit
   , vValue :: Double
   }
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Show)
 
+instance ToJSON SingleValue where
+  toJSON SingleValue {vUnit, vValue} = object
+    [ "value" .= vValue
+    , "unit"  .= vUnit
+    ]
+
+data VolumeValue
+  = SimpleValue SingleValue
+  | IntervalValue (SingleValue, SingleValue)
+  | OpenIntervalValue (SingleValue, IntervalDirection)
+  deriving (Show, Eq)
+
 instance ToJSON VolumeValue where
-  toJSON (VolumeValue unit value) = object
-    [ "type" .= ("value" :: Text)
-    , "value" .= value
-    , "unit" .= unit
+  toJSON (SimpleValue value) = case toJSON value of
+    Object o -> Object $ H.insert "type" (toJSON ("value" :: Text)) o
+    _ -> Object H.empty
+  toJSON (IntervalValue (from, to)) = object
+    [ "type" .= ("interval" :: Text)
+    , "from" .= toJSON from
+    , "to" .= toJSON to
     ]
+  toJSON (OpenIntervalValue (from, Above)) = object
+    [ "type" .= ("interval" :: Text)
+    , "from" .= toJSON from
+    ]
+  toJSON (OpenIntervalValue (to, Under)) = object
+    [ "type" .= ("interval" :: Text)
+    , "to" .= toJSON to
+    ]
+
+-- -----------------------------------------------------------------
+-- Value helpers
+
+simple :: Unit -> Double -> VolumeValue
+simple u v = SimpleValue $ single u v
+
+between :: Unit -> (Double, Double) -> VolumeValue
+between u (from,to) = IntervalValue (single u from, single u to)
+
+above :: Unit -> Double -> VolumeValue
+above = openInterval Above
+
+under :: Unit -> Double -> VolumeValue
+under = openInterval Under
+
+openInterval :: IntervalDirection -> Unit -> Double -> VolumeValue
+openInterval direction u v = OpenIntervalValue (single u v, direction)
+
+single :: Unit -> Double -> SingleValue
+single u v = SingleValue {vUnit = u, vValue = v}
diff --git a/Duckling/Volume/ZH/Corpus.hs b/Duckling/Volume/ZH/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/ZH/Corpus.hs
@@ -0,0 +1,95 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.ZH.Corpus
+  ( corpus ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+import Duckling.Volume.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Litre 1)
+             [ "1升"
+             , "一升"
+             , "一公升"
+             , "1L"
+             ]
+  , examples (simple Litre 2)
+             [ "2升"
+             , "兩升"
+             , "兩公升"
+             , "2L"
+             ]
+  , examples (simple Litre 1000)
+             [ "1000公升"
+             , "一千公升"
+             ]
+  , examples (simple Litre 0.5)
+             [ "半公升"
+             , "0.5L"
+             ]
+  , examples (simple Litre 0.25)
+             [ "四分一升"
+             , "四分之一公升"
+             ]
+  , examples (simple Millilitre 1)
+             [ "1毫升"
+             , "1ml"
+             , "一毫升"
+             , "1cc"
+             ]
+  , examples (simple Millilitre 250)
+             [ "250毫升"
+             , "二百五十毫升"
+             , "250ml"
+             , "250cc"
+             ]
+  , examples (simple Gallon 3)
+             [ "3加侖"
+             , "三加侖"
+             ]
+  , examples (simple Gallon 0.5)
+             [ "0.5加侖"
+             , "半加侖"
+             , "二分一加侖"
+             ]
+  , examples (simple Gallon 0.1)
+             [ "0.1加侖"
+             , "零點一加侖"
+             ]
+  , examples (between Litre (2,3))
+             [ "二至三公升"
+             , "2-3L"
+             , "2~3公升"
+             , "兩到三升"
+             , "兩升到三升"
+             ]
+  , examples (under Gallon 6)
+             [ "最多六個加侖"
+             , "六加侖以下"
+             ]
+  , examples (above Millilitre 4)
+             [ "至少四ml"
+             , "最少四毫升"
+             , "四毫升或以上"
+             ]
+  , examples (simple Millilitre 5)
+             [ "一茶匙"
+             , "三分一湯匙"
+             ]
+  ]
diff --git a/Duckling/Volume/ZH/Rules.hs b/Duckling/Volume/ZH/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Volume/ZH/Rules.hs
@@ -0,0 +1,193 @@
+-- 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.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Volume.ZH.Rules
+  ( rules ) where
+
+import Data.Text (Text)
+import Prelude
+import Data.String
+
+import Duckling.Dimensions.Types
+import Duckling.Types
+import Duckling.Volume.Helpers
+import Duckling.Numeral.Helpers (isPositive)
+import qualified Duckling.Volume.Types as TVolume
+import qualified Duckling.Numeral.Types as TNumeral
+
+volumes :: [(Text, String, TVolume.Unit)]
+volumes = [ ("<latent vol> ml", "cc|ml|毫升", TVolume.Millilitre)
+          , ("<vol> liters", "l|L|公升|升", TVolume.Litre)
+          , ("<latent vol> gallon", "加侖", TVolume.Gallon)
+          ]
+
+rulesVolumes :: [Rule]
+rulesVolumes = map go volumes
+  where
+    go :: (Text, String, TVolume.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern =
+        [ regex regexPattern
+        ]
+      , prod = \_ -> Just . Token Volume $ unitOnly u
+      }
+
+ruleUnitTeaspoon :: Rule
+ruleUnitTeaspoon = Rule
+  { name = "<numeral> teaspoon"
+  , pattern =
+    [ Predicate isPositive
+    , regex "茶匙"
+    ]
+    , prod = \case
+      (Token Numeral TNumeral.NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Volume $ volume TVolume.Millilitre (5*v)
+      _ -> Nothing
+  }
+
+ruleUnitSoupspoon :: Rule
+ruleUnitSoupspoon = Rule
+  { name = "<numeral> soupspoon"
+  , pattern =
+    [ Predicate isPositive
+    , regex "湯匙"
+    ]
+    , prod = \case
+      (Token Numeral TNumeral.NumeralData{TNumeral.value = v}:_) ->
+        Just . Token Volume $ volume TVolume.Millilitre (15*v)
+      _ -> Nothing
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "about <volume>"
+  , pattern =
+    [ regex "\\~|大約|約"
+    , dimension Volume
+    ]
+    , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> and|to <volume>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-|~|至|到"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (Token Numeral TNumeral.NumeralData{TNumeral.value = from}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) | from < to ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalBetween :: Rule
+ruleIntervalBetween = Rule
+  { name = "between|from <volume> to|and <volume>"
+  , pattern =
+    [ Predicate isSimpleVolume
+    , regex "-|~|至|到"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                  , TVolume.unit = Just u1}:
+       _:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u2}:
+       _) | from < to && u1 == u2 ->
+        Just . Token Volume . withInterval (from, to) $ unitOnly u1
+      _ -> Nothing
+  }
+
+ruleIntervalMax :: Rule
+ruleIntervalMax = Rule
+  { name = "at most <volume>"
+  , pattern =
+    [ regex "最多"
+    , Predicate isSimpleVolume
+    ]
+  , prod = \case
+      (_:
+       Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) ->
+        Just . Token Volume . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMax2 :: Rule
+ruleIntervalMax2 = Rule
+  { name = "<volume> or below"
+  , pattern =
+    [ Predicate isSimpleVolume
+    , regex "(或)?以下"
+    ]
+  , prod = \case
+      (Token Volume TVolume.VolumeData{TVolume.value = Just to
+                                  , TVolume.unit = Just u}:
+       _) ->
+        Just . Token Volume . withMax to $ unitOnly u
+      _ -> Nothing
+  }
+
+ruleIntervalMin :: Rule
+ruleIntervalMin = Rule
+  { name = "more than <volume>"
+  , pattern =
+      [ regex "至少|最少|起碼"
+      , Predicate isSimpleVolume
+      ]
+    , prod = \case
+        (_:
+         Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                    , TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+ruleIntervalMin2 :: Rule
+ruleIntervalMin2 = Rule
+  { name = "<volume> or above"
+  , pattern =
+      [ Predicate isSimpleVolume
+      , regex "(或)?以上"
+      ]
+    , prod = \case
+        (Token Volume TVolume.VolumeData{TVolume.value = Just from
+                                    , TVolume.unit = Just u}:
+         _) ->
+          Just . Token Volume . withMin from $ unitOnly u
+        _ -> Nothing
+    }
+
+
+rules :: [Rule]
+rules = [ ruleUnitTeaspoon
+        , ruleUnitSoupspoon
+        , rulePrecision
+        , ruleIntervalBetweenNumeral
+        , ruleIntervalBetween
+        , ruleIntervalMax
+        , ruleIntervalMax2
+        , ruleIntervalMin
+        , ruleIntervalMin2
+        ]
+        ++ rulesVolumes
diff --git a/PATENTS b/PATENTS
deleted file mode 100644
--- a/PATENTS
+++ /dev/null
@@ -1,33 +0,0 @@
-Additional Grant of Patent Rights Version 2
-
-"Software" means the Duckling software contributed by Facebook, Inc.
-
-Facebook, Inc. ("Facebook") hereby grants to each recipient of the Software
-("you") a perpetual, worldwide, royalty-free, non-exclusive, irrevocable
-(subject to the termination provision below) license under any Necessary
-Claims, to make, have made, use, sell, offer to sell, import, and otherwise
-transfer the Software. For avoidance of doubt, no license is granted under
-Facebook’s rights in any patent claims that are infringed by (i) modifications
-to the Software made by you or any third party or (ii) the Software in
-combination with any software or other technology.
-
-The license granted hereunder will terminate, automatically and without notice,
-if you (or any of your subsidiaries, corporate affiliates or agents) initiate
-directly or indirectly, or take a direct financial interest in, any Patent
-Assertion: (i) against Facebook or any of its subsidiaries or corporate
-affiliates, (ii) against any party if such Patent Assertion arises in whole or
-in part from any software, technology, product or service of Facebook or any of
-its subsidiaries or corporate affiliates, or (iii) against any party relating
-to the Software. Notwithstanding the foregoing, if Facebook or any of its
-subsidiaries or corporate affiliates files a lawsuit alleging patent
-infringement against you in the first instance, and you respond by filing a
-patent infringement counterclaim in that lawsuit against that party that is
-unrelated to the Software, the license granted hereunder will not terminate
-under section (i) of this paragraph due to such counterclaim.
-
-A "Necessary Claim" is a claim of a patent owned by Facebook that is
-necessarily infringed by the Software standing alone.
-
-A "Patent Assertion" is any lawsuit or other action alleging direct, indirect,
-or contributory infringement or inducement to infringe any patent, including a
-cross-claim or counterclaim.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -32,6 +32,13 @@
 ```
 $ curl -XPOST http://0.0.0.0:8000/parse --data 'locale=en_GB&text=tomorrow at eight'
 ```
+In the example application, all dimensions are enabled by default. Provide the parameter `dims` to specify which ones you want. Examples:
+```
+Identify credit card numbers only:
+$ curl -XPOST http://0.0.0.0:8000/parse --data 'locale=en_US&text="4111-1111-1111-1111"&dims="[\"credit-card-number\"]"'
+If you want multiple dimensions, comma-separate them in the array:
+$ curl -XPOST http://0.0.0.0:8000/parse --data 'locale=en_US&text="3 cups of sugar"&dims="[\"quantity\",\"numeral\"]"'
+```
 
 See `exe/ExampleMain.hs` for an example on how to integrate Duckling in your
 project.
@@ -45,6 +52,7 @@
 | Dimension | Example input | Example value output
 | --------- | ------------- | --------------------
 | `AmountOfMoney` | "42€" | `{"value":42,"type":"value","unit":"EUR"}`
+| `CreditCardNumber` | "4111-1111-1111-1111" | `{"value":"4111111111111111","issuer":"visa"}`
 | `Distance` | "6 miles" | `{"value":6,"type":"value","unit":"mile"}`
 | `Duration` | "3 mins" | `{"value":3,"minute":3,"unit":"minute","normalized":{"value":180,"unit":"second"}}`
 | `Email` | "duckling-team@fb.com" | `{"value":"duckling-team@fb.com"}`
@@ -68,11 +76,12 @@
 It's important to regenerate the classifiers after updating the code and before
 running the test suite.
 
-To extend Duckling's support for a dimension in a given language, typically 3
+To extend Duckling's support for a dimension in a given language, typically 4
 files need to be updated:
 * `Duckling/<Dimension>/<Lang>/Rules.hs`
 * `Duckling/<Dimension>/<Lang>/Corpus.hs`
 * `Duckling/Dimensions/<Lang>.hs` (if not already present in `Duckling/Dimensions/Common.hs`)
+* `Duckling/Rules/<Lang>.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).
@@ -98,7 +107,7 @@
 ```
 $ stack repl --no-load
 > :l Duckling.Debug
-> debug (makeLocale EN $ Just US) "in two minutes" [This Time]
+> debug (makeLocale EN $ Just US) "in two minutes" [Seal Time]
 in|within|after <duration> (in two minutes)
 -- regex (in)
 -- <integer> <unit-of-duration> (two minutes)
@@ -110,4 +119,4 @@
 ```
 
 ## License
-Duckling is BSD-licensed. We also provide an additional patent grant.
+Duckling is BSD-licensed.
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/duckling.cabal b/duckling.cabal
--- a/duckling.cabal
+++ b/duckling.cabal
@@ -1,25 +1,33 @@
+cabal-version:       2.2
+-- 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.
+
 name:                duckling
-version:             0.1.6.1
+version:             0.2.0.0
 synopsis:            A Haskell library for parsing text into structured data.
 description:
   Duckling is a library for parsing text into structured data.
 homepage:            https://github.com/facebook/duckling#readme
 bug-reports:         https://github.com/facebook/duckling/issues
-license:             OtherLicense
-license-files:       LICENSE,PATENTS
+license:             BSD-3-Clause
+license-files:       LICENSE
 author:              Facebook, Inc.
 maintainer:          duckling-team@fb.com
 copyright:           Copyright (c) 2014-present, Facebook, Inc.
 category:            Systems
 build-type:          Simple
 stability:           alpha
-cabal-version:       >=1.10
 tested-with:
-  GHC==8.0.2,
-  GHC==8.2.1
+  GHC==8.4.4,
+  GHC==8.6.5,
+  GHC==8.8.4,
+  GHC==8.10.3,
+  GHC==9.0.1
 
-extra-source-files:    README.md
-                     , PATENTS
+extra-source-files:    README.md, CHANGELOG.md
 
 library
   exposed-modules:     Duckling.Core
@@ -41,8 +49,11 @@
   -- Rules
                      , Duckling.Rules
                      , Duckling.Rules.Common
+                     , Duckling.Rules.AF
                      , Duckling.Rules.AR
                      , Duckling.Rules.BG
+                     , Duckling.Rules.BN
+                     , Duckling.Rules.CA
                      , Duckling.Rules.CS
                      , Duckling.Rules.DA
                      , Duckling.Rules.DE
@@ -50,6 +61,8 @@
                      , Duckling.Rules.EN
                      , Duckling.Rules.ES
                      , Duckling.Rules.ET
+                     , Duckling.Rules.FI
+                     , Duckling.Rules.FA
                      , Duckling.Rules.FR
                      , Duckling.Rules.GA
                      , Duckling.Rules.HE
@@ -57,10 +70,16 @@
                      , Duckling.Rules.HR
                      , Duckling.Rules.HU
                      , Duckling.Rules.ID
+                     , Duckling.Rules.IS
                      , Duckling.Rules.IT
                      , Duckling.Rules.JA
                      , Duckling.Rules.KA
+                     , Duckling.Rules.KM
+                     , Duckling.Rules.KN
                      , Duckling.Rules.KO
+                     , Duckling.Rules.LO
+                     , Duckling.Rules.ML
+                     , Duckling.Rules.MN
                      , Duckling.Rules.MY
                      , Duckling.Rules.NB
                      , Duckling.Rules.NE
@@ -69,8 +88,12 @@
                      , Duckling.Rules.PT
                      , Duckling.Rules.RO
                      , Duckling.Rules.RU
+                     , Duckling.Rules.SK
                      , Duckling.Rules.SV
+                     , Duckling.Rules.SW
                      , Duckling.Rules.TA
+                     , Duckling.Rules.TE
+                     , Duckling.Rules.TH
                      , Duckling.Rules.TR
                      , Duckling.Rules.UK
                      , Duckling.Rules.VI
@@ -82,8 +105,12 @@
                      , Duckling.Ranking.Extraction
                      , Duckling.Ranking.Rank
                      , Duckling.Ranking.Classifiers
+                     , Duckling.Ranking.Classifiers.AF_XX
+                     , Duckling.Ranking.Classifiers.AR_EG
                      , Duckling.Ranking.Classifiers.AR_XX
                      , Duckling.Ranking.Classifiers.BG_XX
+                     , Duckling.Ranking.Classifiers.BN_XX
+                     , Duckling.Ranking.Classifiers.CA_XX
                      , Duckling.Ranking.Classifiers.CS_XX
                      , Duckling.Ranking.Classifiers.DA_XX
                      , Duckling.Ranking.Classifiers.DE_XX
@@ -94,6 +121,8 @@
                      , Duckling.Ranking.Classifiers.EN_XX
                      , Duckling.Ranking.Classifiers.ES_XX
                      , Duckling.Ranking.Classifiers.ET_XX
+                     , Duckling.Ranking.Classifiers.FI_XX
+                     , Duckling.Ranking.Classifiers.FA_XX
                      , Duckling.Ranking.Classifiers.FR_XX
                      , Duckling.Ranking.Classifiers.GA_XX
                      , Duckling.Ranking.Classifiers.HE_XX
@@ -101,10 +130,16 @@
                      , Duckling.Ranking.Classifiers.HR_XX
                      , Duckling.Ranking.Classifiers.HU_XX
                      , Duckling.Ranking.Classifiers.ID_XX
+                     , Duckling.Ranking.Classifiers.IS_XX
                      , Duckling.Ranking.Classifiers.IT_XX
                      , Duckling.Ranking.Classifiers.JA_XX
                      , Duckling.Ranking.Classifiers.KA_XX
+                     , Duckling.Ranking.Classifiers.KM_XX
+                     , Duckling.Ranking.Classifiers.KN_XX
                      , Duckling.Ranking.Classifiers.KO_XX
+                     , Duckling.Ranking.Classifiers.LO_XX
+                     , Duckling.Ranking.Classifiers.ML_XX
+                     , Duckling.Ranking.Classifiers.MN_XX
                      , Duckling.Ranking.Classifiers.MY_XX
                      , Duckling.Ranking.Classifiers.NB_XX
                      , Duckling.Ranking.Classifiers.NE_XX
@@ -115,8 +150,12 @@
                      , Duckling.Ranking.Classifiers.PT_XX
                      , Duckling.Ranking.Classifiers.RO_XX
                      , Duckling.Ranking.Classifiers.RU_XX
+                     , Duckling.Ranking.Classifiers.SK_XX
                      , Duckling.Ranking.Classifiers.SV_XX
+                     , Duckling.Ranking.Classifiers.SW_XX
                      , Duckling.Ranking.Classifiers.TA_XX
+                     , Duckling.Ranking.Classifiers.TE_XX
+                     , Duckling.Ranking.Classifiers.TH_XX
                      , Duckling.Ranking.Classifiers.TR_XX
                      , Duckling.Ranking.Classifiers.UK_XX
                      , Duckling.Ranking.Classifiers.VI_XX
@@ -131,8 +170,11 @@
                      , Duckling.Dimensions
                      , Duckling.Dimensions.Common
                      , Duckling.Dimensions.Types
+                     , Duckling.Dimensions.AF
                      , Duckling.Dimensions.AR
                      , Duckling.Dimensions.BG
+                     , Duckling.Dimensions.BN
+                     , Duckling.Dimensions.CA
                      , Duckling.Dimensions.CS
                      , Duckling.Dimensions.DA
                      , Duckling.Dimensions.DE
@@ -140,6 +182,8 @@
                      , Duckling.Dimensions.EN
                      , Duckling.Dimensions.ES
                      , Duckling.Dimensions.ET
+                     , Duckling.Dimensions.FI
+                     , Duckling.Dimensions.FA
                      , Duckling.Dimensions.FR
                      , Duckling.Dimensions.GA
                      , Duckling.Dimensions.HE
@@ -147,10 +191,16 @@
                      , Duckling.Dimensions.HR
                      , Duckling.Dimensions.HU
                      , Duckling.Dimensions.ID
+                     , Duckling.Dimensions.IS
                      , Duckling.Dimensions.IT
                      , Duckling.Dimensions.JA
                      , Duckling.Dimensions.KA
+                     , Duckling.Dimensions.KM
+                     , Duckling.Dimensions.KN
                      , Duckling.Dimensions.KO
+                     , Duckling.Dimensions.LO
+                     , Duckling.Dimensions.ML
+                     , Duckling.Dimensions.MN
                      , Duckling.Dimensions.MY
                      , Duckling.Dimensions.NB
                      , Duckling.Dimensions.NE
@@ -159,8 +209,12 @@
                      , Duckling.Dimensions.PT
                      , Duckling.Dimensions.RO
                      , Duckling.Dimensions.RU
+                     , Duckling.Dimensions.SK
                      , Duckling.Dimensions.SV
+                     , Duckling.Dimensions.SW
                      , Duckling.Dimensions.TA
+                     , Duckling.Dimensions.TE
+                     , Duckling.Dimensions.TH
                      , Duckling.Dimensions.TR
                      , Duckling.Dimensions.UK
                      , Duckling.Dimensions.VI
@@ -169,6 +223,8 @@
                      -- AmountOfMoney
                      , Duckling.AmountOfMoney.AR.Corpus
                      , Duckling.AmountOfMoney.AR.Rules
+                     , Duckling.AmountOfMoney.BG.Corpus
+                     , Duckling.AmountOfMoney.BG.Rules
                      , Duckling.AmountOfMoney.EN.AU.Corpus
                      , Duckling.AmountOfMoney.EN.AU.Rules
                      , Duckling.AmountOfMoney.EN.BZ.Corpus
@@ -195,22 +251,30 @@
                      , Duckling.AmountOfMoney.EN.US.Rules
                      , Duckling.AmountOfMoney.EN.ZA.Corpus
                      , Duckling.AmountOfMoney.EN.ZA.Rules
-                     , Duckling.AmountOfMoney.BG.Corpus
-                     , Duckling.AmountOfMoney.BG.Rules
                      , Duckling.AmountOfMoney.ES.Corpus
                      , Duckling.AmountOfMoney.ES.Rules
                      , Duckling.AmountOfMoney.FR.Corpus
                      , Duckling.AmountOfMoney.FR.Rules
                      , Duckling.AmountOfMoney.GA.Corpus
                      , Duckling.AmountOfMoney.GA.Rules
+                     , Duckling.AmountOfMoney.HE.Corpus
+                     , Duckling.AmountOfMoney.HE.Rules
                      , Duckling.AmountOfMoney.HR.Corpus
                      , Duckling.AmountOfMoney.HR.Rules
                      , Duckling.AmountOfMoney.ID.Corpus
                      , Duckling.AmountOfMoney.ID.Rules
+                     , Duckling.AmountOfMoney.IT.Rules
+                     , Duckling.AmountOfMoney.IT.Corpus
+                     , Duckling.AmountOfMoney.KA.Corpus
+                     , Duckling.AmountOfMoney.KA.Rules
                      , Duckling.AmountOfMoney.KO.Corpus
                      , Duckling.AmountOfMoney.KO.Rules
+                     , Duckling.AmountOfMoney.MN.Corpus
+                     , Duckling.AmountOfMoney.MN.Rules
                      , Duckling.AmountOfMoney.NB.Corpus
                      , Duckling.AmountOfMoney.NB.Rules
+                     , Duckling.AmountOfMoney.NL.Corpus
+                     , Duckling.AmountOfMoney.NL.Rules
                      , Duckling.AmountOfMoney.PT.Corpus
                      , Duckling.AmountOfMoney.PT.Rules
                      , Duckling.AmountOfMoney.RO.Corpus
@@ -219,10 +283,10 @@
                      , Duckling.AmountOfMoney.RU.Rules
                      , Duckling.AmountOfMoney.SV.Corpus
                      , Duckling.AmountOfMoney.SV.Rules
+                     , Duckling.AmountOfMoney.TR.Corpus
+                     , Duckling.AmountOfMoney.TR.Rules
                      , Duckling.AmountOfMoney.VI.Corpus
                      , Duckling.AmountOfMoney.VI.Rules
-                     , Duckling.AmountOfMoney.NL.Corpus
-                     , Duckling.AmountOfMoney.NL.Rules
                      , Duckling.AmountOfMoney.ZH.Corpus
                      , Duckling.AmountOfMoney.ZH.Rules
                      , Duckling.AmountOfMoney.Helpers
@@ -234,6 +298,8 @@
                      , Duckling.Distance.BG.Rules
                      , Duckling.Distance.CS.Corpus
                      , Duckling.Distance.CS.Rules
+                     , Duckling.Distance.DE.Corpus
+                     , Duckling.Distance.DE.Rules
                      , Duckling.Distance.EN.Corpus
                      , Duckling.Distance.EN.Rules
                      , Duckling.Distance.ES.Corpus
@@ -244,25 +310,32 @@
                      , Duckling.Distance.GA.Rules
                      , Duckling.Distance.HR.Corpus
                      , Duckling.Distance.HR.Rules
+                     , Duckling.Distance.IT.Corpus
+                     , Duckling.Distance.IT.Rules
+                     , Duckling.Distance.KM.Corpus
+                     , Duckling.Distance.KM.Rules
                      , Duckling.Distance.KO.Corpus
                      , Duckling.Distance.KO.Rules
-                     , Duckling.Distance.PT.Corpus
-                     , Duckling.Distance.PT.Rules
+                     , Duckling.Distance.MN.Corpus
+                     , Duckling.Distance.MN.Rules
                      , Duckling.Distance.NL.Corpus
                      , Duckling.Distance.NL.Rules
+                     , Duckling.Distance.PT.Corpus
+                     , Duckling.Distance.PT.Rules
                      , Duckling.Distance.RO.Corpus
                      , Duckling.Distance.RO.Rules
                      , Duckling.Distance.RU.Corpus
                      , Duckling.Distance.RU.Rules
-                     , Duckling.Distance.TR.Corpus
-                     , Duckling.Distance.TR.Rules
                      , Duckling.Distance.SV.Corpus
                      , Duckling.Distance.SV.Rules
+                     , Duckling.Distance.TR.Corpus
+                     , Duckling.Distance.TR.Rules
                      , Duckling.Distance.ZH.Corpus
                      , Duckling.Distance.ZH.Rules
                      , Duckling.Distance.Helpers
                      , Duckling.Distance.Rules
                      , Duckling.Distance.Types
+                     , Duckling.DistanceUnits.Types
 
                      -- Duration
                      , Duckling.Duration.AR.Corpus
@@ -275,6 +348,8 @@
                      , Duckling.Duration.EL.Rules
                      , Duckling.Duration.EN.Corpus
                      , Duckling.Duration.EN.Rules
+                     , Duckling.Duration.ES.Corpus
+                     , Duckling.Duration.ES.Rules
                      , Duckling.Duration.FR.Corpus
                      , Duckling.Duration.FR.Rules
                      , Duckling.Duration.GA.Corpus
@@ -287,8 +362,12 @@
                      , Duckling.Duration.HU.Rules
                      , Duckling.Duration.IT.Rules
                      , Duckling.Duration.JA.Corpus
+                     , Duckling.Duration.KA.Corpus
+                     , Duckling.Duration.KA.Rules
                      , Duckling.Duration.KO.Corpus
                      , Duckling.Duration.KO.Rules
+                     , Duckling.Duration.MN.Corpus
+                     , Duckling.Duration.MN.Rules
                      , Duckling.Duration.NB.Corpus
                      , Duckling.Duration.NB.Rules
                      , Duckling.Duration.NL.Corpus
@@ -296,24 +375,31 @@
                      , Duckling.Duration.PL.Corpus
                      , Duckling.Duration.PL.Rules
                      , Duckling.Duration.PT.Corpus
-                     , Duckling.Duration.SV.Corpus
-                     , Duckling.Duration.SV.Rules
-                     , Duckling.Duration.ZH.Corpus
                      , Duckling.Duration.RO.Corpus
                      , Duckling.Duration.RO.Rules
                      , Duckling.Duration.RU.Corpus
                      , Duckling.Duration.RU.Rules
+                     , Duckling.Duration.SV.Corpus
+                     , Duckling.Duration.SV.Rules
                      , Duckling.Duration.TR.Corpus
                      , Duckling.Duration.TR.Rules
+                     , Duckling.Duration.UK.Corpus
+                     , Duckling.Duration.UK.Rules
+                     , Duckling.Duration.ZH.Corpus
+                     , Duckling.Duration.ZH.Rules
                      , Duckling.Duration.Helpers
                      , Duckling.Duration.Rules
                      , Duckling.Duration.Types
 
                      -- Email
+                     , Duckling.Email.DE.Corpus
+                     , Duckling.Email.DE.Rules
                      , Duckling.Email.EN.Corpus
                      , Duckling.Email.EN.Rules
                      , Duckling.Email.FR.Corpus
                      , Duckling.Email.FR.Rules
+                     , Duckling.Email.IS.Corpus
+                     , Duckling.Email.IS.Rules
                      , Duckling.Email.IT.Corpus
                      , Duckling.Email.IT.Rules
                      , Duckling.Email.Corpus
@@ -321,10 +407,20 @@
                      , Duckling.Email.Types
 
                      -- Numeral
+                     , Duckling.Numeral.AF.Corpus
+                     , Duckling.Numeral.AF.Rules
                      , Duckling.Numeral.AR.Corpus
+                     , Duckling.Numeral.AR.Helpers
                      , Duckling.Numeral.AR.Rules
+                     , Duckling.Numeral.AR.EG.Corpus
+                     , Duckling.Numeral.AR.EG.Helpers
+                     , Duckling.Numeral.AR.EG.Rules
                      , Duckling.Numeral.BG.Corpus
                      , Duckling.Numeral.BG.Rules
+                     , Duckling.Numeral.BN.Corpus
+                     , Duckling.Numeral.BN.Rules
+                     , Duckling.Numeral.CA.Corpus
+                     , Duckling.Numeral.CA.Rules
                      , Duckling.Numeral.CS.Corpus
                      , Duckling.Numeral.CS.Rules
                      , Duckling.Numeral.DA.Corpus
@@ -335,10 +431,28 @@
                      , Duckling.Numeral.EL.Rules
                      , Duckling.Numeral.EN.Corpus
                      , Duckling.Numeral.EN.Rules
+                     , Duckling.Numeral.ES.AR.Corpus
+                     , Duckling.Numeral.ES.AR.Rules
+                     , Duckling.Numeral.ES.CL.Corpus
+                     , Duckling.Numeral.ES.CL.Rules
                      , Duckling.Numeral.ES.Corpus
+                     , Duckling.Numeral.ES.CO.Corpus
+                     , Duckling.Numeral.ES.CO.Rules
+                     , Duckling.Numeral.ES.ES.Corpus
+                     , Duckling.Numeral.ES.ES.Rules
+                     , Duckling.Numeral.ES.MX.Corpus
+                     , Duckling.Numeral.ES.MX.Rules
+                     , Duckling.Numeral.ES.PE.Corpus
+                     , Duckling.Numeral.ES.PE.Rules
                      , Duckling.Numeral.ES.Rules
+                     , Duckling.Numeral.ES.VE.Corpus
+                     , Duckling.Numeral.ES.VE.Rules
                      , Duckling.Numeral.ET.Corpus
                      , Duckling.Numeral.ET.Rules
+                     , Duckling.Numeral.FI.Corpus
+                     , Duckling.Numeral.FI.Rules
+                     , Duckling.Numeral.FA.Corpus
+                     , Duckling.Numeral.FA.Rules
                      , Duckling.Numeral.FR.Corpus
                      , Duckling.Numeral.FR.Rules
                      , Duckling.Numeral.GA.Corpus
@@ -353,14 +467,26 @@
                      , Duckling.Numeral.HU.Rules
                      , Duckling.Numeral.ID.Corpus
                      , Duckling.Numeral.ID.Rules
+                     , Duckling.Numeral.IS.Corpus
+                     , Duckling.Numeral.IS.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.KM.Corpus
+                     , Duckling.Numeral.KM.Rules
+                     , Duckling.Numeral.KN.Corpus
+                     , Duckling.Numeral.KN.Rules
                      , Duckling.Numeral.KO.Corpus
                      , Duckling.Numeral.KO.Rules
+                     , Duckling.Numeral.LO.Corpus
+                     , Duckling.Numeral.LO.Rules
+                     , Duckling.Numeral.ML.Corpus
+                     , Duckling.Numeral.ML.Rules
+                     , Duckling.Numeral.MN.Corpus
+                     , Duckling.Numeral.MN.Rules
                      , Duckling.Numeral.MY.Corpus
                      , Duckling.Numeral.MY.Rules
                      , Duckling.Numeral.NB.Corpus
@@ -373,12 +499,22 @@
                      , Duckling.Numeral.PL.Rules
                      , Duckling.Numeral.PT.Corpus
                      , Duckling.Numeral.PT.Rules
+                     , Duckling.Numeral.RO.Corpus
+                     , Duckling.Numeral.RO.Rules
                      , Duckling.Numeral.RU.Corpus
                      , Duckling.Numeral.RU.Rules
+                     , Duckling.Numeral.SK.Corpus
+                     , Duckling.Numeral.SK.Rules
                      , Duckling.Numeral.SV.Corpus
                      , Duckling.Numeral.SV.Rules
+                     , Duckling.Numeral.SW.Corpus
+                     , Duckling.Numeral.SW.Rules
                      , Duckling.Numeral.TA.Corpus
                      , Duckling.Numeral.TA.Rules
+                     , Duckling.Numeral.TE.Corpus
+                     , Duckling.Numeral.TE.Rules
+                     , Duckling.Numeral.TH.Corpus
+                     , Duckling.Numeral.TH.Rules
                      , Duckling.Numeral.TR.Corpus
                      , Duckling.Numeral.TR.Rules
                      , Duckling.Numeral.UK.Corpus
@@ -387,8 +523,6 @@
                      , Duckling.Numeral.VI.Rules
                      , Duckling.Numeral.ZH.Corpus
                      , Duckling.Numeral.ZH.Rules
-                     , Duckling.Numeral.RO.Corpus
-                     , Duckling.Numeral.RO.Rules
                      , Duckling.Numeral.Helpers
                      , Duckling.Numeral.Rules
                      , Duckling.Numeral.Types
@@ -398,6 +532,8 @@
                      , Duckling.Ordinal.AR.Rules
                      , Duckling.Ordinal.BG.Corpus
                      , Duckling.Ordinal.BG.Rules
+                     , Duckling.Ordinal.CA.Corpus
+                     , Duckling.Ordinal.CA.Rules
                      , Duckling.Ordinal.DA.Corpus
                      , Duckling.Ordinal.DA.Rules
                      , Duckling.Ordinal.DE.Corpus
@@ -428,8 +564,16 @@
                      , Duckling.Ordinal.IT.Rules
                      , Duckling.Ordinal.JA.Corpus
                      , Duckling.Ordinal.JA.Rules
+                     , Duckling.Ordinal.KA.Corpus
+                     , Duckling.Ordinal.KA.Rules
+                     , Duckling.Ordinal.KM.Corpus
+                     , Duckling.Ordinal.KM.Rules
                      , Duckling.Ordinal.KO.Corpus
                      , Duckling.Ordinal.KO.Rules
+                     , Duckling.Ordinal.ML.Corpus
+                     , Duckling.Ordinal.ML.Rules
+                     , Duckling.Ordinal.MN.Corpus
+                     , Duckling.Ordinal.MN.Rules
                      , Duckling.Ordinal.NB.Corpus
                      , Duckling.Ordinal.NB.Rules
                      , Duckling.Ordinal.NL.Corpus
@@ -444,6 +588,8 @@
                      , Duckling.Ordinal.RU.Rules
                      , Duckling.Ordinal.SV.Corpus
                      , Duckling.Ordinal.SV.Rules
+                     , Duckling.Ordinal.TA.Corpus
+                     , Duckling.Ordinal.TA.Rules
                      , Duckling.Ordinal.TR.Corpus
                      , Duckling.Ordinal.TR.Rules
                      , Duckling.Ordinal.UK.Corpus
@@ -456,6 +602,8 @@
                      , Duckling.Ordinal.Types
 
                      -- PhoneNumber
+                     , Duckling.PhoneNumber.AR.Corpus
+                     , Duckling.PhoneNumber.AR.Rules
                      , Duckling.PhoneNumber.PT.Corpus
                      , Duckling.PhoneNumber.PT.Rules
                      , Duckling.PhoneNumber.Corpus
@@ -467,12 +615,20 @@
                      , Duckling.Quantity.AR.Rules
                      , Duckling.Quantity.EN.Corpus
                      , Duckling.Quantity.EN.Rules
+                     , Duckling.Quantity.ES.Corpus
+                     , Duckling.Quantity.ES.Rules
                      , Duckling.Quantity.FR.Corpus
                      , Duckling.Quantity.FR.Rules
                      , Duckling.Quantity.HR.Corpus
                      , Duckling.Quantity.HR.Rules
+                     , Duckling.Quantity.KM.Corpus
+                     , Duckling.Quantity.KM.Rules
                      , Duckling.Quantity.KO.Corpus
                      , Duckling.Quantity.KO.Rules
+                     , Duckling.Quantity.MN.Corpus
+                     , Duckling.Quantity.MN.Rules
+                     , Duckling.Quantity.NL.Corpus
+                     , Duckling.Quantity.NL.Rules
                      , Duckling.Quantity.PT.Corpus
                      , Duckling.Quantity.PT.Rules
                      , Duckling.Quantity.RO.Corpus
@@ -498,14 +654,20 @@
                      , Duckling.Temperature.FR.Rules
                      , Duckling.Temperature.GA.Corpus
                      , Duckling.Temperature.GA.Rules
+                     , Duckling.Temperature.HI.Corpus
+                     , Duckling.Temperature.HI.Rules
                      , Duckling.Temperature.HR.Corpus
                      , Duckling.Temperature.HR.Rules
                      , Duckling.Temperature.IT.Corpus
                      , Duckling.Temperature.IT.Rules
                      , Duckling.Temperature.JA.Corpus
                      , Duckling.Temperature.JA.Rules
+                     , Duckling.Temperature.KM.Corpus
+                     , Duckling.Temperature.KM.Rules
                      , Duckling.Temperature.KO.Corpus
                      , Duckling.Temperature.KO.Rules
+                     , Duckling.Temperature.MN.Rules
+                     , Duckling.Temperature.MN.Corpus
                      , Duckling.Temperature.PT.Corpus
                      , Duckling.Temperature.PT.Rules
                      , Duckling.Temperature.RO.Corpus
@@ -521,6 +683,8 @@
                      -- Time
                      , Duckling.Time.AR.Corpus
                      , Duckling.Time.AR.Rules
+                     , Duckling.Time.BG.Corpus
+                     , Duckling.Time.BG.Rules
                      , Duckling.Time.DA.Corpus
                      , Duckling.Time.DA.Rules
                      , Duckling.Time.DE.Corpus
@@ -567,6 +731,8 @@
                      , Duckling.Time.HU.Rules
                      , Duckling.Time.IT.Corpus
                      , Duckling.Time.IT.Rules
+                     , Duckling.Time.KA.Corpus
+                     , Duckling.Time.KA.Rules
                      , Duckling.Time.KO.Corpus
                      , Duckling.Time.KO.Rules
                      , Duckling.Time.NB.Corpus
@@ -582,8 +748,14 @@
                      , Duckling.Time.PT.Rules
                      , Duckling.Time.RO.Corpus
                      , Duckling.Time.RO.Rules
+                     , Duckling.Time.RU.Corpus
+                     , Duckling.Time.RU.Rules
                      , Duckling.Time.SV.Corpus
                      , Duckling.Time.SV.Rules
+                     , Duckling.Time.TR.Corpus
+                     , Duckling.Time.TR.Rules
+                     , Duckling.Time.UK.Corpus
+                     , Duckling.Time.UK.Rules
                      , Duckling.Time.VI.Corpus
                      , Duckling.Time.VI.Rules
                      , Duckling.Time.ZH.Corpus
@@ -599,6 +771,7 @@
                      , Duckling.Time.Computed
                      , Duckling.Time.Corpus
                      , Duckling.Time.Helpers
+                     , Duckling.Time.HolidayHelpers
                      , Duckling.Time.Types
                      -- REMOVE ME
                      , Duckling.Time.TimeZone.Parse
@@ -611,6 +784,7 @@
                      , Duckling.TimeGrain.EN.Rules
                      , Duckling.TimeGrain.EL.Rules
                      , Duckling.TimeGrain.ES.Rules
+                     , Duckling.TimeGrain.FI.Rules
                      , Duckling.TimeGrain.FR.Rules
                      , Duckling.TimeGrain.GA.Rules
                      , Duckling.TimeGrain.HE.Rules
@@ -619,7 +793,9 @@
                      , Duckling.TimeGrain.HU.Rules
                      , Duckling.TimeGrain.IT.Rules
                      , Duckling.TimeGrain.JA.Rules
+                     , Duckling.TimeGrain.KA.Rules
                      , Duckling.TimeGrain.KO.Rules
+                     , Duckling.TimeGrain.MN.Rules
                      , Duckling.TimeGrain.NB.Rules
                      , Duckling.TimeGrain.NL.Rules
                      , Duckling.TimeGrain.PL.Rules
@@ -628,6 +804,7 @@
                      , Duckling.TimeGrain.RU.Rules
                      , Duckling.TimeGrain.SV.Rules
                      , Duckling.TimeGrain.TR.Rules
+                     , Duckling.TimeGrain.UK.Rules
                      , Duckling.TimeGrain.VI.Rules
                      , Duckling.TimeGrain.ZH.Rules
                      , Duckling.TimeGrain.Types
@@ -641,6 +818,8 @@
                      -- Volume
                      , Duckling.Volume.AR.Corpus
                      , Duckling.Volume.AR.Rules
+                     , Duckling.Volume.DE.Corpus
+                     , Duckling.Volume.DE.Rules
                      , Duckling.Volume.EN.Corpus
                      , Duckling.Volume.EN.Rules
                      , Duckling.Volume.ES.Corpus
@@ -653,10 +832,14 @@
                      , Duckling.Volume.HR.Rules
                      , Duckling.Volume.IT.Corpus
                      , Duckling.Volume.IT.Rules
+                     , Duckling.Volume.KM.Corpus
+                     , Duckling.Volume.KM.Rules
                      , Duckling.Volume.KO.Corpus
                      , Duckling.Volume.KO.Rules
                      , Duckling.Volume.PT.Corpus
                      , Duckling.Volume.PT.Rules
+                     , Duckling.Volume.MN.Corpus
+                     , Duckling.Volume.MN.Rules
                      , Duckling.Volume.NL.Corpus
                      , Duckling.Volume.NL.Rules
                      , Duckling.Volume.RO.Corpus
@@ -665,26 +848,38 @@
                      , Duckling.Volume.RU.Rules
                      , Duckling.Volume.TR.Corpus
                      , Duckling.Volume.TR.Rules
+                     , Duckling.Volume.ZH.Corpus
+                     , Duckling.Volume.ZH.Rules
                      , Duckling.Volume.Helpers
                      , Duckling.Volume.Rules
                      , Duckling.Volume.Types
-  build-depends:       base                  >= 4.8.2 && < 5.0
+
+                     -- CreditCardNumber
+                     , Duckling.CreditCardNumber.Corpus
+                     , Duckling.CreditCardNumber.Helpers
+                     , Duckling.CreditCardNumber.Rules
+                     , Duckling.CreditCardNumber.Types
+  build-depends:     , base                  >= 4.8.2 && < 5.0
                      , array                 >= 0.5.1.1 && < 0.6
-                     , attoparsec            >= 0.13.1.0 && < 0.14
-                     , aeson                 >= 0.11.3.0 && < 1.3
-                     , bytestring            >= 0.10.6.0 && < 0.11
-                     , containers            >= 0.5.6.2 && < 0.6
+                     , attoparsec            >= 0.13.1.0 && < 0.15
+                     , aeson                 >= 0.11.3.0 && < 1.6
+                     , bytestring            >= 0.10.6.0 && < 0.12
+                     , containers            >= 0.5.6.2 && < 0.7
                      , deepseq               >= 1.4.1.1 && < 1.5
-                     , dependent-sum         >= 0.3.2.2 && < 0.5
-                     , extra                 >= 1.4.10 && < 1.7
-                     , hashable              >= 1.2.4.0 && < 1.3
-                     , regex-base            >= 0.93.2 && < 0.94
-                     , regex-pcre            >= 0.94.4 && < 0.95
+                     , dependent-sum         >= 0.3.2.2 && < 0.8
+                     , extra                 >= 1.4.10 && < 1.8
+                     , hashable              >= 1.2.4.0 && < 1.4
+                     , regex-base            >= 0.93.2 && < 0.95
                      , text                  >= 1.2.2.1 && < 1.3
-                     , text-show             >= 2.1.2 && < 3.7
-                     , time                  >= 1.5.0.1 && < 1.9
+                     , text-show             >= 2.1.2 && < 3.10
+                     , time                  >= 1.5.0.1 && < 2
                      , timezone-series       >= 0.1.5.1 && < 0.2
                      , unordered-containers  >= 0.2.7.2 && < 0.3
+  if os(windows)
+    build-depends: , regex-pcre-builtin      >= 0.94.4 && < 0.96
+  else
+    build-depends: , regex-pcre              >= 0.94.4 && < 0.96
+
   default-language:    Haskell2010
   default-extensions:  OverloadedStrings
 
@@ -698,7 +893,7 @@
                      , text
                      , time
                      , unordered-containers
-                     , tasty                 >= 0.11.1 && < 0.12
+                     , tasty                 >= 0.11.1 && < 1.3
                      , tasty-hunit           >= 0.9.2 && < 1.0
   other-modules:       Duckling.Tests
                      , Duckling.Testing.Asserts
@@ -717,14 +912,19 @@
                      , Duckling.AmountOfMoney.ES.Tests
                      , Duckling.AmountOfMoney.FR.Tests
                      , Duckling.AmountOfMoney.GA.Tests
+                     , Duckling.AmountOfMoney.HE.Tests
                      , Duckling.AmountOfMoney.HR.Tests
                      , Duckling.AmountOfMoney.ID.Tests
+                     , Duckling.AmountOfMoney.IT.Tests
+                     , Duckling.AmountOfMoney.KA.Tests
                      , Duckling.AmountOfMoney.KO.Tests
+                     , Duckling.AmountOfMoney.MN.Tests
                      , Duckling.AmountOfMoney.NB.Tests
                      , Duckling.AmountOfMoney.PT.Tests
                      , Duckling.AmountOfMoney.RO.Tests
                      , Duckling.AmountOfMoney.RU.Tests
                      , Duckling.AmountOfMoney.SV.Tests
+                     , Duckling.AmountOfMoney.TR.Tests
                      , Duckling.AmountOfMoney.VI.Tests
                      , Duckling.AmountOfMoney.NL.Tests
                      , Duckling.AmountOfMoney.ZH.Tests
@@ -733,12 +933,16 @@
                      -- Distance
                      , Duckling.Distance.BG.Tests
                      , Duckling.Distance.CS.Tests
+                     , Duckling.Distance.DE.Tests
                      , Duckling.Distance.EN.Tests
                      , Duckling.Distance.ES.Tests
                      , Duckling.Distance.FR.Tests
                      , Duckling.Distance.GA.Tests
                      , Duckling.Distance.HR.Tests
+                     , Duckling.Distance.IT.Tests
+                     , Duckling.Distance.KM.Tests
                      , Duckling.Distance.KO.Tests
+                     , Duckling.Distance.MN.Tests
                      , Duckling.Distance.NL.Tests
                      , Duckling.Distance.PT.Tests
                      , Duckling.Distance.RO.Tests
@@ -753,12 +957,15 @@
                      , Duckling.Duration.BG.Tests
                      , Duckling.Duration.EL.Tests
                      , Duckling.Duration.EN.Tests
+                     , Duckling.Duration.ES.Tests
                      , Duckling.Duration.FR.Tests
                      , Duckling.Duration.GA.Tests
                      , Duckling.Duration.HU.Tests
                      , Duckling.Duration.HI.Tests
                      , Duckling.Duration.JA.Tests
+                     , Duckling.Duration.KA.Tests
                      , Duckling.Duration.KO.Tests
+                     , Duckling.Duration.MN.Tests
                      , Duckling.Duration.NB.Tests
                      , Duckling.Duration.NL.Tests
                      , Duckling.Duration.PL.Tests
@@ -767,18 +974,24 @@
                      , Duckling.Duration.RU.Tests
                      , Duckling.Duration.SV.Tests
                      , Duckling.Duration.TR.Tests
+                     , Duckling.Duration.UK.Tests
                      , Duckling.Duration.ZH.Tests
                      , Duckling.Duration.Tests
 
                      -- Email
                      , Duckling.Email.EN.Tests
+                     , Duckling.Email.DE.Tests
+                     , Duckling.Email.IS.Tests
                      , Duckling.Email.FR.Tests
                      , Duckling.Email.IT.Tests
                      , Duckling.Email.Tests
 
                      -- Numeral
+                     , Duckling.Numeral.AF.Tests
                      , Duckling.Numeral.AR.Tests
                      , Duckling.Numeral.BG.Tests
+                     , Duckling.Numeral.BN.Tests
+                     , Duckling.Numeral.CA.Tests
                      , Duckling.Numeral.CS.Tests
                      , Duckling.Numeral.DA.Tests
                      , Duckling.Numeral.DE.Tests
@@ -786,6 +999,8 @@
                      , Duckling.Numeral.EN.Tests
                      , Duckling.Numeral.ES.Tests
                      , Duckling.Numeral.ET.Tests
+                     , Duckling.Numeral.FI.Tests
+                     , Duckling.Numeral.FA.Tests
                      , Duckling.Numeral.FR.Tests
                      , Duckling.Numeral.GA.Tests
                      , Duckling.Numeral.HE.Tests
@@ -793,10 +1008,16 @@
                      , Duckling.Numeral.HR.Tests
                      , Duckling.Numeral.HU.Tests
                      , Duckling.Numeral.ID.Tests
+                     , Duckling.Numeral.IS.Tests
                      , Duckling.Numeral.IT.Tests
                      , Duckling.Numeral.JA.Tests
                      , Duckling.Numeral.KA.Tests
+                     , Duckling.Numeral.KM.Tests
+                     , Duckling.Numeral.KN.Tests
                      , Duckling.Numeral.KO.Tests
+                     , Duckling.Numeral.LO.Tests
+                     , Duckling.Numeral.ML.Tests
+                     , Duckling.Numeral.MN.Tests
                      , Duckling.Numeral.MY.Tests
                      , Duckling.Numeral.NB.Tests
                      , Duckling.Numeral.NE.Tests
@@ -805,8 +1026,12 @@
                      , Duckling.Numeral.PT.Tests
                      , Duckling.Numeral.RO.Tests
                      , Duckling.Numeral.RU.Tests
+                     , Duckling.Numeral.SK.Tests
                      , Duckling.Numeral.SV.Tests
+                     , Duckling.Numeral.SW.Tests
                      , Duckling.Numeral.TA.Tests
+                     , Duckling.Numeral.TE.Tests
+                     , Duckling.Numeral.TH.Tests
                      , Duckling.Numeral.TR.Tests
                      , Duckling.Numeral.UK.Tests
                      , Duckling.Numeral.VI.Tests
@@ -816,6 +1041,7 @@
                      -- Ordinal
                      , Duckling.Ordinal.AR.Tests
                      , Duckling.Ordinal.BG.Tests
+                     , Duckling.Ordinal.CA.Tests
                      , Duckling.Ordinal.DA.Tests
                      , Duckling.Ordinal.DE.Tests
                      , Duckling.Ordinal.EL.Tests
@@ -831,7 +1057,11 @@
                      , Duckling.Ordinal.ID.Tests
                      , Duckling.Ordinal.IT.Tests
                      , Duckling.Ordinal.JA.Tests
+                     , Duckling.Ordinal.KA.Tests
+                     , Duckling.Ordinal.KM.Tests
                      , Duckling.Ordinal.KO.Tests
+                     , Duckling.Ordinal.MN.Tests
+                     , Duckling.Ordinal.ML.Tests
                      , Duckling.Ordinal.NB.Tests
                      , Duckling.Ordinal.NL.Tests
                      , Duckling.Ordinal.PL.Tests
@@ -839,6 +1069,7 @@
                      , Duckling.Ordinal.RO.Tests
                      , Duckling.Ordinal.RU.Tests
                      , Duckling.Ordinal.SV.Tests
+                     , Duckling.Ordinal.TA.Tests
                      , Duckling.Ordinal.TR.Tests
                      , Duckling.Ordinal.UK.Tests
                      , Duckling.Ordinal.VI.Tests
@@ -846,15 +1077,20 @@
                      , Duckling.Ordinal.Tests
 
                      -- PhoneNumber
+                     , Duckling.PhoneNumber.AR.Tests
                      , Duckling.PhoneNumber.PT.Tests
                      , Duckling.PhoneNumber.Tests
 
                      -- Quantity
                      , Duckling.Quantity.AR.Tests
                      , Duckling.Quantity.EN.Tests
+                     , Duckling.Quantity.ES.Tests
                      , Duckling.Quantity.FR.Tests
                      , Duckling.Quantity.HR.Tests
+                     , Duckling.Quantity.KM.Tests
                      , Duckling.Quantity.KO.Tests
+                     , Duckling.Quantity.MN.Tests
+                     , Duckling.Quantity.NL.Tests
                      , Duckling.Quantity.PT.Tests
                      , Duckling.Quantity.RO.Tests
                      , Duckling.Quantity.RU.Tests
@@ -867,9 +1103,12 @@
                      , Duckling.Temperature.ES.Tests
                      , Duckling.Temperature.FR.Tests
                      , Duckling.Temperature.GA.Tests
+                     , Duckling.Temperature.HI.Tests
                      , Duckling.Temperature.HR.Tests
                      , Duckling.Temperature.IT.Tests
                      , Duckling.Temperature.JA.Tests
+                     , Duckling.Temperature.MN.Tests
+                     , Duckling.Temperature.KM.Tests
                      , Duckling.Temperature.KO.Tests
                      , Duckling.Temperature.PT.Tests
                      , Duckling.Temperature.RO.Tests
@@ -879,6 +1118,7 @@
 
                      -- Time
                      , Duckling.Time.AR.Tests
+                     , Duckling.Time.BG.Tests
                      , Duckling.Time.DA.Tests
                      , Duckling.Time.DE.Tests
                      , Duckling.Time.EL.Tests
@@ -890,13 +1130,16 @@
                      , Duckling.Time.HE.Tests
                      , Duckling.Time.HU.Tests
                      , Duckling.Time.IT.Tests
+                     , Duckling.Time.KA.Tests
                      , Duckling.Time.KO.Tests
                      , Duckling.Time.NB.Tests
                      , Duckling.Time.NL.Tests
                      , Duckling.Time.PL.Tests
                      , Duckling.Time.PT.Tests
                      , Duckling.Time.RO.Tests
+                     , Duckling.Time.RU.Tests
                      , Duckling.Time.SV.Tests
+                     , Duckling.Time.UK.Tests
                      , Duckling.Time.VI.Tests
                      , Duckling.Time.ZH.Tests
                      , Duckling.Time.Tests
@@ -906,20 +1149,27 @@
 
                      -- Volume
                      , Duckling.Volume.AR.Tests
+                     , Duckling.Volume.DE.Tests
                      , Duckling.Volume.EN.Tests
                      , Duckling.Volume.ES.Tests
                      , Duckling.Volume.FR.Tests
                      , Duckling.Volume.GA.Tests
                      , Duckling.Volume.HR.Tests
                      , Duckling.Volume.IT.Tests
+                     , Duckling.Volume.KM.Tests
                      , Duckling.Volume.KO.Tests
                      , Duckling.Volume.PT.Tests
+                     , Duckling.Volume.MN.Tests
                      , Duckling.Volume.NL.Tests
                      , Duckling.Volume.RO.Tests
                      , Duckling.Volume.RU.Tests
                      , Duckling.Volume.TR.Tests
+                     , Duckling.Volume.ZH.Tests
                      , Duckling.Volume.Tests
 
+                     -- CreditCardNumber
+                     , Duckling.CreditCardNumber.Tests
+
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wincomplete-patterns
   default-language:    Haskell2010
   default-extensions:  OverloadedStrings
@@ -932,7 +1182,7 @@
                      , Duckling.Ranking.Generate
   build-depends:       duckling
                      , base
-                     , haskell-src-exts      >= 1.18 && < 1.20
+                     , haskell-src-exts      >= 1.18 && < 1.30
                      , text
                      , unordered-containers
   default-language:    Haskell2010
@@ -951,11 +1201,11 @@
                      , extra
                      , filepath              >= 1.4.0.0 && < 1.5
                      , snap-core             >= 1.0.2.0 && < 1.1
-                     , snap-server           >= 1.0.1.1 && < 1.1
+                     , snap-server           >= 1.0.1.1 && < 1.2
                      , text
                      , text-show
                      , time
-                     , timezone-olson        >= 0.1.7 && < 0.2
+                     , timezone-olson        >= 0.1.7 && < 0.3
                      , timezone-series
                      , unordered-containers
   default-language:    Haskell2010
@@ -990,7 +1240,7 @@
                      , filepath              >= 1.4.0.0 && < 1.5
                      , text
                      , time
-                     , timezone-olson        >= 0.1.7 && < 0.2
+                     , timezone-olson        >= 0.1.7 && < 0.3
                      , timezone-series
                      , unordered-containers
   default-language:    Haskell2010
@@ -1009,7 +1259,7 @@
                      , filepath              >= 1.4.0.0 && < 1.5
                      , text
                      , time
-                     , timezone-olson        >= 0.1.7 && < 0.2
+                     , timezone-olson        >= 0.1.7 && < 0.3
                      , timezone-series
                      , unordered-containers
   default-language:    Haskell2010
diff --git a/exe/CustomDimensionExample.hs b/exe/CustomDimensionExample.hs
--- a/exe/CustomDimensionExample.hs
+++ b/exe/CustomDimensionExample.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DeriveGeneric #-}
@@ -11,6 +10,8 @@
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE TypeFamilies #-}
 
 module Main (main) where
@@ -20,7 +21,6 @@
 import Data.Aeson
 import Data.Hashable
 import Data.Semigroup ((<>))
-import Data.Some
 import Data.Text (Text)
 import Data.Typeable
 import GHC.Generics
@@ -30,6 +30,7 @@
 
 import Duckling.Debug
 import Duckling.Locale
+import Duckling.Regex.Types (GroupMatch(..))
 import Duckling.Resolve (Resolve(..))
 import Duckling.Types
 
@@ -37,7 +38,7 @@
 
 instance CustomDimension MyDimension where
   type DimensionData MyDimension = MyData
-  dimRules _ = [myRule]
+  dimRules _ = [myDimensionRule, myDimensionRule']
   dimLangRules _ _ = []
   dimLocaleRules _ _ = []
   dimDependents _ = HashSet.empty
@@ -61,9 +62,15 @@
 instance ToJSON MyValue where
   toJSON (MyValue value) = object [ "value" .= value ]
 
-myRule :: Rule
-myRule = Rule
-  { name = "my dimension"
+myDimensionPredicate :: Predicate
+myDimensionPredicate (Token (CustomDimension (dim :: a)) dimData)
+  | Just Refl <- eqT @a @MyDimension, MyData{..} <- dimData =
+      iField == 42 && bField
+myDimensionPredicate _ = False
+
+myDimensionRule :: Rule
+myDimensionRule = Rule
+  { name = "my dimension (simple)"
   , pattern =
     [ regex "my dimension"
     ]
@@ -76,7 +83,28 @@
       _ -> Nothing
   }
 
+myDimensionRule' :: Rule
+myDimensionRule' = Rule
+  { name = "my dimension (pattern match)"
+  , pattern =
+    [ Predicate myDimensionPredicate
+    , regex "pattern match"
+    ]
+  , prod = \case
+      ((Token (CustomDimension (dim :: a)) dimData):
+       Token RegexMatch (GroupMatch _):
+       _)
+        | Just Refl <- eqT @a @MyDimension, MyData{..} <- dimData ->
+            Just . Token (CustomDimension MyDimension) $ MyData
+              { iField = iField * 10
+              , bField = not bField
+              , tField = "goodnight moon"
+              }
+      _ -> Nothing
+  }
+
 main :: IO ()
 main = do
   let en = makeLocale EN Nothing
-  debug en "input for my dimension" [This (CustomDimension MyDimension)] >>= print
+  debug en "testing my dimension" [Seal (CustomDimension MyDimension)] >>= print
+  debug en "testing my dimension pattern match" [Seal (CustomDimension MyDimension)] >>= print
diff --git a/exe/Duckling/Data/TimeZone.hs b/exe/Duckling/Data/TimeZone.hs
--- a/exe/Duckling/Data/TimeZone.hs
+++ b/exe/Duckling/Data/TimeZone.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -25,7 +24,7 @@
 import Data.Time.LocalTime.TimeZone.Olson
 import Data.Time.LocalTime.TimeZone.Series
 import System.Directory
-import System.FilePath
+import System.FilePath.Posix
 
 import Prelude
 
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
@@ -2,16 +2,16 @@
 -- 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.
-
+-- LICENSE file in the root directory of this source tree.
 
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE RecordWildCards #-}
 
 module Duckling.Ranking.Generate
   ( regenAllClassifiers
   , regenClassifiers
+  , regenLangClassifiers
   ) where
 
 import Data.HashSet (HashSet)
@@ -27,7 +27,9 @@
 import Duckling.Ranking.Types
 import Duckling.Rules
 import Duckling.Testing.Types
+import qualified Duckling.Region as R
 import qualified Duckling.Time.AR.Corpus as ARTime
+import qualified Duckling.Time.BG.Corpus as BGTime
 import qualified Duckling.Time.DA.Corpus as DATime
 import qualified Duckling.Time.DE.Corpus as DETime
 import qualified Duckling.Time.EL.Corpus as ELTime
@@ -49,7 +51,9 @@
 import qualified Duckling.Time.PL.Corpus as PLTime
 import qualified Duckling.Time.PT.Corpus as PTTime
 import qualified Duckling.Time.RO.Corpus as ROTime
+import qualified Duckling.Time.RU.Corpus as RUTime
 import qualified Duckling.Time.SV.Corpus as SVTime
+import qualified Duckling.Time.UK.Corpus as UKTime
 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
@@ -68,12 +72,18 @@
   mapM_ regenClassifiers locales
   where
     defaultLocale :: Lang -> Locale
-    defaultLocale lang = Locale lang Nothing
+    defaultLocale lang = makeLocale lang Nothing
     f :: [Locale] -> Lang -> HashSet Region -> [Locale]
     f res lang countries =
-      res ++ [Locale lang (Just c) | c <- HashSet.toList countries]
+      res ++ [makeLocale lang (Just c) | c <- HashSet.toList countries]
     locales = HashMap.foldlWithKey' f [] allLocales
 
+regenLangClassifiers :: Lang -> IO ()
+regenLangClassifiers lang = do
+  regenClassifiers $ makeLocale lang Nothing
+  mapM_ (regenClassifiers . makeLocale lang . Just)
+    $ HashMap.lookupDefault HashSet.empty lang allLocales
+
 -- | Run this function to overwrite the file with Classifiers data
 regenClassifiers :: Locale -> IO ()
 regenClassifiers locale = do
@@ -87,7 +97,7 @@
 
     filepath = "Duckling/Ranking/Classifiers/" ++ moduleName ++ ".hs"
 
-    rules = rulesFor locale . HashSet.singleton $ This Time
+    rules = rulesFor locale . HashSet.singleton $ Seal Time
 
     -- | The trained classifier to write out
     classifiers = makeClassifiers rules trainSet
@@ -157,48 +167,65 @@
 
 -- | For backward compatibility.
 getDefaultCorpusForLang :: Lang -> Corpus
-getDefaultCorpusForLang EN = ENTime.defaultCorpus
-getDefaultCorpusForLang NL = NLTime.defaultCorpus
-getDefaultCorpusForLang lang = getCorpusForLang lang
+getDefaultCorpusForLang = \case
+  EN -> ENTime.defaultCorpus
+  NL -> NLTime.defaultCorpus
+  lang -> getCorpusForLang lang
 
 getCorpusForLang :: Lang -> Corpus
-getCorpusForLang AR = ARTime.corpus
-getCorpusForLang BG = (testContext, testOptions, [])
-getCorpusForLang CS = (testContext, testOptions, [])
-getCorpusForLang DA = DATime.corpus
-getCorpusForLang DE = DETime.corpus
-getCorpusForLang EL = ELTime.corpus
-getCorpusForLang EN = ENTime.corpus
-getCorpusForLang ES = ESTime.corpus
-getCorpusForLang ET = (testContext, testOptions, [])
-getCorpusForLang FR = FRTime.corpus
-getCorpusForLang GA = GATime.corpus
-getCorpusForLang HR = HRTime.corpus
-getCorpusForLang HE = HETime.corpus
-getCorpusForLang HU = HUTime.corpus
-getCorpusForLang HI = (testContext, testOptions, [])
-getCorpusForLang ID = (testContext, testOptions, [])
-getCorpusForLang IT = ITTime.corpus
-getCorpusForLang JA = (testContext, testOptions, [])
-getCorpusForLang KA = (testContext, testOptions, [])
-getCorpusForLang KO = KOTime.corpus
-getCorpusForLang MY = (testContext, testOptions, [])
-getCorpusForLang NB = NBTime.corpus
-getCorpusForLang NE = (testContext, testOptions, [])
-getCorpusForLang NL = NLTime.corpus
-getCorpusForLang PL = PLTime.corpus
-getCorpusForLang PT = PTTime.corpus
-getCorpusForLang RO = ROTime.corpus
-getCorpusForLang RU = (testContext, testOptions, [])
-getCorpusForLang SV = SVTime.corpus
-getCorpusForLang TA = (testContext, testOptions, [])
-getCorpusForLang TR = (testContext, testOptions, [])
-getCorpusForLang UK = (testContext, testOptions, [])
-getCorpusForLang VI = VITime.corpus
-getCorpusForLang ZH = ZHTime.corpus
+getCorpusForLang = \case
+  AF -> (testContext, testOptions, [])
+  AR -> ARTime.corpus
+  BG -> BGTime.corpus
+  BN -> (testContext, testOptions, [])
+  CA -> (testContext, testOptions, [])
+  CS -> (testContext, testOptions, [])
+  DA -> DATime.corpus
+  DE -> DETime.corpus
+  EL -> ELTime.corpus
+  EN -> ENTime.corpus
+  ES -> ESTime.corpus
+  ET -> (testContext, testOptions, [])
+  FI -> (testContext, testOptions, [])
+  FA -> (testContext, testOptions, [])
+  FR -> FRTime.corpus
+  GA -> GATime.corpus
+  HR -> HRTime.corpus
+  HE -> HETime.corpus
+  HU -> HUTime.corpus
+  HI -> (testContext, testOptions, [])
+  ID -> (testContext, testOptions, [])
+  IS -> (testContext, testOptions, [])
+  IT -> ITTime.corpus
+  JA -> (testContext, testOptions, [])
+  KA -> (testContext, testOptions, [])
+  KM -> (testContext, testOptions, [])
+  KN -> (testContext, testOptions, [])
+  KO -> KOTime.corpus
+  LO -> (testContext, testOptions, [])
+  ML -> (testContext, testOptions, [])
+  MN -> (testContext, testOptions, [])
+  MY -> (testContext, testOptions, [])
+  NB -> NBTime.corpus
+  NE -> (testContext, testOptions, [])
+  NL -> NLTime.corpus
+  PL -> PLTime.corpus
+  PT -> PTTime.corpus
+  RO -> ROTime.corpus
+  RU -> RUTime.corpus
+  SK -> (testContext, testOptions, [])
+  SV -> SVTime.corpus
+  SW -> (testContext, testOptions, [])
+  TA -> (testContext, testOptions, [])
+  TE -> (testContext, testOptions, [])
+  TH -> (testContext, testOptions, [])
+  TR -> (testContext, testOptions, [])
+  UK -> UKTime.corpus
+  VI -> VITime.corpus
+  ZH -> ZHTime.corpus
 
 getExamplesForLocale :: Lang -> Region -> [Example]
-getExamplesForLocale EN CA = EN_CATime.allExamples
+getExamplesForLocale EN R.CA = EN_CATime.allExamples
 getExamplesForLocale EN GB = EN_GBTime.allExamples
 getExamplesForLocale EN US = EN_USTime.allExamples
 getExamplesForLocale NL BE = NL_BETime.allExamples
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE RecordWildCards #-}
diff --git a/exe/DucklingExpensive.hs b/exe/DucklingExpensive.hs
--- a/exe/DucklingExpensive.hs
+++ b/exe/DucklingExpensive.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -12,7 +11,6 @@
 module Main (main) where
 
 import Control.Monad
-import Data.Some
 import System.Environment
 
 import Duckling.Debug
@@ -23,8 +21,8 @@
 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" [Seal Time]
+    debug es "Horario es de Lunes a Viernes de 2 pm a 10 pm. S\195\161bado de 9 am a 7 pm" [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -12,7 +11,6 @@
 module Main (main) where
 
 import Control.Monad
-import Data.Some
 import System.Environment
 
 import Duckling.Debug
@@ -23,14 +21,14 @@
 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" [Seal PhoneNumber,Seal Distance,Seal Numeral,Seal Email]
+    debug en "Wednesday 5:00PM 3/29/2017" [Seal Numeral,Seal Time]
+    debug zh "12:30pm" [Seal Time]
+    debug en "tomorrow at 4pm" [Seal Time]
+    debug en "Tomorrow at 12.30?" [Seal Time]
+    debug en "Wednesday 9am" [Seal Time]
+    debug en "Sure do! Will 11:30 work?" [Seal Time,Seal AmountOfMoney]
+    debug en "8:00am" [Seal 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
@@ -2,15 +2,17 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
 
 import Control.Applicative hiding (empty)
 import Control.Arrow ((***))
-import Control.Monad (unless)
+import Control.Exception (SomeException, catch)
+import Control.Monad (unless, when)
 import Control.Monad.IO.Class
 import Data.Aeson
 import Data.ByteString (ByteString, empty)
@@ -21,6 +23,7 @@
 import Data.Time.LocalTime.TimeZone.Series
 import Prelude
 import System.Directory
+import System.Environment (lookupEnv)
 import TextShow
 import Text.Read (readMaybe)
 import qualified Data.ByteString.Lazy as LBS
@@ -34,6 +37,7 @@
 
 import Duckling.Core
 import Duckling.Data.TimeZone
+import Duckling.Dimensions (allDimensions)
 import Duckling.Resolve (DucklingTime)
 
 createIfMissing :: FilePath -> IO ()
@@ -41,17 +45,34 @@
   exists <- doesFileExist f
   unless exists $ writeFile f ""
 
-setupLogs :: IO ()
-setupLogs = do
-  createDirectoryIfMissing False "log"
-  createIfMissing "log/error.log"
-  createIfMissing "log/access.log"
+shouldLog :: Maybe ConfigLog -> Bool
+shouldLog Nothing = False
+shouldLog (Just ConfigNoLog) = False
+shouldLog _ = True
 
+setupLogs :: Config a b -> IO ()
+setupLogs conf = do
+  let shouldLogErrors = shouldLog $ getErrorLog conf
+  let shouldLogAccesses = shouldLog $ getAccessLog conf
+
+  when (shouldLogErrors || shouldLogAccesses) $ createDirectoryIfMissing False "log"
+  when shouldLogErrors $ createIfMissing "log/error.log"
+  when shouldLogAccesses $ createIfMissing "log/access.log"
+
+loadTZs :: IO (HashMap Text TimeZoneSeries)
+loadTZs = do
+  let defaultPath = "/usr/share/zoneinfo/"
+  let fallbackPath = "/etc/zoneinfo/"
+  loadTimeZoneSeries defaultPath `catch` (\(_ :: SomeException) -> loadTimeZoneSeries fallbackPath)
+
 main :: IO ()
 main = do
-  setupLogs
-  tzs <- loadTimeZoneSeries "/usr/share/zoneinfo/"
-  quickHttpServe $
+  tzs <- loadTZs
+  p <- lookupEnv "PORT"
+  conf <- commandLineConfig $
+    maybe defaultConfig (`setPort` defaultConfig) (readMaybe =<< p)
+  setupLogs conf
+  httpServe conf $
     ifTop (writeBS "quack!") <|>
     route
       [ ("targets", method GET targetsHandler)
@@ -65,8 +86,8 @@
   writeLBS $ encode $
     HashMap.fromList . map dimText $ HashMap.toList supportedDimensions
   where
-    dimText :: (Lang, [Some Dimension]) -> (Text, [Text])
-    dimText = (Text.toLower . showt) *** map (\(This d) -> toName d)
+    dimText :: (Lang, [Seal Dimension]) -> (Text, [Text])
+    dimText = (Text.toLower . showt) *** map (\(Seal d) -> toName d)
 
 
 -- | Parse some text into the given dimensions
@@ -89,14 +110,18 @@
       let timezone = parseTimeZone tz
       now <- liftIO $ currentReftime tzs timezone
       let
+        lang = parseLang l
+
         context = Context
           { referenceTime = maybe now (parseRefTime timezone) ref
-          , locale = maybe (makeLocale (parseLang l) Nothing) parseLocale loc
+          , locale = maybe (makeLocale lang Nothing) parseLocale loc
           }
         options = Options {withLatent = parseLatent latent}
 
-        dimParse = fromMaybe [] $ decode $ LBS.fromStrict $ fromMaybe "" ds
-        dims = mapMaybe fromName dimParse
+        dims = fromMaybe (allDimensions lang) $ do
+          queryDims <- ds
+          txtDims <- decode @[Text] $ LBS.fromStrict queryDims
+          pure $ mapMaybe parseDimension txtDims
 
         parsedResult = parse (Text.decodeUtf8 tx) context options dims
 
@@ -107,8 +132,17 @@
     defaultTimeZone = "America/Los_Angeles"
     defaultLatent = False
 
+    parseDimension :: Text -> Maybe (Seal Dimension)
+    parseDimension x = fromName x <|> fromCustomName x
+      where
+        fromCustomName :: Text -> Maybe (Seal Dimension)
+        fromCustomName name = HashMap.lookup name m
+        m = HashMap.fromList
+          [ -- ("my-dimension", This (CustomDimension MyDimension))
+          ]
+
     parseTimeZone :: Maybe ByteString -> Text
-    parseTimeZone = fromMaybe defaultTimeZone . fmap Text.decodeUtf8
+    parseTimeZone = maybe defaultTimeZone Text.decodeUtf8
 
     parseLocale :: ByteString -> Locale
     parseLocale x = maybe defaultLocale (`makeLocale` mregion) mlang
diff --git a/exe/RegenMain.hs b/exe/RegenMain.hs
--- a/exe/RegenMain.hs
+++ b/exe/RegenMain.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 import Prelude
diff --git a/tests/Duckling/AmountOfMoney/AR/Tests.hs b/tests/Duckling/AmountOfMoney/AR/Tests.hs
--- a/tests/Duckling/AmountOfMoney/AR/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.AR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/BG/Tests.hs b/tests/Duckling/AmountOfMoney/BG/Tests.hs
--- a/tests/Duckling/AmountOfMoney/BG/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/BG/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.BG.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "BG Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/EN/Tests.hs b/tests/Duckling/AmountOfMoney/EN/Tests.hs
--- a/tests/Duckling/AmountOfMoney/EN/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.EN.Tests
@@ -25,7 +24,6 @@
 import qualified Duckling.AmountOfMoney.EN.BZ.Corpus as BZ
 import qualified Duckling.AmountOfMoney.EN.CA.Corpus as CA
 import qualified Duckling.AmountOfMoney.EN.GB.Corpus as GB
-import qualified Duckling.AmountOfMoney.EN.IE.Corpus as GIE
 import qualified Duckling.AmountOfMoney.EN.IN.Corpus as IN
 import qualified Duckling.AmountOfMoney.EN.IE.Corpus as IE
 import qualified Duckling.AmountOfMoney.EN.JM.Corpus as JM
@@ -34,95 +32,97 @@
 import qualified Duckling.AmountOfMoney.EN.TT.Corpus as TT
 import qualified Duckling.AmountOfMoney.EN.US.Corpus as US
 import qualified Duckling.AmountOfMoney.EN.ZA.Corpus as ZA
+import qualified Duckling.Region as R
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
-  , makeNegativeCorpusTest [This AmountOfMoney] negativeCorpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
+  , makeNegativeCorpusTest [Seal AmountOfMoney] negativeCorpus
   , localeTests
   , intersectTests
   , rangeTests
+  , latentTests
   ]
 
 localeTests :: TestTree
 localeTests = testGroup "Locale Tests"
   [ testGroup "EN_AU Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeAU AU.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeAU AU.negativeExamples
     ]
    , testGroup "EN_BZ Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeBZ BZ.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeBZ BZ.negativeExamples
     ]
    , testGroup "EN_CA Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeCA CA.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeCA CA.negativeExamples
     ]
    , testGroup "EN_GB Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeGB GB.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeGB GB.negativeExamples
     ]
    , testGroup "EN_IE Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeIE IE.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeIE IE.negativeExamples
     ]
    , testGroup "EN_IN Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeIN IN.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeIN IN.negativeExamples
     ]
    , testGroup "EN_JM Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeJM JM.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeJM JM.negativeExamples
     ]
    , testGroup "EN_NZ Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeNZ NZ.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeNZ NZ.negativeExamples
     ]
    , testGroup "EN_PH Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localePH PH.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localePH PH.negativeExamples
     ]
     , testGroup "EN_TT Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeTT TT.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeTT TT.negativeExamples
     ]
     , testGroup "EN_US Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeUS US.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeUS US.negativeExamples
     ]
     , testGroup "EN_ZA Tests"
-    [ makeCorpusTest [This AmountOfMoney]
+    [ makeCorpusTest [Seal AmountOfMoney]
       $ withLocale corpus localeZA ZA.allExamples
-    , makeNegativeCorpusTest [This AmountOfMoney]
+    , makeNegativeCorpusTest [Seal AmountOfMoney]
       $ withLocale negativeCorpus localeZA ZA.negativeExamples
     ]
   ]
   where
     localeAU = makeLocale EN $ Just AU
     localeBZ = makeLocale EN $ Just BZ
-    localeCA = makeLocale EN $ Just CA
+    localeCA = makeLocale EN $ Just R.CA
     localeGB = makeLocale EN $ Just GB
     localeIE = makeLocale EN $ Just IE
     localeIN = makeLocale EN $ Just IN
@@ -136,7 +136,7 @@
 
 intersectTests :: TestTree
 intersectTests = testCase "Intersect Test" $
-  mapM_ (analyzedNTest testContext testOptions . withTargets [This AmountOfMoney]) xs
+  mapM_ (analyzedNTest testContext testOptions . withTargets [Seal AmountOfMoney]) xs
   where
     xs = [ ("7c7", 2)
          , ("7c7c", 3)
@@ -150,10 +150,13 @@
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
-  mapM_ (analyzedRangeTest testContext testOptions . withTargets [This AmountOfMoney]) xs
+  mapM_ (analyzedRangeTest testContext testOptions . withTargets [Seal AmountOfMoney]) xs
   where
     xs = [ ("between 3 and 1 dollars", Range 14 23)
          , ("between 1 and between 2 and 3 dollars", Range 14 37)
          , ("10 cents and 0.1", Range 0 8)
          , ("Pay Kiran1 10eur", Range 11 16)
          ]
+
+latentTests :: TestTree
+latentTests = makeCorpusTest [Seal AmountOfMoney] latentCorpus
diff --git a/tests/Duckling/AmountOfMoney/ES/Tests.hs b/tests/Duckling/AmountOfMoney/ES/Tests.hs
--- a/tests/Duckling/AmountOfMoney/ES/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/ES/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.ES.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/FR/Tests.hs b/tests/Duckling/AmountOfMoney/FR/Tests.hs
--- a/tests/Duckling/AmountOfMoney/FR/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.FR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/GA/Tests.hs b/tests/Duckling/AmountOfMoney/GA/Tests.hs
--- a/tests/Duckling/AmountOfMoney/GA/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.GA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/HE/Tests.hs b/tests/Duckling/AmountOfMoney/HE/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/HE/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.
+
+
+module Duckling.AmountOfMoney.HE.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.HE.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "HE Tests"
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
+  ]
diff --git a/tests/Duckling/AmountOfMoney/HR/Tests.hs b/tests/Duckling/AmountOfMoney/HR/Tests.hs
--- a/tests/Duckling/AmountOfMoney/HR/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.AmountOfMoney.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/ID/Tests.hs b/tests/Duckling/AmountOfMoney/ID/Tests.hs
--- a/tests/Duckling/AmountOfMoney/ID/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/ID/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.ID.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ID Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/IT/Tests.hs b/tests/Duckling/AmountOfMoney/IT/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/IT/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.
+
+
+module Duckling.AmountOfMoney.IT.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.IT.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "IT Tests"
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
+  ]
diff --git a/tests/Duckling/AmountOfMoney/KA/Tests.hs b/tests/Duckling/AmountOfMoney/KA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/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.
+
+
+module Duckling.AmountOfMoney.KA.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.AmountOfMoney.KA.Corpus
+
+tests :: TestTree
+tests = testGroup "KA Tests"
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
+  ]
diff --git a/tests/Duckling/AmountOfMoney/KO/Tests.hs b/tests/Duckling/AmountOfMoney/KO/Tests.hs
--- a/tests/Duckling/AmountOfMoney/KO/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/MN/Tests.hs b/tests/Duckling/AmountOfMoney/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/MN/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.
+
+
+module Duckling.AmountOfMoney.MN.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.MN.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
+  ]
diff --git a/tests/Duckling/AmountOfMoney/NB/Tests.hs b/tests/Duckling/AmountOfMoney/NB/Tests.hs
--- a/tests/Duckling/AmountOfMoney/NB/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/NB/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.NB.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NB Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/NL/Tests.hs b/tests/Duckling/AmountOfMoney/NL/Tests.hs
--- a/tests/Duckling/AmountOfMoney/NL/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.NL.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/PT/Tests.hs b/tests/Duckling/AmountOfMoney/PT/Tests.hs
--- a/tests/Duckling/AmountOfMoney/PT/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/RO/Tests.hs b/tests/Duckling/AmountOfMoney/RO/Tests.hs
--- a/tests/Duckling/AmountOfMoney/RO/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.RO.Tests
@@ -20,6 +19,6 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
-  , makeNegativeCorpusTest [This AmountOfMoney] negativeCorpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
+  , makeNegativeCorpusTest [Seal AmountOfMoney] negativeCorpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/RU/Tests.hs b/tests/Duckling/AmountOfMoney/RU/Tests.hs
--- a/tests/Duckling/AmountOfMoney/RU/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.RU.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/SV/Tests.hs b/tests/Duckling/AmountOfMoney/SV/Tests.hs
--- a/tests/Duckling/AmountOfMoney/SV/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/SV/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.SV.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "SV Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/TR/Tests.hs b/tests/Duckling/AmountOfMoney/TR/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/TR/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.
+
+
+module Duckling.AmountOfMoney.TR.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.TR.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "TR Tests"
+  [ makeCorpusTest [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.Tests
@@ -20,15 +19,20 @@
 import qualified Duckling.AmountOfMoney.ES.Tests as ES
 import qualified Duckling.AmountOfMoney.FR.Tests as FR
 import qualified Duckling.AmountOfMoney.GA.Tests as GA
+import qualified Duckling.AmountOfMoney.HE.Tests as HE
 import qualified Duckling.AmountOfMoney.HR.Tests as HR
 import qualified Duckling.AmountOfMoney.ID.Tests as ID
+import qualified Duckling.AmountOfMoney.IT.Tests as IT
+import qualified Duckling.AmountOfMoney.KA.Tests as KA
 import qualified Duckling.AmountOfMoney.KO.Tests as KO
+import qualified Duckling.AmountOfMoney.MN.Tests as MN
 import qualified Duckling.AmountOfMoney.NB.Tests as NB
 import qualified Duckling.AmountOfMoney.NL.Tests as NL
 import qualified Duckling.AmountOfMoney.PT.Tests as PT
 import qualified Duckling.AmountOfMoney.RO.Tests as RO
 import qualified Duckling.AmountOfMoney.RU.Tests as RU
 import qualified Duckling.AmountOfMoney.SV.Tests as SV
+import qualified Duckling.AmountOfMoney.TR.Tests as TR
 import qualified Duckling.AmountOfMoney.VI.Tests as VI
 import qualified Duckling.AmountOfMoney.ZH.Tests as ZH
 
@@ -40,15 +44,20 @@
   , ES.tests
   , FR.tests
   , GA.tests
+  , HE.tests
   , HR.tests
   , ID.tests
+  , IT.tests
+  , KA.tests
   , KO.tests
+  , MN.tests
   , NB.tests
   , NL.tests
   , PT.tests
   , RO.tests
   , RU.tests
   , SV.tests
+  , TR.tests
   , VI.tests
   , ZH.tests
   ]
diff --git a/tests/Duckling/AmountOfMoney/VI/Tests.hs b/tests/Duckling/AmountOfMoney/VI/Tests.hs
--- a/tests/Duckling/AmountOfMoney/VI/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/VI/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.VI.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "VI Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/AmountOfMoney/ZH/Tests.hs b/tests/Duckling/AmountOfMoney/ZH/Tests.hs
--- a/tests/Duckling/AmountOfMoney/ZH/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/ZH/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.AmountOfMoney.ZH.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This AmountOfMoney] corpus
+  [ makeCorpusTest [Seal AmountOfMoney] corpus
   ]
diff --git a/tests/Duckling/Api/Tests.hs b/tests/Duckling/Api/Tests.hs
--- a/tests/Duckling/Api/Tests.hs
+++ b/tests/Duckling/Api/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NoRebindableSyntax #-}
@@ -39,7 +38,7 @@
 
 parseTest :: TestTree
 parseTest = testCase "Parse Test" $
-  case parse sentence testContext testOptions [This Numeral] of
+  case parse sentence testContext testOptions [Seal Numeral] of
     [] -> assertFailure "empty result"
     (Entity dim body (RVal _ v) start end _ _:_) -> do
       assertEqual "dim" "number" dim
@@ -61,39 +60,39 @@
 rankFilterTest = testCase "Rank Filter Tests" $ do
   mapM_ check
     [ ( "in 2 minutes"
-      , [This Numeral, This Duration, This Time]
-      , [This Time]
+      , [Seal Numeral, Seal Duration, Seal Time]
+      , [Seal Time]
       )
     , ( "in 2 minutes, about 42 degrees"
-      , [This Numeral, This Temperature, This Time]
-      , [This Time, This Temperature]
+      , [Seal Numeral, Seal Temperature, Seal Time]
+      , [Seal Time, Seal Temperature]
       )
     , ( "today works... and tomorrow at 9pm too"
-      , [This Numeral, This Time]
-      , [This Time, This Time]
+      , [Seal Numeral, Seal Time]
+      , [Seal Time, Seal Time]
       )
     , ( "between 9:30 and 11:00 on thursday or Saturday and Thanksgiving Day"
-      , [This Numeral, This Time]
-      , [This Time, This Time, This Time]
+      , [Seal Numeral, Seal Time]
+      , [Seal Time, Seal Time, Seal Time]
       )
-    , ("the day after tomorrow 5pm", [This Time], [This Time])
-    , ("the day after tomorrow 5pm", [This Time, This Numeral], [This Time])
-    , ("the day after tomorrow 5pm", [], [This Time])
+    , ("the day after tomorrow 5pm", [Seal Time], [Seal Time])
+    , ("the day after tomorrow 5pm", [Seal Time, Seal Numeral], [Seal Time])
+    , ("the day after tomorrow 5pm", [], [Seal Time])
     ]
   where
-    check :: (Text, [Some Dimension], [Some Dimension]) -> IO ()
+    check :: (Text, [Seal Dimension], [Seal Dimension]) -> IO ()
     check (sentence, targets, expected) =
       let go = analyze sentence testContext testOptions $ HashSet.fromList targets
           actual = flip map go $
-                     \(Resolved{node=Node{token=Token d _}}) -> This d
+                     \(Resolved{node=Node{token=Token d _}}) -> Seal d
       in assertEqual ("wrong winners for " ++ show sentence) expected actual
 
 rankOrderTest :: TestTree
 rankOrderTest = testCase "Rank Order Tests" $ do
   mapM_ check
-    [ ("tomorrow at 5PM or 8PM", [This Time])
-    , ("321 12 3456 ... 7", [This Numeral])
-    , ("42 today 23 tomorrow", [This Numeral, This Time])
+    [ ("tomorrow at 5PM or 8PM", [Seal Time])
+    , ("321 12 3456 ... 7", [Seal Numeral])
+    , ("42 today 23 tomorrow", [Seal Numeral, Seal Time])
     ]
   where
     check (s, targets) =
@@ -105,13 +104,13 @@
   mapM_ (analyzedFirstTest testContext testOptions) xs
   where
     xs = map (\(input, targets, range) -> (input, targets, f range))
-             [ ( "order status 3233763377", [This PhoneNumber], Range 13 23 )
-             , ( "  3233763377  "         , [This PhoneNumber], Range  2 12 )
-             , ( " -3233763377"           , [This PhoneNumber], Range  2 12 )
-             , ( "  now"                  , [This Time]       , Range  2  5 )
-             , ( "   Monday  "            , [This Time]       , Range  3  9 )
-             , ( "  next   week "         , [This Time]       , Range  2 13 )
-             , ( "   42\n\n"              , [This Numeral]    , Range  3  5 )
+             [ ( "order status 3233763377", [Seal PhoneNumber], Range 13 23 )
+             , ( "  3233763377  "         , [Seal PhoneNumber], Range  2 12 )
+             , ( " -3233763377"           , [Seal PhoneNumber], Range  2 12 )
+             , ( "  now"                  , [Seal Time]       , Range  2  5 )
+             , ( "   Monday  "            , [Seal Time]       , Range  3  9 )
+             , ( "  next   week "         , [Seal Time]       , Range  2 13 )
+             , ( "   42\n\n"              , [Seal Numeral]    , Range  3  5 )
              ]
     f :: Range -> TestPredicate
     f expected _ (Resolved {range = actual}) = expected == actual
@@ -120,19 +119,20 @@
 supportedDimensionsTest = testCase "Supported Dimensions Test" $ do
   mapM_ check
     [ ( AR
-      , [ This Email, This AmountOfMoney, This PhoneNumber, This Url
-        , This Duration, This Numeral, This Ordinal, This Time, This Volume
-        , This Temperature, This Quantity
+      , [ Seal Email, Seal AmountOfMoney, Seal PhoneNumber, Seal Url
+        , Seal Duration, Seal Numeral, Seal Ordinal, Seal Time, Seal Volume
+        , Seal Temperature, Seal Quantity, Seal CreditCardNumber
         ]
       )
     , ( PL
-      , [ This Email, This AmountOfMoney, This PhoneNumber, This Url
-        , This Duration, This Numeral, This Ordinal, This Time
+      , [ Seal Email, Seal AmountOfMoney, Seal PhoneNumber, Seal Url
+        , Seal Duration, Seal Numeral, Seal Ordinal, Seal Time
+        , Seal CreditCardNumber
         ]
       )
     ]
   where
-    check :: (Lang, [Some Dimension]) -> IO ()
+    check :: (Lang, [Seal Dimension]) -> IO ()
     check (l, expected) = case HashMap.lookup l supportedDimensions of
       Nothing -> assertFailure $ "no dimensions for " ++ show l
       Just actual ->
diff --git a/tests/Duckling/CreditCardNumber/Tests.hs b/tests/Duckling/CreditCardNumber/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/CreditCardNumber/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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.CreditCardNumber.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.CreditCardNumber.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "CreditCardNumber Tests"
+  [ makeCorpusTest [Seal CreditCardNumber] corpus
+  , makeNegativeCorpusTest [Seal CreditCardNumber] negativeCorpus
+  ]
diff --git a/tests/Duckling/Dimensions/Tests.hs b/tests/Duckling/Dimensions/Tests.hs
--- a/tests/Duckling/Dimensions/Tests.hs
+++ b/tests/Duckling/Dimensions/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Dimensions.Tests
@@ -15,6 +14,7 @@
 import Test.Tasty
 
 import qualified Duckling.AmountOfMoney.Tests as AmountOfMoney
+import qualified Duckling.CreditCardNumber.Tests as CreditCardNumber
 import qualified Duckling.Distance.Tests as Distance
 import qualified Duckling.Duration.Tests as Duration
 import qualified Duckling.Email.Tests as Email
@@ -30,6 +30,7 @@
 tests :: TestTree
 tests = testGroup "Dimensions Tests"
   [ AmountOfMoney.tests
+  , CreditCardNumber.tests
   , Distance.tests
   , Duration.tests
   , Email.tests
diff --git a/tests/Duckling/Distance/BG/Tests.hs b/tests/Duckling/Distance/BG/Tests.hs
--- a/tests/Duckling/Distance/BG/Tests.hs
+++ b/tests/Duckling/Distance/BG/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.BG.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "BG Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/CS/Tests.hs b/tests/Duckling/Distance/CS/Tests.hs
--- a/tests/Duckling/Distance/CS/Tests.hs
+++ b/tests/Duckling/Distance/CS/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.CS.Tests
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "CS Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/DE/Tests.hs b/tests/Duckling/Distance/DE/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/DE/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.
+
+
+module Duckling.Distance.DE.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.DE.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "DE Tests"
+  [ makeCorpusTest [Seal Distance] corpus
+  ]
diff --git a/tests/Duckling/Distance/EN/Tests.hs b/tests/Duckling/Distance/EN/Tests.hs
--- a/tests/Duckling/Distance/EN/Tests.hs
+++ b/tests/Duckling/Distance/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.EN.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/ES/Tests.hs b/tests/Duckling/Distance/ES/Tests.hs
--- a/tests/Duckling/Distance/ES/Tests.hs
+++ b/tests/Duckling/Distance/ES/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.ES.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/FR/Tests.hs b/tests/Duckling/Distance/FR/Tests.hs
--- a/tests/Duckling/Distance/FR/Tests.hs
+++ b/tests/Duckling/Distance/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.FR.Tests
@@ -17,5 +16,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/GA/Tests.hs b/tests/Duckling/Distance/GA/Tests.hs
--- a/tests/Duckling/Distance/GA/Tests.hs
+++ b/tests/Duckling/Distance/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.GA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/HR/Tests.hs b/tests/Duckling/Distance/HR/Tests.hs
--- a/tests/Duckling/Distance/HR/Tests.hs
+++ b/tests/Duckling/Distance/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Distance.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/IT/Tests.hs b/tests/Duckling/Distance/IT/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/IT/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.
+
+
+module Duckling.Distance.IT.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.IT.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "IT Tests"
+  [ makeCorpusTest [Seal Distance] corpus
+  ]
diff --git a/tests/Duckling/Distance/KM/Tests.hs b/tests/Duckling/Distance/KM/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/KM/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.
+
+
+module Duckling.Distance.KM.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Distance.KM.Corpus
+
+tests :: TestTree
+tests = testGroup "KM Tests"
+  [ makeCorpusTest [Seal Distance] corpus
+  ]
diff --git a/tests/Duckling/Distance/KO/Tests.hs b/tests/Duckling/Distance/KO/Tests.hs
--- a/tests/Duckling/Distance/KO/Tests.hs
+++ b/tests/Duckling/Distance/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/MN/Tests.hs b/tests/Duckling/Distance/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/MN/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.
+
+
+module Duckling.Distance.MN.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.MN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Distance] corpus
+  ]
diff --git a/tests/Duckling/Distance/NL/Tests.hs b/tests/Duckling/Distance/NL/Tests.hs
--- a/tests/Duckling/Distance/NL/Tests.hs
+++ b/tests/Duckling/Distance/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.NL.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/PT/Tests.hs b/tests/Duckling/Distance/PT/Tests.hs
--- a/tests/Duckling/Distance/PT/Tests.hs
+++ b/tests/Duckling/Distance/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/RO/Tests.hs b/tests/Duckling/Distance/RO/Tests.hs
--- a/tests/Duckling/Distance/RO/Tests.hs
+++ b/tests/Duckling/Distance/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.RO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/RU/Tests.hs b/tests/Duckling/Distance/RU/Tests.hs
--- a/tests/Duckling/Distance/RU/Tests.hs
+++ b/tests/Duckling/Distance/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.RU.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/SV/Tests.hs b/tests/Duckling/Distance/SV/Tests.hs
--- a/tests/Duckling/Distance/SV/Tests.hs
+++ b/tests/Duckling/Distance/SV/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.SV.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "SV Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/TR/Tests.hs b/tests/Duckling/Distance/TR/Tests.hs
--- a/tests/Duckling/Distance/TR/Tests.hs
+++ b/tests/Duckling/Distance/TR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.TR.Tests
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "TR Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   ]
diff --git a/tests/Duckling/Distance/Tests.hs b/tests/Duckling/Distance/Tests.hs
--- a/tests/Duckling/Distance/Tests.hs
+++ b/tests/Duckling/Distance/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.Tests
@@ -16,12 +15,16 @@
 
 import qualified Duckling.Distance.BG.Tests as BG
 import qualified Duckling.Distance.CS.Tests as CS
+import qualified Duckling.Distance.DE.Tests as DE
 import qualified Duckling.Distance.EN.Tests as EN
 import qualified Duckling.Distance.ES.Tests as ES
 import qualified Duckling.Distance.FR.Tests as FR
 import qualified Duckling.Distance.GA.Tests as GA
 import qualified Duckling.Distance.HR.Tests as HR
+import qualified Duckling.Distance.IT.Tests as IT
+import qualified Duckling.Distance.KM.Tests as KM
 import qualified Duckling.Distance.KO.Tests as KO
+import qualified Duckling.Distance.MN.Tests as MN
 import qualified Duckling.Distance.NL.Tests as NL
 import qualified Duckling.Distance.PT.Tests as PT
 import qualified Duckling.Distance.RO.Tests as RO
@@ -34,12 +37,16 @@
 tests = testGroup "Distance Tests"
   [ BG.tests
   , CS.tests
+  , DE.tests
   , EN.tests
   , ES.tests
   , FR.tests
   , GA.tests
   , HR.tests
+  , IT.tests
+  , KM.tests
   , KO.tests
+  , MN.tests
   , NL.tests
   , PT.tests
   , RO.tests
diff --git a/tests/Duckling/Distance/ZH/Tests.hs b/tests/Duckling/Distance/ZH/Tests.hs
--- a/tests/Duckling/Distance/ZH/Tests.hs
+++ b/tests/Duckling/Distance/ZH/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Distance.ZH.Tests
@@ -24,14 +23,14 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Distance] corpus
+  [ makeCorpusTest [Seal Distance] corpus
   , ambiguousTests
   ]
 
 ambiguousTests :: TestTree
 ambiguousTests = testCase "Ambiguous Tests" $
   analyzedAmbiguousTest context testOptions
-    (testText, [This Distance], predicates)
+    (testText, [Seal Distance], predicates)
   where
     context = testContext {locale = makeLocale ZH Nothing}
     testText = "3千米"
diff --git a/tests/Duckling/Duration/AR/Tests.hs b/tests/Duckling/Duration/AR/Tests.hs
--- a/tests/Duckling/Duration/AR/Tests.hs
+++ b/tests/Duckling/Duration/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.AR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/BG/Tests.hs b/tests/Duckling/Duration/BG/Tests.hs
--- a/tests/Duckling/Duration/BG/Tests.hs
+++ b/tests/Duckling/Duration/BG/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.BG.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "BG Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/EL/Tests.hs b/tests/Duckling/Duration/EL/Tests.hs
--- a/tests/Duckling/Duration/EL/Tests.hs
+++ b/tests/Duckling/Duration/EL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.EL.Tests
@@ -20,6 +19,6 @@
 
 tests :: TestTree
 tests = testGroup "EL Tests"
-  [ makeCorpusTest [This Duration] corpus
-  , makeNegativeCorpusTest [This Duration] negativeCorpus
+  [ makeCorpusTest [Seal Duration] corpus
+  , makeNegativeCorpusTest [Seal Duration] negativeCorpus
   ]
diff --git a/tests/Duckling/Duration/EN/Tests.hs b/tests/Duckling/Duration/EN/Tests.hs
--- a/tests/Duckling/Duration/EN/Tests.hs
+++ b/tests/Duckling/Duration/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.EN.Tests
@@ -20,6 +19,6 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Duration] corpus
-  , makeNegativeCorpusTest [This Duration] negativeCorpus
+  [ makeCorpusTest [Seal Duration] corpus
+  , makeNegativeCorpusTest [Seal Duration] negativeCorpus
   ]
diff --git a/tests/Duckling/Duration/ES/Tests.hs b/tests/Duckling/Duration/ES/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/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.
+
+
+module Duckling.Duration.ES.Tests
+  ( tests
+  ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.ES.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ES Tests"
+  [ makeCorpusTest [Seal Duration] corpus
+  ]
diff --git a/tests/Duckling/Duration/FR/Tests.hs b/tests/Duckling/Duration/FR/Tests.hs
--- a/tests/Duckling/Duration/FR/Tests.hs
+++ b/tests/Duckling/Duration/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.FR.Tests
@@ -20,6 +19,6 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Duration] corpus
-  , makeNegativeCorpusTest [This Duration] negativeCorpus
+  [ makeCorpusTest [Seal Duration] corpus
+  , makeNegativeCorpusTest [Seal Duration] negativeCorpus
   ]
diff --git a/tests/Duckling/Duration/GA/Tests.hs b/tests/Duckling/Duration/GA/Tests.hs
--- a/tests/Duckling/Duration/GA/Tests.hs
+++ b/tests/Duckling/Duration/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.GA.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/HI/Tests.hs b/tests/Duckling/Duration/HI/Tests.hs
--- a/tests/Duckling/Duration/HI/Tests.hs
+++ b/tests/Duckling/Duration/HI/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.HI.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "HI Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/HU/Tests.hs b/tests/Duckling/Duration/HU/Tests.hs
--- a/tests/Duckling/Duration/HU/Tests.hs
+++ b/tests/Duckling/Duration/HU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.HU.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "HU Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/JA/Tests.hs b/tests/Duckling/Duration/JA/Tests.hs
--- a/tests/Duckling/Duration/JA/Tests.hs
+++ b/tests/Duckling/Duration/JA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.JA.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "JA Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/KA/Tests.hs b/tests/Duckling/Duration/KA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/KA/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.
+
+
+module Duckling.Duration.KA.Tests
+  ( tests
+  ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.KA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KA Tests"
+  [ makeCorpusTest [Seal Duration] corpus
+  ]
diff --git a/tests/Duckling/Duration/KO/Tests.hs b/tests/Duckling/Duration/KO/Tests.hs
--- a/tests/Duckling/Duration/KO/Tests.hs
+++ b/tests/Duckling/Duration/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.KO.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/MN/Tests.hs b/tests/Duckling/Duration/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/MN/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.
+
+
+module Duckling.Duration.MN.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.MN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Duration] corpus
+  ]
diff --git a/tests/Duckling/Duration/NB/Tests.hs b/tests/Duckling/Duration/NB/Tests.hs
--- a/tests/Duckling/Duration/NB/Tests.hs
+++ b/tests/Duckling/Duration/NB/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.NB.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "NB Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/NL/Tests.hs b/tests/Duckling/Duration/NL/Tests.hs
--- a/tests/Duckling/Duration/NL/Tests.hs
+++ b/tests/Duckling/Duration/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.NL.Tests
@@ -11,7 +10,6 @@
   ) where
 
 import Data.String
-import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
@@ -20,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This Duration] corpus
-  , makeNegativeCorpusTest [This Duration] negativeCorpus
+  [ makeCorpusTest [Seal Duration] corpus
+  , makeNegativeCorpusTest [Seal Duration] negativeCorpus
   ]
diff --git a/tests/Duckling/Duration/PL/Tests.hs b/tests/Duckling/Duration/PL/Tests.hs
--- a/tests/Duckling/Duration/PL/Tests.hs
+++ b/tests/Duckling/Duration/PL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.PL.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "PL Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/PT/Tests.hs b/tests/Duckling/Duration/PT/Tests.hs
--- a/tests/Duckling/Duration/PT/Tests.hs
+++ b/tests/Duckling/Duration/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/RO/Tests.hs b/tests/Duckling/Duration/RO/Tests.hs
--- a/tests/Duckling/Duration/RO/Tests.hs
+++ b/tests/Duckling/Duration/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.RO.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/RU/Tests.hs b/tests/Duckling/Duration/RU/Tests.hs
--- a/tests/Duckling/Duration/RU/Tests.hs
+++ b/tests/Duckling/Duration/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.RU.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/SV/Tests.hs b/tests/Duckling/Duration/SV/Tests.hs
--- a/tests/Duckling/Duration/SV/Tests.hs
+++ b/tests/Duckling/Duration/SV/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.SV.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "SV Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/TR/Tests.hs b/tests/Duckling/Duration/TR/Tests.hs
--- a/tests/Duckling/Duration/TR/Tests.hs
+++ b/tests/Duckling/Duration/TR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.TR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "TR Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Duration/Tests.hs b/tests/Duckling/Duration/Tests.hs
--- a/tests/Duckling/Duration/Tests.hs
+++ b/tests/Duckling/Duration/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.Tests
@@ -18,12 +17,15 @@
 import qualified Duckling.Duration.BG.Tests as BG
 import qualified Duckling.Duration.EL.Tests as EL
 import qualified Duckling.Duration.EN.Tests as EN
+import qualified Duckling.Duration.ES.Tests as ES
 import qualified Duckling.Duration.FR.Tests as FR
 import qualified Duckling.Duration.GA.Tests as GA
 import qualified Duckling.Duration.HI.Tests as HI
 import qualified Duckling.Duration.HU.Tests as HU
 import qualified Duckling.Duration.JA.Tests as JA
+import qualified Duckling.Duration.KA.Tests as KA
 import qualified Duckling.Duration.KO.Tests as KO
+import qualified Duckling.Duration.MN.Tests as MN
 import qualified Duckling.Duration.NB.Tests as NB
 import qualified Duckling.Duration.NL.Tests as NL
 import qualified Duckling.Duration.PL.Tests as PL
@@ -32,6 +34,7 @@
 import qualified Duckling.Duration.RU.Tests as RU
 import qualified Duckling.Duration.SV.Tests as SV
 import qualified Duckling.Duration.TR.Tests as TR
+import qualified Duckling.Duration.UK.Tests as UK
 import qualified Duckling.Duration.ZH.Tests as ZH
 
 tests :: TestTree
@@ -40,12 +43,15 @@
   , BG.tests
   , EL.tests
   , EN.tests
+  , ES.tests
   , FR.tests
   , GA.tests
   , HI.tests
   , HU.tests
   , JA.tests
+  , KA.tests
   , KO.tests
+  , MN.tests
   , NB.tests
   , NL.tests
   , PL.tests
@@ -54,5 +60,6 @@
   , RU.tests
   , SV.tests
   , TR.tests
+  , UK.tests
   , ZH.tests
   ]
diff --git a/tests/Duckling/Duration/UK/Tests.hs b/tests/Duckling/Duration/UK/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/UK/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.
+
+
+module Duckling.Duration.UK.Tests
+  ( tests
+  ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.UK.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "UK Tests"
+  [ makeCorpusTest [Seal Duration] corpus
+  , makeNegativeCorpusTest [Seal Duration] negativeCorpus
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Duration.ZH.Tests
@@ -21,5 +20,5 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Duration] corpus
+  [ makeCorpusTest [Seal Duration] corpus
   ]
diff --git a/tests/Duckling/Email/DE/Tests.hs b/tests/Duckling/Email/DE/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Email/DE/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.
+
+
+module Duckling.Email.DE.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Email.DE.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "DE Tests"
+  [ makeCorpusTest [Seal Email] corpus
+  , makeNegativeCorpusTest [Seal Email] negativeCorpus
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Email.EN.Tests
@@ -18,7 +17,7 @@
 import Duckling.Testing.Asserts
 
 tests :: TestTree
-tests = testGroup "Email Tests"
-  [ makeCorpusTest [This Email] corpus
-  , makeNegativeCorpusTest [This Email] negativeCorpus
+tests = testGroup "EN Tests"
+  [ makeCorpusTest [Seal Email] corpus
+  , makeNegativeCorpusTest [Seal Email] negativeCorpus
   ]
diff --git a/tests/Duckling/Email/FR/Tests.hs b/tests/Duckling/Email/FR/Tests.hs
--- a/tests/Duckling/Email/FR/Tests.hs
+++ b/tests/Duckling/Email/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Email.FR.Tests
@@ -18,6 +17,6 @@
 import Duckling.Testing.Asserts
 
 tests :: TestTree
-tests = testGroup "Email Tests"
-  [ makeCorpusTest [This Email] corpus
+tests = testGroup "FR Tests"
+  [ makeCorpusTest [Seal Email] corpus
   ]
diff --git a/tests/Duckling/Email/IS/Tests.hs b/tests/Duckling/Email/IS/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Email/IS/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.
+
+
+module Duckling.Email.IS.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Email.IS.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "IS Tests"
+  [ makeCorpusTest [Seal Email] corpus
+  ]
diff --git a/tests/Duckling/Email/IT/Tests.hs b/tests/Duckling/Email/IT/Tests.hs
--- a/tests/Duckling/Email/IT/Tests.hs
+++ b/tests/Duckling/Email/IT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Email.IT.Tests
@@ -18,6 +17,6 @@
 import Duckling.Testing.Asserts
 
 tests :: TestTree
-tests = testGroup "Email Tests"
-  [ makeCorpusTest [This Email] corpus
+tests = testGroup "IT Tests"
+  [ makeCorpusTest [Seal Email] corpus
   ]
diff --git a/tests/Duckling/Email/Tests.hs b/tests/Duckling/Email/Tests.hs
--- a/tests/Duckling/Email/Tests.hs
+++ b/tests/Duckling/Email/Tests.hs
@@ -2,28 +2,33 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
-module Duckling.Email.Tests (tests) where
+module Duckling.Email.Tests
+  ( tests
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
 import Duckling.Email.Corpus
+import Duckling.Testing.Asserts
+import qualified Duckling.Email.DE.Tests as DE
 import qualified Duckling.Email.EN.Tests as EN
 import qualified Duckling.Email.FR.Tests as FR
+import qualified Duckling.Email.IS.Tests as IS
 import qualified Duckling.Email.IT.Tests as IT
-import Duckling.Testing.Asserts
 
 tests :: TestTree
 tests = testGroup "Email Tests"
-  [ makeCorpusTest [This Email] corpus
-  , makeNegativeCorpusTest [This Email] negativeCorpus
+  [ makeCorpusTest [Seal Email] corpus
+  , makeNegativeCorpusTest [Seal Email] negativeCorpus
+  , DE.tests
   , EN.tests
   , FR.tests
+  , IS.tests
   , IT.tests
   ]
diff --git a/tests/Duckling/Engine/Tests.hs b/tests/Duckling/Engine/Tests.hs
--- a/tests/Duckling/Engine/Tests.hs
+++ b/tests/Duckling/Engine/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
diff --git a/tests/Duckling/Numeral/AF/Tests.hs b/tests/Duckling/Numeral/AF/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/AF/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.
+
+module Duckling.Numeral.AF.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.AF.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "AF Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/AR/Tests.hs b/tests/Duckling/Numeral/AR/Tests.hs
--- a/tests/Duckling/Numeral/AR/Tests.hs
+++ b/tests/Duckling/Numeral/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.AR.Tests
@@ -14,10 +13,23 @@
 import Test.Tasty
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Numeral.AR.Corpus
 import Duckling.Testing.Asserts
+import Duckling.Testing.Types hiding (examples)
+import qualified Duckling.Numeral.AR.EG.Corpus as EG
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
+  , localeTests
   ]
+
+localeTests :: TestTree
+localeTests = testGroup "Locale Tests"
+  [ testGroup "AR_EG Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeEG EG.allExamples
+    ]
+  ]
+  where
+    localeEG = makeLocale AR $ Just EG
diff --git a/tests/Duckling/Numeral/BG/Tests.hs b/tests/Duckling/Numeral/BG/Tests.hs
--- a/tests/Duckling/Numeral/BG/Tests.hs
+++ b/tests/Duckling/Numeral/BG/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.BG.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "BG Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/BN/Tests.hs b/tests/Duckling/Numeral/BN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/BN/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.
+
+module Duckling.Numeral.BN.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.BN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "BN Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/CA/Tests.hs b/tests/Duckling/Numeral/CA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/CA/Tests.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.
+
+
+module Duckling.Numeral.CA.Tests
+  ( tests ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.CA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "CA Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/CS/Tests.hs b/tests/Duckling/Numeral/CS/Tests.hs
--- a/tests/Duckling/Numeral/CS/Tests.hs
+++ b/tests/Duckling/Numeral/CS/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.CS.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "CS Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/DA/Tests.hs b/tests/Duckling/Numeral/DA/Tests.hs
--- a/tests/Duckling/Numeral/DA/Tests.hs
+++ b/tests/Duckling/Numeral/DA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.DA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "DA Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/DE/Tests.hs b/tests/Duckling/Numeral/DE/Tests.hs
--- a/tests/Duckling/Numeral/DE/Tests.hs
+++ b/tests/Duckling/Numeral/DE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.DE.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "DE Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/EL/Tests.hs b/tests/Duckling/Numeral/EL/Tests.hs
--- a/tests/Duckling/Numeral/EL/Tests.hs
+++ b/tests/Duckling/Numeral/EL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.EL.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "EL Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/EN/Tests.hs b/tests/Duckling/Numeral/EN/Tests.hs
--- a/tests/Duckling/Numeral/EN/Tests.hs
+++ b/tests/Duckling/Numeral/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -26,7 +25,7 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   , surroundTests
   , intersectTests
   , rangeTests
@@ -35,7 +34,7 @@
 surroundTests :: TestTree
 surroundTests = testCase "Surround Tests" $
   mapM_ (analyzedFirstTest testContext testOptions .
-    withTargets [This Numeral]) xs
+    withTargets [Seal Numeral]) xs
   where
     xs = concat
       [ examples (NumeralValue 3)
@@ -52,14 +51,14 @@
 
 intersectTests :: TestTree
 intersectTests = testCase "Intersect Test" $
-  mapM_ (analyzedNTest testContext testOptions . withTargets [This Numeral]) xs
+  mapM_ (analyzedNTest testContext testOptions . withTargets [Seal Numeral]) xs
   where
     xs = [ ("10 millions minus 10", 2)
          ]
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
-  mapM_ (analyzedRangeTest testContext testOptions . withTargets [This Numeral]) xs
+  mapM_ (analyzedRangeTest testContext testOptions . withTargets [Seal Numeral]) xs
   where
     xs = [ ("negative negative 5", Range 9 19) -- prevent double negatives
          , ("negative-5", Range 8 10) -- prevent double negatives
diff --git a/tests/Duckling/Numeral/ES/Tests.hs b/tests/Duckling/Numeral/ES/Tests.hs
--- a/tests/Duckling/Numeral/ES/Tests.hs
+++ b/tests/Duckling/Numeral/ES/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.ES.Tests
@@ -14,10 +13,59 @@
 import Test.Tasty
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Numeral.ES.Corpus
 import Duckling.Testing.Asserts
+import Duckling.Testing.Types hiding (examples)
+import qualified Duckling.Numeral.ES.AR.Corpus as AR
+import qualified Duckling.Numeral.ES.CL.Corpus as CL
+import qualified Duckling.Numeral.ES.CO.Corpus as CO
+import qualified Duckling.Numeral.ES.ES.Corpus as ES
+import qualified Duckling.Numeral.ES.MX.Corpus as MX
+import qualified Duckling.Numeral.ES.PE.Corpus as PE
+import qualified Duckling.Numeral.ES.VE.Corpus as VE
+import qualified Duckling.Region as R
+  ( Region
+      ( AR
+      , ES
+      )
+  )
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
+  , localeTests
   ]
+
+localeTests :: TestTree
+localeTests = testGroup "Locale Tests"
+  [ testGroup "ES_AR Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeAR AR.allExamples
+    ]
+  , testGroup "ES_CL Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeCL CL.allExamples
+    ]
+  , testGroup "ES_CO Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeCO CO.allExamples
+    ]
+  , testGroup "ES_ES Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeES ES.allExamples
+    ]
+  , testGroup "ES_MX Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeMX MX.allExamples
+    ]
+  , testGroup "ES_PE Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localePE PE.allExamples
+    ]
+  , testGroup "ES_VE Tests"
+    [ makeCorpusTest [Seal Numeral] $ withLocale corpus localeVE VE.allExamples
+    ]
+  ]
+  where
+    localeAR = makeLocale ES $ Just R.AR
+    localeCL = makeLocale ES $ Just CL
+    localeCO = makeLocale ES $ Just CO
+    localeES = makeLocale ES $ Just R.ES
+    localeMX = makeLocale ES $ Just MX
+    localePE = makeLocale ES $ Just PE
+    localeVE = makeLocale ES $ Just VE
diff --git a/tests/Duckling/Numeral/ET/Tests.hs b/tests/Duckling/Numeral/ET/Tests.hs
--- a/tests/Duckling/Numeral/ET/Tests.hs
+++ b/tests/Duckling/Numeral/ET/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.ET.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ET Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/FA/Tests.hs b/tests/Duckling/Numeral/FA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/FA/Tests.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.
+
+
+module Duckling.Numeral.FA.Tests
+  ( tests ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.FA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "FA Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/FI/Tests.hs b/tests/Duckling/Numeral/FI/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/FI/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.
+
+module Duckling.Numeral.FI.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.FI.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "FI Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/FR/Tests.hs b/tests/Duckling/Numeral/FR/Tests.hs
--- a/tests/Duckling/Numeral/FR/Tests.hs
+++ b/tests/Duckling/Numeral/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.FR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/GA/Tests.hs b/tests/Duckling/Numeral/GA/Tests.hs
--- a/tests/Duckling/Numeral/GA/Tests.hs
+++ b/tests/Duckling/Numeral/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.GA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/HE/Tests.hs b/tests/Duckling/Numeral/HE/Tests.hs
--- a/tests/Duckling/Numeral/HE/Tests.hs
+++ b/tests/Duckling/Numeral/HE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.HE.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HE Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/HI/Tests.hs b/tests/Duckling/Numeral/HI/Tests.hs
--- a/tests/Duckling/Numeral/HI/Tests.hs
+++ b/tests/Duckling/Numeral/HI/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.HI.Tests
   ( tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "HI Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/HR/Tests.hs b/tests/Duckling/Numeral/HR/Tests.hs
--- a/tests/Duckling/Numeral/HR/Tests.hs
+++ b/tests/Duckling/Numeral/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/HU/Tests.hs b/tests/Duckling/Numeral/HU/Tests.hs
--- a/tests/Duckling/Numeral/HU/Tests.hs
+++ b/tests/Duckling/Numeral/HU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.HU.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HU Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/ID/Tests.hs b/tests/Duckling/Numeral/ID/Tests.hs
--- a/tests/Duckling/Numeral/ID/Tests.hs
+++ b/tests/Duckling/Numeral/ID/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.ID.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ID Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/IS/Tests.hs b/tests/Duckling/Numeral/IS/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/IS/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.
+
+module Duckling.Numeral.IS.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.IS.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "IS Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/IT/Tests.hs b/tests/Duckling/Numeral/IT/Tests.hs
--- a/tests/Duckling/Numeral/IT/Tests.hs
+++ b/tests/Duckling/Numeral/IT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.IT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "IT Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/JA/Tests.hs b/tests/Duckling/Numeral/JA/Tests.hs
--- a/tests/Duckling/Numeral/JA/Tests.hs
+++ b/tests/Duckling/Numeral/JA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.JA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "JA Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/KA/Tests.hs b/tests/Duckling/Numeral/KA/Tests.hs
--- a/tests/Duckling/Numeral/KA/Tests.hs
+++ b/tests/Duckling/Numeral/KA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.KA.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "KA Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/KM/Tests.hs b/tests/Duckling/Numeral/KM/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/KM/Tests.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.
+
+module Duckling.Numeral.KM.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.KM.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KM Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/KN/Tests.hs b/tests/Duckling/Numeral/KN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/KN/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.
+
+module Duckling.Numeral.KN.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.KN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KN Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/KO/Tests.hs b/tests/Duckling/Numeral/KO/Tests.hs
--- a/tests/Duckling/Numeral/KO/Tests.hs
+++ b/tests/Duckling/Numeral/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/LO/Tests.hs b/tests/Duckling/Numeral/LO/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/LO/Tests.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.
+
+module Duckling.Numeral.LO.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.LO.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "LO Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/ML/Tests.hs b/tests/Duckling/Numeral/ML/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/ML/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.
+
+
+module Duckling.Numeral.ML.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.ML.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ML Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/MN/Tests.hs b/tests/Duckling/Numeral/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/MN/Tests.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.
+
+module Duckling.Numeral.MN.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.MN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/MY/Tests.hs b/tests/Duckling/Numeral/MY/Tests.hs
--- a/tests/Duckling/Numeral/MY/Tests.hs
+++ b/tests/Duckling/Numeral/MY/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.MY.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "MY Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/NB/Tests.hs b/tests/Duckling/Numeral/NB/Tests.hs
--- a/tests/Duckling/Numeral/NB/Tests.hs
+++ b/tests/Duckling/Numeral/NB/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.NB.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NB Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/NE/Tests.hs b/tests/Duckling/Numeral/NE/Tests.hs
--- a/tests/Duckling/Numeral/NE/Tests.hs
+++ b/tests/Duckling/Numeral/NE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.NE.Tests
   ( tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NE Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/NL/Tests.hs b/tests/Duckling/Numeral/NL/Tests.hs
--- a/tests/Duckling/Numeral/NL/Tests.hs
+++ b/tests/Duckling/Numeral/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.NL.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/PL/Tests.hs b/tests/Duckling/Numeral/PL/Tests.hs
--- a/tests/Duckling/Numeral/PL/Tests.hs
+++ b/tests/Duckling/Numeral/PL/Tests.hs
@@ -2,14 +2,12 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.PL.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
 import Test.Tasty
 
@@ -19,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "PL Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/PT/Tests.hs b/tests/Duckling/Numeral/PT/Tests.hs
--- a/tests/Duckling/Numeral/PT/Tests.hs
+++ b/tests/Duckling/Numeral/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/RO/Tests.hs b/tests/Duckling/Numeral/RO/Tests.hs
--- a/tests/Duckling/Numeral/RO/Tests.hs
+++ b/tests/Duckling/Numeral/RO/Tests.hs
@@ -2,22 +2,35 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.RO.Tests
-  ( tests ) where
+  ( tests
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
+import Test.Tasty.HUnit
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Numeral.RO.Corpus
+import Duckling.Resolve
 import Duckling.Testing.Asserts
+import Duckling.Testing.Types
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
+  , intersectTests
   ]
+
+intersectTests :: TestTree
+intersectTests = testCase "Intersect Test" $
+  mapM_ (analyzedNTest context testOptions . withTargets [Seal Numeral])
+    [ ("19 de milioane", 2) -- make sure ruleMultiplyDe only takes >= 20
+    ]
+  where
+    context = testContext {locale = makeLocale RO Nothing}
diff --git a/tests/Duckling/Numeral/RU/Tests.hs b/tests/Duckling/Numeral/RU/Tests.hs
--- a/tests/Duckling/Numeral/RU/Tests.hs
+++ b/tests/Duckling/Numeral/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.RU.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/SK/Tests.hs b/tests/Duckling/Numeral/SK/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/SK/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.SK.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.SK.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "SK Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/SV/Tests.hs b/tests/Duckling/Numeral/SV/Tests.hs
--- a/tests/Duckling/Numeral/SV/Tests.hs
+++ b/tests/Duckling/Numeral/SV/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.SV.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "SV Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/SW/Tests.hs b/tests/Duckling/Numeral/SW/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/SW/Tests.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.
+
+module Duckling.Numeral.SW.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.SW.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "SW Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/TA/Tests.hs b/tests/Duckling/Numeral/TA/Tests.hs
--- a/tests/Duckling/Numeral/TA/Tests.hs
+++ b/tests/Duckling/Numeral/TA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Numeral.TA.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "TA Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/TE/Tests.hs b/tests/Duckling/Numeral/TE/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/TE/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.
+
+module Duckling.Numeral.TE.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.TE.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "TE Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/TH/Tests.hs b/tests/Duckling/Numeral/TH/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/TH/Tests.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.
+
+module Duckling.Numeral.TH.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.TH.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "TH Tests"
+  [ makeCorpusTest [Seal Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/TR/Tests.hs b/tests/Duckling/Numeral/TR/Tests.hs
--- a/tests/Duckling/Numeral/TR/Tests.hs
+++ b/tests/Duckling/Numeral/TR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.TR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "TR Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.Tests (tests) where
@@ -12,8 +11,11 @@
 import Prelude
 import Test.Tasty
 
+import qualified Duckling.Numeral.AF.Tests as AF
 import qualified Duckling.Numeral.AR.Tests as AR
 import qualified Duckling.Numeral.BG.Tests as BG
+import qualified Duckling.Numeral.BN.Tests as BN
+import qualified Duckling.Numeral.CA.Tests as CA
 import qualified Duckling.Numeral.CS.Tests as CS
 import qualified Duckling.Numeral.DA.Tests as DA
 import qualified Duckling.Numeral.DE.Tests as DE
@@ -21,6 +23,8 @@
 import qualified Duckling.Numeral.EN.Tests as EN
 import qualified Duckling.Numeral.ES.Tests as ES
 import qualified Duckling.Numeral.ET.Tests as ET
+import qualified Duckling.Numeral.FI.Tests as FI
+import qualified Duckling.Numeral.FA.Tests as FA
 import qualified Duckling.Numeral.FR.Tests as FR
 import qualified Duckling.Numeral.GA.Tests as GA
 import qualified Duckling.Numeral.HE.Tests as HE
@@ -28,10 +32,16 @@
 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.IS.Tests as IS
 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.KM.Tests as KM
+import qualified Duckling.Numeral.KN.Tests as KN
 import qualified Duckling.Numeral.KO.Tests as KO
+import qualified Duckling.Numeral.LO.Tests as LO
+import qualified Duckling.Numeral.ML.Tests as ML
+import qualified Duckling.Numeral.MN.Tests as MN
 import qualified Duckling.Numeral.MY.Tests as MY
 import qualified Duckling.Numeral.NB.Tests as NB
 import qualified Duckling.Numeral.NE.Tests as NE
@@ -40,8 +50,12 @@
 import qualified Duckling.Numeral.PT.Tests as PT
 import qualified Duckling.Numeral.RO.Tests as RO
 import qualified Duckling.Numeral.RU.Tests as RU
+import qualified Duckling.Numeral.SK.Tests as SK
 import qualified Duckling.Numeral.SV.Tests as SV
+import qualified Duckling.Numeral.SW.Tests as SW
 import qualified Duckling.Numeral.TA.Tests as TA
+import qualified Duckling.Numeral.TE.Tests as TE
+import qualified Duckling.Numeral.TH.Tests as TH
 import qualified Duckling.Numeral.TR.Tests as TR
 import qualified Duckling.Numeral.UK.Tests as UK
 import qualified Duckling.Numeral.VI.Tests as VI
@@ -49,8 +63,11 @@
 
 tests :: TestTree
 tests = testGroup "Numeral Tests"
-  [ AR.tests
+  [ AF.tests
+  , AR.tests
   , BG.tests
+  , BN.tests
+  , CA.tests
   , CS.tests
   , DA.tests
   , DE.tests
@@ -58,17 +75,25 @@
   , EN.tests
   , ES.tests
   , ET.tests
+  , FA.tests
   , FR.tests
+  , FI.tests
   , GA.tests
   , HE.tests
   , HI.tests
   , HR.tests
   , HU.tests
   , ID.tests
+  , IS.tests
   , IT.tests
   , JA.tests
   , KA.tests
+  , KM.tests
+  , KN.tests
   , KO.tests
+  , LO.tests
+  , ML.tests
+  , MN.tests
   , MY.tests
   , NB.tests
   , NE.tests
@@ -77,8 +102,12 @@
   , PT.tests
   , RO.tests
   , RU.tests
+  , SK.tests
   , SV.tests
+  , SW.tests
   , TA.tests
+  , TE.tests
+  , TH.tests
   , TR.tests
   , UK.tests
   , VI.tests
diff --git a/tests/Duckling/Numeral/UK/Tests.hs b/tests/Duckling/Numeral/UK/Tests.hs
--- a/tests/Duckling/Numeral/UK/Tests.hs
+++ b/tests/Duckling/Numeral/UK/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.UK.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "UK Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/VI/Tests.hs b/tests/Duckling/Numeral/VI/Tests.hs
--- a/tests/Duckling/Numeral/VI/Tests.hs
+++ b/tests/Duckling/Numeral/VI/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.VI.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "VI Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Numeral/ZH/Tests.hs b/tests/Duckling/Numeral/ZH/Tests.hs
--- a/tests/Duckling/Numeral/ZH/Tests.hs
+++ b/tests/Duckling/Numeral/ZH/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Numeral.ZH.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Numeral] corpus
+  [ makeCorpusTest [Seal Numeral] corpus
   ]
diff --git a/tests/Duckling/Ordinal/AR/Tests.hs b/tests/Duckling/Ordinal/AR/Tests.hs
--- a/tests/Duckling/Ordinal/AR/Tests.hs
+++ b/tests/Duckling/Ordinal/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.AR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/BG/Tests.hs b/tests/Duckling/Ordinal/BG/Tests.hs
--- a/tests/Duckling/Ordinal/BG/Tests.hs
+++ b/tests/Duckling/Ordinal/BG/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.BG.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "BG Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/CA/Tests.hs b/tests/Duckling/Ordinal/CA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/CA/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.
+
+
+module Duckling.Ordinal.CA.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.CA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "CA Tests"
+  [ makeCorpusTest [Seal Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/DA/Tests.hs b/tests/Duckling/Ordinal/DA/Tests.hs
--- a/tests/Duckling/Ordinal/DA/Tests.hs
+++ b/tests/Duckling/Ordinal/DA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.DA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "DA Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/DE/Tests.hs b/tests/Duckling/Ordinal/DE/Tests.hs
--- a/tests/Duckling/Ordinal/DE/Tests.hs
+++ b/tests/Duckling/Ordinal/DE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.DE.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "DE Tests"
-  [ makeCorpusTest [This Ordinal] corpus
-  , makeNegativeCorpusTest [This Ordinal] negativeCorpus
+  [ makeCorpusTest [Seal Ordinal] corpus
+  , makeNegativeCorpusTest [Seal Ordinal] negativeCorpus
   ]
diff --git a/tests/Duckling/Ordinal/EL/Tests.hs b/tests/Duckling/Ordinal/EL/Tests.hs
--- a/tests/Duckling/Ordinal/EL/Tests.hs
+++ b/tests/Duckling/Ordinal/EL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.EL.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "EL Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/EN/Tests.hs b/tests/Duckling/Ordinal/EN/Tests.hs
--- a/tests/Duckling/Ordinal/EN/Tests.hs
+++ b/tests/Duckling/Ordinal/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.EN.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/ES/Tests.hs b/tests/Duckling/Ordinal/ES/Tests.hs
--- a/tests/Duckling/Ordinal/ES/Tests.hs
+++ b/tests/Duckling/Ordinal/ES/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.ES.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/ET/Tests.hs b/tests/Duckling/Ordinal/ET/Tests.hs
--- a/tests/Duckling/Ordinal/ET/Tests.hs
+++ b/tests/Duckling/Ordinal/ET/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.ET.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ET Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/FR/Tests.hs b/tests/Duckling/Ordinal/FR/Tests.hs
--- a/tests/Duckling/Ordinal/FR/Tests.hs
+++ b/tests/Duckling/Ordinal/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.FR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/GA/Tests.hs b/tests/Duckling/Ordinal/GA/Tests.hs
--- a/tests/Duckling/Ordinal/GA/Tests.hs
+++ b/tests/Duckling/Ordinal/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.GA.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/HE/Tests.hs b/tests/Duckling/Ordinal/HE/Tests.hs
--- a/tests/Duckling/Ordinal/HE/Tests.hs
+++ b/tests/Duckling/Ordinal/HE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Ordinal.HE.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HE Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/HI/Tests.hs b/tests/Duckling/Ordinal/HI/Tests.hs
--- a/tests/Duckling/Ordinal/HI/Tests.hs
+++ b/tests/Duckling/Ordinal/HI/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.HI.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "HI Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/HR/Tests.hs b/tests/Duckling/Ordinal/HR/Tests.hs
--- a/tests/Duckling/Ordinal/HR/Tests.hs
+++ b/tests/Duckling/Ordinal/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Ordinal.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/HU/Tests.hs b/tests/Duckling/Ordinal/HU/Tests.hs
--- a/tests/Duckling/Ordinal/HU/Tests.hs
+++ b/tests/Duckling/Ordinal/HU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.HU.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "HU Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/ID/Tests.hs b/tests/Duckling/Ordinal/ID/Tests.hs
--- a/tests/Duckling/Ordinal/ID/Tests.hs
+++ b/tests/Duckling/Ordinal/ID/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.ID.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ID Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/IT/Tests.hs b/tests/Duckling/Ordinal/IT/Tests.hs
--- a/tests/Duckling/Ordinal/IT/Tests.hs
+++ b/tests/Duckling/Ordinal/IT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.IT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "IT Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/JA/Tests.hs b/tests/Duckling/Ordinal/JA/Tests.hs
--- a/tests/Duckling/Ordinal/JA/Tests.hs
+++ b/tests/Duckling/Ordinal/JA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.JA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "JA Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/KA/Tests.hs b/tests/Duckling/Ordinal/KA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/KA/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.
+
+
+module Duckling.Ordinal.KA.Tests
+  ( tests
+  ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.KA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KA Tests"
+  [ makeCorpusTest [Seal Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/KM/Tests.hs b/tests/Duckling/Ordinal/KM/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/KM/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.
+
+
+module Duckling.Ordinal.KM.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.KM.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KM Tests"
+  [ makeCorpusTest [Seal Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/KO/Tests.hs b/tests/Duckling/Ordinal/KO/Tests.hs
--- a/tests/Duckling/Ordinal/KO/Tests.hs
+++ b/tests/Duckling/Ordinal/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/ML/Tests.hs b/tests/Duckling/Ordinal/ML/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/ML/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.
+
+module Duckling.Ordinal.ML.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.ML.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ML Tests"
+  [ makeCorpusTest [Seal Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/MN/Tests.hs b/tests/Duckling/Ordinal/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/MN/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.
+
+
+module Duckling.Ordinal.MN.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.MN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/NB/Tests.hs b/tests/Duckling/Ordinal/NB/Tests.hs
--- a/tests/Duckling/Ordinal/NB/Tests.hs
+++ b/tests/Duckling/Ordinal/NB/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.NB.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NB Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/NL/Tests.hs b/tests/Duckling/Ordinal/NL/Tests.hs
--- a/tests/Duckling/Ordinal/NL/Tests.hs
+++ b/tests/Duckling/Ordinal/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.NL.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/PL/Tests.hs b/tests/Duckling/Ordinal/PL/Tests.hs
--- a/tests/Duckling/Ordinal/PL/Tests.hs
+++ b/tests/Duckling/Ordinal/PL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.PL.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PL Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/PT/Tests.hs b/tests/Duckling/Ordinal/PT/Tests.hs
--- a/tests/Duckling/Ordinal/PT/Tests.hs
+++ b/tests/Duckling/Ordinal/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/RO/Tests.hs b/tests/Duckling/Ordinal/RO/Tests.hs
--- a/tests/Duckling/Ordinal/RO/Tests.hs
+++ b/tests/Duckling/Ordinal/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.RO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/RU/Tests.hs b/tests/Duckling/Ordinal/RU/Tests.hs
--- a/tests/Duckling/Ordinal/RU/Tests.hs
+++ b/tests/Duckling/Ordinal/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.RU.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/SV/Tests.hs b/tests/Duckling/Ordinal/SV/Tests.hs
--- a/tests/Duckling/Ordinal/SV/Tests.hs
+++ b/tests/Duckling/Ordinal/SV/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.SV.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "SV Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/TA/Tests.hs b/tests/Duckling/Ordinal/TA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/TA/Tests.hs
@@ -0,0 +1,22 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree.
+
+module Duckling.Ordinal.TA.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.TA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "TA Tests"
+  [ makeCorpusTest [Seal Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/TR/Tests.hs b/tests/Duckling/Ordinal/TR/Tests.hs
--- a/tests/Duckling/Ordinal/TR/Tests.hs
+++ b/tests/Duckling/Ordinal/TR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.TR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "TR Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal 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
@@ -2,18 +2,17 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.Tests (tests) where
 
 import Data.String
-import Prelude
 import Test.Tasty
 
 import qualified Duckling.Ordinal.AR.Tests as AR
 import qualified Duckling.Ordinal.BG.Tests as BG
+import qualified Duckling.Ordinal.CA.Tests as CA
 import qualified Duckling.Ordinal.DA.Tests as DA
 import qualified Duckling.Ordinal.DE.Tests as DE
 import qualified Duckling.Ordinal.EL.Tests as EL
@@ -29,7 +28,11 @@
 import qualified Duckling.Ordinal.ID.Tests as ID
 import qualified Duckling.Ordinal.IT.Tests as IT
 import qualified Duckling.Ordinal.JA.Tests as JA
+import qualified Duckling.Ordinal.KA.Tests as KA
+import qualified Duckling.Ordinal.KM.Tests as KM
 import qualified Duckling.Ordinal.KO.Tests as KO
+import qualified Duckling.Ordinal.MN.Tests as MN
+import qualified Duckling.Ordinal.ML.Tests as ML
 import qualified Duckling.Ordinal.NB.Tests as NB
 import qualified Duckling.Ordinal.NL.Tests as NL
 import qualified Duckling.Ordinal.PL.Tests as PL
@@ -37,6 +40,7 @@
 import qualified Duckling.Ordinal.RO.Tests as RO
 import qualified Duckling.Ordinal.RU.Tests as RU
 import qualified Duckling.Ordinal.SV.Tests as SV
+import qualified Duckling.Ordinal.TA.Tests as TA
 import qualified Duckling.Ordinal.TR.Tests as TR
 import qualified Duckling.Ordinal.UK.Tests as UK
 import qualified Duckling.Ordinal.VI.Tests as VI
@@ -46,6 +50,7 @@
 tests = testGroup "Ordinal Tests"
   [ AR.tests
   , BG.tests
+  , CA.tests
   , DA.tests
   , DE.tests
   , EL.tests
@@ -61,7 +66,11 @@
   , ID.tests
   , IT.tests
   , JA.tests
+  , KA.tests
+  , KM.tests
   , KO.tests
+  , MN.tests
+  , ML.tests
   , NB.tests
   , NL.tests
   , PL.tests
@@ -69,6 +78,7 @@
   , RO.tests
   , RU.tests
   , SV.tests
+  , TA.tests
   , TR.tests
   , UK.tests
   , VI.tests
diff --git a/tests/Duckling/Ordinal/UK/Tests.hs b/tests/Duckling/Ordinal/UK/Tests.hs
--- a/tests/Duckling/Ordinal/UK/Tests.hs
+++ b/tests/Duckling/Ordinal/UK/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.UK.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "UK Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/VI/Tests.hs b/tests/Duckling/Ordinal/VI/Tests.hs
--- a/tests/Duckling/Ordinal/VI/Tests.hs
+++ b/tests/Duckling/Ordinal/VI/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Ordinal.VI.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "VI Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/Ordinal/ZH/Tests.hs b/tests/Duckling/Ordinal/ZH/Tests.hs
--- a/tests/Duckling/Ordinal/ZH/Tests.hs
+++ b/tests/Duckling/Ordinal/ZH/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Ordinal.ZH.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Ordinal] corpus
+  [ makeCorpusTest [Seal Ordinal] corpus
   ]
diff --git a/tests/Duckling/PhoneNumber/AR/Tests.hs b/tests/Duckling/PhoneNumber/AR/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/PhoneNumber/AR/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.
+
+
+module Duckling.PhoneNumber.AR.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.PhoneNumber.AR.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "PhoneNumber Tests"
+  [ makeCorpusTest [Seal PhoneNumber] corpus
+  , makeNegativeCorpusTest [Seal PhoneNumber] negativeCorpus
+  ]
diff --git a/tests/Duckling/PhoneNumber/PT/Tests.hs b/tests/Duckling/PhoneNumber/PT/Tests.hs
--- a/tests/Duckling/PhoneNumber/PT/Tests.hs
+++ b/tests/Duckling/PhoneNumber/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.PhoneNumber.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PhoneNumber Tests"
-  [ makeCorpusTest [This PhoneNumber] corpus
+  [ makeCorpusTest [Seal PhoneNumber] corpus
   ]
diff --git a/tests/Duckling/PhoneNumber/Tests.hs b/tests/Duckling/PhoneNumber/Tests.hs
--- a/tests/Duckling/PhoneNumber/Tests.hs
+++ b/tests/Duckling/PhoneNumber/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -22,20 +21,22 @@
 import Duckling.PhoneNumber.Types
 import Duckling.Testing.Asserts
 import Duckling.Testing.Types
+import qualified Duckling.PhoneNumber.AR.Tests as AR
 import qualified Duckling.PhoneNumber.PT.Tests as PT
 
 tests :: TestTree
 tests = testGroup "PhoneNumber Tests"
-  [ makeCorpusTest [This PhoneNumber] corpus
-  , makeNegativeCorpusTest [This PhoneNumber] negativeCorpus
+  [ makeCorpusTest [Seal PhoneNumber] corpus
+  , makeNegativeCorpusTest [Seal PhoneNumber] negativeCorpus
   , surroundTests
   , PT.tests
+  , AR.tests
   ]
 
 surroundTests :: TestTree
 surroundTests = testCase "Surround Tests" $
   mapM_ (analyzedFirstTest testContext testOptions .
-    withTargets [This PhoneNumber]) xs
+    withTargets [Seal PhoneNumber]) xs
   where
     xs = examples (PhoneNumberValue "06354640807")
                   [ "hey 06354640807"
diff --git a/tests/Duckling/Quantity/AR/Tests.hs b/tests/Duckling/Quantity/AR/Tests.hs
--- a/tests/Duckling/Quantity/AR/Tests.hs
+++ b/tests/Duckling/Quantity/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.AR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/EN/Tests.hs b/tests/Duckling/Quantity/EN/Tests.hs
--- a/tests/Duckling/Quantity/EN/Tests.hs
+++ b/tests/Duckling/Quantity/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.EN.Tests
@@ -20,5 +19,6 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
+  , makeCorpusTest [Seal Quantity] latentCorpus
   ]
diff --git a/tests/Duckling/Quantity/ES/Tests.hs b/tests/Duckling/Quantity/ES/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Quantity/ES/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.
+
+
+module Duckling.Quantity.ES.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Quantity.ES.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ES Tests"
+  [ makeCorpusTest [Seal Quantity] corpus
+  ]
diff --git a/tests/Duckling/Quantity/FR/Tests.hs b/tests/Duckling/Quantity/FR/Tests.hs
--- a/tests/Duckling/Quantity/FR/Tests.hs
+++ b/tests/Duckling/Quantity/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.FR.Tests
@@ -17,5 +16,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/HR/Tests.hs b/tests/Duckling/Quantity/HR/Tests.hs
--- a/tests/Duckling/Quantity/HR/Tests.hs
+++ b/tests/Duckling/Quantity/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Quantity.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/KM/Tests.hs b/tests/Duckling/Quantity/KM/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Quantity/KM/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.
+
+
+module Duckling.Quantity.KM.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Quantity.KM.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KM Tests"
+  [ makeCorpusTest [Seal Quantity] corpus
+  ]
diff --git a/tests/Duckling/Quantity/KO/Tests.hs b/tests/Duckling/Quantity/KO/Tests.hs
--- a/tests/Duckling/Quantity/KO/Tests.hs
+++ b/tests/Duckling/Quantity/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/MN/Tests.hs b/tests/Duckling/Quantity/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Quantity/MN/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.
+
+
+module Duckling.Quantity.MN.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Quantity.MN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Quantity] corpus
+  ]
diff --git a/tests/Duckling/Quantity/NL/Tests.hs b/tests/Duckling/Quantity/NL/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Quantity/NL/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.
+
+
+module Duckling.Quantity.NL.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Quantity.NL.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "NL Tests"
+  [ makeCorpusTest [Seal Quantity] corpus
+  ]
diff --git a/tests/Duckling/Quantity/PT/Tests.hs b/tests/Duckling/Quantity/PT/Tests.hs
--- a/tests/Duckling/Quantity/PT/Tests.hs
+++ b/tests/Duckling/Quantity/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/RO/Tests.hs b/tests/Duckling/Quantity/RO/Tests.hs
--- a/tests/Duckling/Quantity/RO/Tests.hs
+++ b/tests/Duckling/Quantity/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.RO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/RU/Tests.hs b/tests/Duckling/Quantity/RU/Tests.hs
--- a/tests/Duckling/Quantity/RU/Tests.hs
+++ b/tests/Duckling/Quantity/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.RU.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Quantity/Tests.hs b/tests/Duckling/Quantity/Tests.hs
--- a/tests/Duckling/Quantity/Tests.hs
+++ b/tests/Duckling/Quantity/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.Tests
@@ -11,14 +10,17 @@
   ) where
 
 import Data.String
-import Prelude
 import Test.Tasty
 
 import qualified Duckling.Quantity.AR.Tests as AR
 import qualified Duckling.Quantity.EN.Tests as EN
+import qualified Duckling.Quantity.ES.Tests as ES
 import qualified Duckling.Quantity.FR.Tests as FR
 import qualified Duckling.Quantity.HR.Tests as HR
+import qualified Duckling.Quantity.KM.Tests as KM
 import qualified Duckling.Quantity.KO.Tests as KO
+import qualified Duckling.Quantity.MN.Tests as MN
+import qualified Duckling.Quantity.NL.Tests as NL
 import qualified Duckling.Quantity.PT.Tests as PT
 import qualified Duckling.Quantity.RO.Tests as RO
 import qualified Duckling.Quantity.RU.Tests as RU
@@ -28,9 +30,13 @@
 tests = testGroup "Quantity Tests"
   [ AR.tests
   , EN.tests
+  , ES.tests
   , FR.tests
   , HR.tests
+  , KM.tests
   , KO.tests
+  , MN.tests
+  , NL.tests
   , PT.tests
   , RO.tests
   , RU.tests
diff --git a/tests/Duckling/Quantity/ZH/Tests.hs b/tests/Duckling/Quantity/ZH/Tests.hs
--- a/tests/Duckling/Quantity/ZH/Tests.hs
+++ b/tests/Duckling/Quantity/ZH/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Quantity.ZH.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Quantity] corpus
+  [ makeCorpusTest [Seal Quantity] corpus
   ]
diff --git a/tests/Duckling/Temperature/AR/Tests.hs b/tests/Duckling/Temperature/AR/Tests.hs
--- a/tests/Duckling/Temperature/AR/Tests.hs
+++ b/tests/Duckling/Temperature/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.AR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/EN/Tests.hs b/tests/Duckling/Temperature/EN/Tests.hs
--- a/tests/Duckling/Temperature/EN/Tests.hs
+++ b/tests/Duckling/Temperature/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.EN.Tests
@@ -23,14 +22,14 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   , rangeTests
   ]
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
   mapM_ (analyzedRangeTest testContext testOptions
-          . withTargets [This Temperature]) xs
+          . withTargets [Seal Temperature]) xs
   where
     xs = [ ("between 40 and 30 degrees", Range 15 25 )
          , ("30 degrees degrees", Range 0 10 )
diff --git a/tests/Duckling/Temperature/ES/Tests.hs b/tests/Duckling/Temperature/ES/Tests.hs
--- a/tests/Duckling/Temperature/ES/Tests.hs
+++ b/tests/Duckling/Temperature/ES/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.ES.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/FR/Tests.hs b/tests/Duckling/Temperature/FR/Tests.hs
--- a/tests/Duckling/Temperature/FR/Tests.hs
+++ b/tests/Duckling/Temperature/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.FR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/GA/Tests.hs b/tests/Duckling/Temperature/GA/Tests.hs
--- a/tests/Duckling/Temperature/GA/Tests.hs
+++ b/tests/Duckling/Temperature/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.GA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/HI/Tests.hs b/tests/Duckling/Temperature/HI/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Temperature/HI/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.
+
+
+module Duckling.Temperature.HI.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Temperature.HI.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "HI Tests"
+  [ makeCorpusTest [Seal Temperature] corpus
+  ]
diff --git a/tests/Duckling/Temperature/HR/Tests.hs b/tests/Duckling/Temperature/HR/Tests.hs
--- a/tests/Duckling/Temperature/HR/Tests.hs
+++ b/tests/Duckling/Temperature/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Temperature.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/IT/Tests.hs b/tests/Duckling/Temperature/IT/Tests.hs
--- a/tests/Duckling/Temperature/IT/Tests.hs
+++ b/tests/Duckling/Temperature/IT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Temperature.IT.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "IT Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/JA/Tests.hs b/tests/Duckling/Temperature/JA/Tests.hs
--- a/tests/Duckling/Temperature/JA/Tests.hs
+++ b/tests/Duckling/Temperature/JA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.JA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "JA Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/KM/Tests.hs b/tests/Duckling/Temperature/KM/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Temperature/KM/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.
+
+
+module Duckling.Temperature.KM.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Temperature.KM.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KM Tests"
+  [ makeCorpusTest [Seal Temperature] corpus
+  ]
diff --git a/tests/Duckling/Temperature/KO/Tests.hs b/tests/Duckling/Temperature/KO/Tests.hs
--- a/tests/Duckling/Temperature/KO/Tests.hs
+++ b/tests/Duckling/Temperature/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/MN/Tests.hs b/tests/Duckling/Temperature/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Temperature/MN/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.
+
+
+module Duckling.Temperature.MN.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Temperature.MN.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Temperature] corpus
+  ]
diff --git a/tests/Duckling/Temperature/PT/Tests.hs b/tests/Duckling/Temperature/PT/Tests.hs
--- a/tests/Duckling/Temperature/PT/Tests.hs
+++ b/tests/Duckling/Temperature/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/RO/Tests.hs b/tests/Duckling/Temperature/RO/Tests.hs
--- a/tests/Duckling/Temperature/RO/Tests.hs
+++ b/tests/Duckling/Temperature/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.RO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/TR/Tests.hs b/tests/Duckling/Temperature/TR/Tests.hs
--- a/tests/Duckling/Temperature/TR/Tests.hs
+++ b/tests/Duckling/Temperature/TR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.TR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "TR Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
diff --git a/tests/Duckling/Temperature/Tests.hs b/tests/Duckling/Temperature/Tests.hs
--- a/tests/Duckling/Temperature/Tests.hs
+++ b/tests/Duckling/Temperature/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.Tests (tests) where
@@ -17,10 +16,13 @@
 import qualified Duckling.Temperature.ES.Tests as ES
 import qualified Duckling.Temperature.FR.Tests as FR
 import qualified Duckling.Temperature.GA.Tests as GA
+import qualified Duckling.Temperature.HI.Tests as HI
 import qualified Duckling.Temperature.HR.Tests as HR
 import qualified Duckling.Temperature.IT.Tests as IT
 import qualified Duckling.Temperature.JA.Tests as JA
+import qualified Duckling.Temperature.KM.Tests as KM
 import qualified Duckling.Temperature.KO.Tests as KO
+import qualified Duckling.Temperature.MN.Tests as MN
 import qualified Duckling.Temperature.PT.Tests as PT
 import qualified Duckling.Temperature.RO.Tests as RO
 import qualified Duckling.Temperature.TR.Tests as TR
@@ -33,10 +35,13 @@
   , ES.tests
   , FR.tests
   , GA.tests
+  , HI.tests
   , HR.tests
   , IT.tests
   , JA.tests
+  , KM.tests
   , KO.tests
+  , MN.tests
   , PT.tests
   , RO.tests
   , TR.tests
diff --git a/tests/Duckling/Temperature/ZH/Tests.hs b/tests/Duckling/Temperature/ZH/Tests.hs
--- a/tests/Duckling/Temperature/ZH/Tests.hs
+++ b/tests/Duckling/Temperature/ZH/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Temperature.ZH.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Temperature] corpus
+  [ makeCorpusTest [Seal Temperature] corpus
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE TupleSections #-}
@@ -31,44 +30,51 @@
 
 import Duckling.Api
 import Duckling.Dimensions.Types
-import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.Types
 
-withTargets :: [Some Dimension] -> (Text, a) -> (Text, [Some Dimension], a)
+newtype ExampleInput = ExampleInput Text
+
+instance Show ExampleInput where
+  show (ExampleInput input) = "\"" ++ Text.unpack input ++ "\""
+
+withTargets :: [Seal Dimension] -> (Text, a) -> (Text, [Seal Dimension], a)
 withTargets targets (input, expected) = (input, targets, expected)
 
-analyzedTargetTest :: Context -> Options -> (Text, Some Dimension) -> IO ()
+analyzedTargetTest :: Context -> Options -> (Text, Seal Dimension) -> IO ()
 analyzedTargetTest context options (input, target) =
   assertBool msg $ all (== target) dimensions
   where
-    msg = "analyze " ++ show (input, [target])
+    msg = "analyze " ++ show (ExampleInput input, [target])
           ++ "dimensions = " ++ show dimensions
     dimensions = flip map (analyze input context options $ HashSet.singleton target) $
-      \(Resolved{node=Node{token=Token dimension _}}) -> This dimension
+      \(Resolved{node=Node{token=Token dimension _}}) -> Seal dimension
 
 analyzedFirstTest :: Context -> Options ->
-  (Text, [Some Dimension], TestPredicate) -> IO ()
+  (Text, [Seal Dimension], TestPredicate) -> IO ()
 analyzedFirstTest context options (input, targets, predicate) =
   case tokens of
-    [] -> assertFailure ("empty result on " ++ show (input, targets))
-    (token:_) -> assertBool ("don't pass predicate on " ++ show input) $
+    [] -> assertFailure
+      ("empty result on " ++ show (ExampleInput input, targets))
+    (token:_) -> assertBool
+      ("don't pass predicate on " ++ show (ExampleInput input)) $
       predicate context token
     where
       tokens = analyze input context options $ HashSet.fromList targets
 
 analyzedAmbiguousTest :: Context -> Options ->
-  (Text, [Some Dimension], [TestPredicate]) -> IO ()
+  (Text, [Seal Dimension], [TestPredicate]) -> IO ()
 analyzedAmbiguousTest context options (input, targets, predicates) =
   case tokens of
-    [] -> assertFailure ("empty result on " ++ show (input, targets))
-    _ -> assertBool ("don't pass predicate on " ++ show input) $
+    [] -> assertFailure
+      ("empty result on " ++ show (ExampleInput input, targets))
+    _ -> assertBool ("don't pass predicate on " ++ show (ExampleInput input)) $
       all (\predicate -> any (predicate context) tokens) predicates
     where
       tokens = analyze input context options $ HashSet.fromList targets
 
-makeCorpusTest :: [Some Dimension] -> Corpus -> TestTree
+makeCorpusTest :: [Seal Dimension] -> Corpus -> TestTree
 makeCorpusTest targets (context, options, xs) = testCase "Corpus Tests" $
   mapM_ check xs
   where
@@ -81,40 +87,44 @@
             partition ((== inputRange) . range) tokens in
       case fullRangeTokens of
         [] -> case restTokens of
-          [] -> assertFailure $ "empty result on " ++ show input
+          [] -> assertFailure $ "empty result on " ++ show (ExampleInput input)
           (_:_:_) -> assertFailure $
-            show (length restTokens) ++ " tokens found for " ++ show input
-          _ -> assertFailure $ "don't fully match " ++ show input
-        [token] -> assertBool ("don't pass predicate on " ++ show input) $
+            show (length restTokens) ++
+            " tokens found for " ++
+            show (ExampleInput input)
+          _ -> assertFailure $ "don't fully match " ++ show (ExampleInput input)
+        [token] -> assertBool
+          ("don't pass predicate on " ++ show (ExampleInput input)) $
           predicate context token
         _ -> assertFailure $ show (length fullRangeTokens)
-          ++ " different ambiguous parses on " ++ show input
+          ++ " different ambiguous parses on " ++ show (ExampleInput input)
 
 
-makeNegativeCorpusTest :: [Some Dimension] -> NegativeCorpus -> TestTree
+makeNegativeCorpusTest :: [Seal Dimension] -> NegativeCorpus -> TestTree
 makeNegativeCorpusTest targets (context, options, xs) =
   testCase "Negative Corpus Tests"
   $ mapM_ (analyzedNothingTest context options . (, targets)) xs
 
-analyzedRangeTest :: Context -> Options -> (Text, [Some Dimension], Range)
+analyzedRangeTest :: Context -> Options -> (Text, [Seal Dimension], Range)
   -> IO ()
 analyzedRangeTest context options  (input, targets, expRange) = case tokens of
-  [] -> assertFailure $ "empty result on " ++ show input
+  [] -> assertFailure $ "empty result on " ++ show (ExampleInput input)
   (_:_:_) -> assertFailure $
-    show (length tokens) ++ " tokens found for " ++ show input
+    show (length tokens) ++ " tokens found for " ++ show (ExampleInput input)
   (token:_) ->
-    assertEqual ("wrong range for " ++ show input) expRange (range token)
+    assertEqual ("wrong range for " ++ show (ExampleInput input))
+    expRange (range token)
   where
     tokens = analyze input context options $ HashSet.fromList targets
 
-analyzedNothingTest :: Context -> Options -> (Text, [Some Dimension]) -> IO ()
+analyzedNothingTest :: Context -> Options -> (Text, [Seal Dimension]) -> IO ()
 analyzedNothingTest context options (input, targets) =
   analyzedNTest context options (input, targets, 0)
 
-analyzedNTest :: Context -> Options -> (Text, [Some Dimension], Int) -> IO ()
+analyzedNTest :: Context -> Options -> (Text, [Seal Dimension], Int) -> IO ()
 analyzedNTest context options (input, targets, n) =
   assertBool msg . (== n) $ length tokens
   where
-    msg = "analyze " ++ show (input, targets)
+    msg = "analyze " ++ show (ExampleInput input, targets)
           ++ "tokens= " ++ show tokens
     tokens = analyze input context options $ HashSet.fromList targets
diff --git a/tests/Duckling/Tests.hs b/tests/Duckling/Tests.hs
--- a/tests/Duckling/Tests.hs
+++ b/tests/Duckling/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE NoRebindableSyntax #-}
diff --git a/tests/Duckling/Time/AR/Tests.hs b/tests/Duckling/Time/AR/Tests.hs
--- a/tests/Duckling/Time/AR/Tests.hs
+++ b/tests/Duckling/Time/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.AR.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   ]
diff --git a/tests/Duckling/Time/BG/Tests.hs b/tests/Duckling/Time/BG/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Time/BG/Tests.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.
+
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Time.BG.Tests
+  ( tests
+  ) where
+
+import Data.Aeson
+import Data.Aeson.Types ((.:), parseMaybe, withObject)
+import Data.String
+import Data.Text (Text)
+import Prelude
+import Test.Tasty
+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.BG.Corpus
+import Duckling.TimeGrain.Types (Grain(..))
+import Duckling.Types (Range(..))
+
+tests :: TestTree
+tests = testGroup "BG Tests"
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.DA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "DA Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
diff --git a/tests/Duckling/Time/DE/Tests.hs b/tests/Duckling/Time/DE/Tests.hs
--- a/tests/Duckling/Time/DE/Tests.hs
+++ b/tests/Duckling/Time/DE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.DE.Tests
@@ -24,15 +23,15 @@
 
 tests :: TestTree
 tests = testGroup "DE Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   , rangeTests
   ]
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
   mapM_ (analyzedRangeTest (testContext{locale = makeLocale DE Nothing})
-         testOptions . withTargets [This Time]) xs
+         testOptions . withTargets [Seal Time]) xs
   where
     xs = [ ("Wir treffen uns am 17 Uhr am KiLa.", Range 16 25)
          ]
diff --git a/tests/Duckling/Time/EL/Tests.hs b/tests/Duckling/Time/EL/Tests.hs
--- a/tests/Duckling/Time/EL/Tests.hs
+++ b/tests/Duckling/Time/EL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.EL.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "EL Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -16,7 +15,6 @@
 import Data.Aeson
 import Data.Aeson.Types ((.:), parseMaybe, withObject)
 import Data.String
-import Data.Text (Text)
 import Prelude
 import Test.Tasty
 import Test.Tasty.HUnit
@@ -30,6 +28,7 @@
 import Duckling.Time.EN.Corpus
 import Duckling.TimeGrain.Types (Grain(..))
 import Duckling.Types (Range(..))
+import qualified Duckling.Region as R
 import qualified Duckling.Time.EN.AU.Corpus as AU
 import qualified Duckling.Time.EN.BZ.Corpus as BZ
 import qualified Duckling.Time.EN.CA.Corpus as CA
@@ -45,71 +44,72 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Time] defaultCorpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] defaultCorpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
+  , makeCorpusTest [Seal Time] diffCorpus
   , exactSecondTests
   , valuesTest
   , intersectTests
   , rangeTests
   , localeTests
-  , makeCorpusTest [This Time] latentCorpus
+  , makeCorpusTest [Seal Time] latentCorpus
   ]
 
 localeTests :: TestTree
 localeTests = testGroup "Locale Tests"
   [ testGroup "EN_AU Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeAU AU.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeAU []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeAU AU.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeAU []
     ]
   , testGroup "EN_BZ Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeBZ BZ.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeBZ []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeBZ BZ.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeBZ []
     ]
   , testGroup "EN_CA Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeCA CA.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeCA []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeCA CA.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeCA []
     ]
   , testGroup "EN_GB Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeGB GB.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeGB []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeGB GB.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeGB []
     ]
   , testGroup "EN_IE Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeIE IE.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeIE []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeIE IE.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeIE []
     ]
   , testGroup "EN_IN Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeIN IN.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeIN []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeIN IN.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeIN []
     ]
   , testGroup "EN_JM Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeJM JM.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeJM []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeJM JM.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeJM []
     ]
   , testGroup "EN_NZ Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeNZ NZ.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeNZ []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeNZ NZ.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeNZ []
     ]
   , testGroup "EN_PH Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localePH PH.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localePH []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localePH PH.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localePH []
     ]
   , testGroup "EN_TT Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeTT TT.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeTT []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeTT TT.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeTT []
     ]
   , testGroup "EN_US Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeUS US.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeUS []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeUS US.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeUS []
     ]
   , testGroup "EN_ZA Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeZA ZA.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeZA []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeZA ZA.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeZA []
     ]
   ]
   where
     localeAU = makeLocale EN $ Just AU
     localeBZ = makeLocale EN $ Just BZ
-    localeCA = makeLocale EN $ Just CA
+    localeCA = makeLocale EN $ Just R.CA
     localeGB = makeLocale EN $ Just GB
     localeIE = makeLocale EN $ Just IE
     localeIN = makeLocale EN $ Just IN
@@ -122,7 +122,7 @@
 
 exactSecondTests :: TestTree
 exactSecondTests = testCase "Exact Second Tests" $
-  mapM_ (analyzedFirstTest context testOptions . withTargets [This Time]) xs
+  mapM_ (analyzedFirstTest context testOptions . withTargets [Seal Time]) xs
   where
     context = testContext {referenceTime = refTime (2016, 12, 6, 13, 21, 42) 1}
     xs = concat
@@ -141,12 +141,11 @@
 
 valuesTest :: TestTree
 valuesTest = testCase "Values Test" $
-  mapM_ (analyzedFirstTest testContext testOptions . withTargets [This Time]) xs
+  mapM_ (analyzedFirstTest testContext testOptions . withTargets [Seal Time]) xs
   where
     xs = examplesCustom (parserCheck 1 parseValuesSize)
                         [ "now"
                         , "8 o'clock tonight"
-                        , "tonight at 8 o'clock"
                         , "yesterday"
                         ]
     parseValuesSize :: Value -> Maybe Int
@@ -156,7 +155,7 @@
 
 intersectTests :: TestTree
 intersectTests = testCase "Intersect Test" $
-  mapM_ (analyzedNTest testContext testOptions . withTargets [This Time]) xs
+  mapM_ (analyzedNTest testContext testOptions . withTargets [Seal Time]) xs
   where
     xs = [ ("tomorrow July", 2)
          , ("Mar tonight", 2)
@@ -165,7 +164,7 @@
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
-  mapM_ (analyzedRangeTest testContext testOptions . withTargets [This Time]) xs
+  mapM_ (analyzedRangeTest testContext testOptions . withTargets [Seal Time]) xs
   where
     xs = [ ("at 615.", Range 0 6) -- make sure ruleHHMMLatent allows this
          , ("last in 2'", Range 5 10) -- ruleLastTime too eager
@@ -176,4 +175,9 @@
          , ("thirteen fifty nine a m", Range 15 23) -- ruleMilitarySpelledOutAMPM
          , ("table Wednesday for 30 people", Range 6 15)
            -- do not parse "for 30" as year intersect
+         , ("house 1 on december 2013", Range 11 24) -- ruleAbsorbOnDay
+         , ("at 6pm GMT PDT", Range 0 10) -- ruleTimezone
+         , ("at 6pm (PDT) GMT", Range 0 12) -- ruleTimezoneBracket
+         , ("6pm GMT - 8pm GMT PDT", Range 0 17)
+           -- ruleTimezone will not match because TimeData hasTimezone.
          ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.ES.Tests
@@ -19,5 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
+    , makeCorpusTest [Seal Time] latentCorpus
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.FR.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.GA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
diff --git a/tests/Duckling/Time/HE/Tests.hs b/tests/Duckling/Time/HE/Tests.hs
--- a/tests/Duckling/Time/HE/Tests.hs
+++ b/tests/Duckling/Time/HE/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Time.HE.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HE Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
diff --git a/tests/Duckling/Time/HR/Tests.hs b/tests/Duckling/Time/HR/Tests.hs
--- a/tests/Duckling/Time/HR/Tests.hs
+++ b/tests/Duckling/Time/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Time.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
diff --git a/tests/Duckling/Time/HU/Tests.hs b/tests/Duckling/Time/HU/Tests.hs
--- a/tests/Duckling/Time/HU/Tests.hs
+++ b/tests/Duckling/Time/HU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Time.HU.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HU Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.IT.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "IT Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   ]
diff --git a/tests/Duckling/Time/KA/Tests.hs b/tests/Duckling/Time/KA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Time/KA/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.
+
+
+module Duckling.Time.KA.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Time.KA.Corpus
+
+tests :: TestTree
+tests = testGroup "KA Tests"
+  [ makeCorpusTest [Seal Time] corpus
+  , makeCorpusTest [Seal Time] latentCorpus
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.NB.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NB Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   ]
diff --git a/tests/Duckling/Time/NL/Tests.hs b/tests/Duckling/Time/NL/Tests.hs
--- a/tests/Duckling/Time/NL/Tests.hs
+++ b/tests/Duckling/Time/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.NL.Tests
@@ -23,16 +22,17 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeCorpusTest [Seal Time] latentCorpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   , localeTests
   ]
 
 localeTests :: TestTree
 localeTests = testGroup "Locale Tests"
   [ testGroup "NL_BE Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeBE BE.allExamples
-    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeBE []
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeBE BE.allExamples
+    , makeNegativeCorpusTest [Seal Time] $ withLocale negativeCorpus localeBE []
     ]
   ]
   where
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.PL.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "PL Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.PT.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.RO.Tests
@@ -19,6 +18,6 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Time] corpus
-  , makeNegativeCorpusTest [This Time] negativeCorpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   ]
diff --git a/tests/Duckling/Time/RU/Tests.hs b/tests/Duckling/Time/RU/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Time/RU/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.
+
+
+module Duckling.Time.RU.Tests
+  ( tests ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Time.RU.Corpus
+
+tests :: TestTree
+tests = testGroup "RU Tests"
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal 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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -30,7 +29,7 @@
 
 tests :: TestTree
 tests = testGroup "SV Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
   , ambiguousTests
   ]
 
@@ -44,7 +43,7 @@
                   [ "i morgonen"
                   ]
     ctx = testContext {locale = makeLocale SV Nothing}
-    dims = HashSet.singleton $ This Time
+    dims = HashSet.singleton $ Seal Time
     check :: Example -> IO ()
     check (input, predicate) = case analyze input ctx testOptions dims of
       [] -> assertFailure $ "empty result on " ++ show input
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -25,6 +24,7 @@
 import Duckling.Time.Types
 import Duckling.TimeGrain.Types
 import qualified Duckling.Time.AR.Tests as AR
+import qualified Duckling.Time.BG.Tests as BG
 import qualified Duckling.Time.DA.Tests as DA
 import qualified Duckling.Time.DE.Tests as DE
 import qualified Duckling.Time.EN.Tests as EN
@@ -36,19 +36,23 @@
 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.KA.Tests as KA
 import qualified Duckling.Time.KO.Tests as KO
 import qualified Duckling.Time.NB.Tests as NB
 import qualified Duckling.Time.NL.Tests as NL
 import qualified Duckling.Time.PL.Tests as PL
 import qualified Duckling.Time.PT.Tests as PT
 import qualified Duckling.Time.RO.Tests as RO
+import qualified Duckling.Time.RU.Tests as RU
 import qualified Duckling.Time.SV.Tests as SV
+import qualified Duckling.Time.UK.Tests as UK
 import qualified Duckling.Time.VI.Tests as VI
 import qualified Duckling.Time.ZH.Tests as ZH
 
 tests :: TestTree
 tests = testGroup "Time Tests"
   [ AR.tests
+  , BG.tests
   , DA.tests
   , DE.tests
   , EL.tests
@@ -60,13 +64,16 @@
   , HE.tests
   , HU.tests
   , IT.tests
+  , KA.tests
   , KO.tests
   , NB.tests
   , NL.tests
   , PL.tests
   , PT.tests
   , RO.tests
+  , RU.tests
   , SV.tests
+  , UK.tests
   , VI.tests
   , ZH.tests
   , timeFormatTest
@@ -75,7 +82,7 @@
 
 timeFormatTest :: TestTree
 timeFormatTest = testCase "Format Test" $
-  mapM_ (analyzedFirstTest testContext testOptions . withTargets [This Time]) xs
+  mapM_ (analyzedFirstTest testContext testOptions . withTargets [Seal Time]) xs
   where
     xs = examplesCustom (parserCheck expected parseValue) ["now"]
     expected = "2013-02-12T04:30:00.000-02:00"
diff --git a/tests/Duckling/Time/UK/Tests.hs b/tests/Duckling/Time/UK/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Time/UK/Tests.hs
@@ -0,0 +1,28 @@
+-- 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.
+
+
+module Duckling.Time.UK.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+import Test.Tasty.HUnit
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Asserts
+import Duckling.Testing.Types (testContext, testOptions)
+import Duckling.Time.UK.Corpus
+import Duckling.Types (Range(..))
+
+tests :: TestTree
+tests = testGroup "UK Tests"
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
+  ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Time.VI.Tests
   ( tests ) where
@@ -18,5 +17,6 @@
 
 tests :: TestTree
 tests = testGroup "VI Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [Seal Time] corpus
+  , makeNegativeCorpusTest [Seal Time] negativeCorpus
   ]
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
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Time.ZH.Tests
@@ -26,23 +25,23 @@
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Time] defaultCorpus
+  [ makeCorpusTest [Seal Time] defaultCorpus
   , localeTests
   ]
 
 localeTests :: TestTree
 localeTests = testGroup "Locale Tests"
   [ testGroup "ZH_CN Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeCN CN.allExamples
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeCN CN.allExamples
     ]
   , testGroup "ZH_HK Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeHK HK.allExamples
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeHK HK.allExamples
     ]
   , testGroup "ZH_MO Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeMO MO.allExamples
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeMO MO.allExamples
     ]
   , testGroup "ZH_TW Tests"
-    [ makeCorpusTest [This Time] $ withLocale corpus localeTW TW.allExamples
+    [ makeCorpusTest [Seal Time] $ withLocale corpus localeTW TW.allExamples
     ]
   ]
   where
diff --git a/tests/Duckling/Url/Tests.hs b/tests/Duckling/Url/Tests.hs
--- a/tests/Duckling/Url/Tests.hs
+++ b/tests/Duckling/Url/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 {-# LANGUAGE OverloadedStrings #-}
@@ -25,14 +24,14 @@
 
 tests :: TestTree
 tests = testGroup "Url Tests"
-  [ makeCorpusTest [This Url] corpus
-  , makeNegativeCorpusTest [This Url] negativeCorpus
+  [ makeCorpusTest [Seal Url] corpus
+  , makeNegativeCorpusTest [Seal Url] negativeCorpus
   , surroundTests
   ]
 
 surroundTests :: TestTree
 surroundTests = testCase "Surround Tests" $
-  mapM_ (analyzedFirstTest testContext testOptions . withTargets [This Url]) xs
+  mapM_ (analyzedFirstTest testContext testOptions . withTargets [Seal Url]) xs
   where
     xs = examples (UrlData "www.lets-try-this-one.co.uk/episode-7" "lets-try-this-one.co.uk")
                   [ "phishing link: www.lets-try-this-one.co.uk/episode-7  If you want my job"
diff --git a/tests/Duckling/Volume/AR/Tests.hs b/tests/Duckling/Volume/AR/Tests.hs
--- a/tests/Duckling/Volume/AR/Tests.hs
+++ b/tests/Duckling/Volume/AR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.AR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "AR Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/DE/Tests.hs b/tests/Duckling/Volume/DE/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Volume/DE/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.
+
+
+module Duckling.Volume.DE.Tests
+  ( tests
+  ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Volume.DE.Corpus
+
+tests :: TestTree
+tests = testGroup "DE Tests"
+  [ makeCorpusTest [Seal Volume] corpus
+  ]
diff --git a/tests/Duckling/Volume/EN/Tests.hs b/tests/Duckling/Volume/EN/Tests.hs
--- a/tests/Duckling/Volume/EN/Tests.hs
+++ b/tests/Duckling/Volume/EN/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.EN.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/ES/Tests.hs b/tests/Duckling/Volume/ES/Tests.hs
--- a/tests/Duckling/Volume/ES/Tests.hs
+++ b/tests/Duckling/Volume/ES/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.ES.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "ES Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/FR/Tests.hs b/tests/Duckling/Volume/FR/Tests.hs
--- a/tests/Duckling/Volume/FR/Tests.hs
+++ b/tests/Duckling/Volume/FR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.FR.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "FR Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/GA/Tests.hs b/tests/Duckling/Volume/GA/Tests.hs
--- a/tests/Duckling/Volume/GA/Tests.hs
+++ b/tests/Duckling/Volume/GA/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.GA.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "GA Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/HR/Tests.hs b/tests/Duckling/Volume/HR/Tests.hs
--- a/tests/Duckling/Volume/HR/Tests.hs
+++ b/tests/Duckling/Volume/HR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Volume.HR.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "HR Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/IT/Tests.hs b/tests/Duckling/Volume/IT/Tests.hs
--- a/tests/Duckling/Volume/IT/Tests.hs
+++ b/tests/Duckling/Volume/IT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 module Duckling.Volume.IT.Tests
   ( tests ) where
@@ -18,5 +17,5 @@
 
 tests :: TestTree
 tests = testGroup "IT Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/KM/Tests.hs b/tests/Duckling/Volume/KM/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Volume/KM/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.
+
+
+module Duckling.Volume.KM.Tests
+  ( tests
+  ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Volume.KM.Corpus
+
+tests :: TestTree
+tests = testGroup "KM Tests"
+  [ makeCorpusTest [Seal Volume] corpus
+  ]
diff --git a/tests/Duckling/Volume/KO/Tests.hs b/tests/Duckling/Volume/KO/Tests.hs
--- a/tests/Duckling/Volume/KO/Tests.hs
+++ b/tests/Duckling/Volume/KO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.KO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "KO Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/MN/Tests.hs b/tests/Duckling/Volume/MN/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Volume/MN/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.
+
+
+module Duckling.Volume.MN.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Volume.MN.Corpus
+
+tests :: TestTree
+tests = testGroup "MN Tests"
+  [ makeCorpusTest [Seal Volume] corpus
+  ]
diff --git a/tests/Duckling/Volume/NL/Tests.hs b/tests/Duckling/Volume/NL/Tests.hs
--- a/tests/Duckling/Volume/NL/Tests.hs
+++ b/tests/Duckling/Volume/NL/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.NL.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "NL Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/PT/Tests.hs b/tests/Duckling/Volume/PT/Tests.hs
--- a/tests/Duckling/Volume/PT/Tests.hs
+++ b/tests/Duckling/Volume/PT/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.PT.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "PT Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/RO/Tests.hs b/tests/Duckling/Volume/RO/Tests.hs
--- a/tests/Duckling/Volume/RO/Tests.hs
+++ b/tests/Duckling/Volume/RO/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.RO.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RO Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/RU/Tests.hs b/tests/Duckling/Volume/RU/Tests.hs
--- a/tests/Duckling/Volume/RU/Tests.hs
+++ b/tests/Duckling/Volume/RU/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.RU.Tests
@@ -19,5 +18,5 @@
 
 tests :: TestTree
 tests = testGroup "RU Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/TR/Tests.hs b/tests/Duckling/Volume/TR/Tests.hs
--- a/tests/Duckling/Volume/TR/Tests.hs
+++ b/tests/Duckling/Volume/TR/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.TR.Tests
@@ -20,5 +19,5 @@
 
 tests :: TestTree
 tests = testGroup "TR Tests"
-  [ makeCorpusTest [This Volume] corpus
+  [ makeCorpusTest [Seal Volume] corpus
   ]
diff --git a/tests/Duckling/Volume/Tests.hs b/tests/Duckling/Volume/Tests.hs
--- a/tests/Duckling/Volume/Tests.hs
+++ b/tests/Duckling/Volume/Tests.hs
@@ -2,8 +2,7 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
 
 module Duckling.Volume.Tests
@@ -15,32 +14,40 @@
 import Test.Tasty
 
 import qualified Duckling.Volume.AR.Tests as AR
+import qualified Duckling.Volume.DE.Tests as DE
 import qualified Duckling.Volume.EN.Tests as EN
 import qualified Duckling.Volume.ES.Tests as ES
 import qualified Duckling.Volume.FR.Tests as FR
 import qualified Duckling.Volume.GA.Tests as GA
 import qualified Duckling.Volume.HR.Tests as HR
 import qualified Duckling.Volume.IT.Tests as IT
+import qualified Duckling.Volume.KM.Tests as KM
 import qualified Duckling.Volume.KO.Tests as KO
+import qualified Duckling.Volume.MN.Tests as MN
 import qualified Duckling.Volume.NL.Tests as NL
 import qualified Duckling.Volume.PT.Tests as PT
 import qualified Duckling.Volume.RO.Tests as RO
 import qualified Duckling.Volume.RU.Tests as RU
 import qualified Duckling.Volume.TR.Tests as TR
+import qualified Duckling.Volume.ZH.Tests as ZH
 
 tests :: TestTree
 tests = testGroup "Volume Tests"
   [ AR.tests
+  , DE.tests
   , EN.tests
   , ES.tests
   , FR.tests
   , GA.tests
   , HR.tests
   , IT.tests
+  , KM.tests
   , KO.tests
+  , MN.tests
   , NL.tests
   , PT.tests
   , RO.tests
   , RU.tests
   , TR.tests
+  , ZH.tests
   ]
diff --git a/tests/Duckling/Volume/ZH/Tests.hs b/tests/Duckling/Volume/ZH/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Volume/ZH/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.Volume.ZH.Tests
+  ( tests ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Volume.ZH.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ZH Tests"
+  [ makeCorpusTest [Seal Volume] corpus
+  ]
diff --git a/tests/TestMain.hs b/tests/TestMain.hs
--- a/tests/TestMain.hs
+++ b/tests/TestMain.hs
@@ -2,9 +2,9 @@
 -- 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.
+-- LICENSE file in the root directory of this source tree.
 
+module Main where
 
 import Data.String
 import Test.Tasty
