Source code for alex.components.nlg.tools.en

#!/usr/bin/env python
# coding=utf-8
#

"""
A collection of helper functions for generating English.
"""

from __future__ import unicode_literals

__author__ = "Martin Vejman"
__date__ = "2014"

_NUMBERS = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five',
            6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten',
            11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen',
            15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen',
            19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty',
            50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty',
            90: 'ninety', 100: 'hundred', 200: 'two hundred', 300: 'three hundred',
            400: 'four hundred', 500: 'five hundred', 600: 'six hundred', 700: 'seven hundred',
            800: 'eight hundred', 900: 'nine hundred', 1000: 'one thousand', 2000: 'two thousand',
            3000: 'three thousand', 4000: 'four thousand', 5000: 'five thousand',
            6000: 'six thousand', 7000: 'seven thousand', 8000: 'eight thousand', 9000: 'nine thousand'
}
_NUMBERS_ORD = {0:"zero", 1:"first", 2: "second", 3: "third", 4: "fourth", 5: "fifth", 6: "sixth",
                # nultý - zero/prime?
                7: "seventh", 8: "eighth", 9: "ninth", 10: "tenth", 11: "eleventh", 12: "twelfth",
                13: "thirteenth", 14: "fourteenth", 15: "fifteenth", 16: "sixteenth", 17: "seventeenth",
                18: "eighteenth", 19: "nineteenth", 20: "twentieth", 30: "thirtieth", 40: "fortieth",
                50: "fiftieth", 60: "sixtieth", 70: "seventieth", 80: "eightieth", 90: "ninetieth",
                100: "hundredth", 200: "two hundredth", 300:"three hundredth", 400:"four hundredth",
                500: 'five hundredth', 600: 'six hundredth', 700: 'seven hundredth',800: 'eight hundredth',
                900: 'nine hundredth', 1000: 'one thousandth',
}


[docs]def word_for_number(number, ordinary = False): """\ Returns a word given a number 1-100 """ # > 1000: composed of thousands if number > 1000 and number % 1000 != 0: return ' '.join((word_for_number((number / 1000) * 1000), word_for_number(number % 1000, ordinary))) # > 100: composed of hundreds if number > 100 and number % 100 != 0: return ' '.join((word_for_number((number / 100) * 100), word_for_number(number % 100, ordinary))) # > 20: composed of tens and ones if number > 20 and number % 10 != 0: return ' '.join((word_for_number((number / 10) * 10), word_for_number(number % 10, ordinary))) if ordinary: return _NUMBERS_ORD[number] else: return _NUMBERS[number]
[docs]def every_word_for_number(number, ordinary = False, use_coupling = False): """ params: ordinary - if set to True, it returns ordinal of the number (fifth rather than five etc). use_coupling if set to True, it returns number greater than 100 with "and" between hundreds and tens (two hundred and seventeen rather than two hundred seventeen). Returns a word given a number 1-100 """ # > 1000: composed of thousands if number > 1000 and number % 1000 != 0: return ' '.join((every_word_for_number((number / 1000) * 1000), every_word_for_number(number % 1000, ordinary))) # > 100: composed of hunderds if number > 100 and number % 100 != 0: joiner = use_coupling and " and " or " " return joiner.join((every_word_for_number((number / 100) * 100), every_word_for_number(number % 100, ordinary))) # > 20: composed of tens and ones if number > 20 and number % 10 != 0: return ' '.join((every_word_for_number((number / 10) * 10), every_word_for_number(number % 10, ordinary))) return ordinary and _NUMBERS_ORD[number] or _NUMBERS[number]