diff options
Diffstat (limited to 'scripts/numspell.py')
| -rw-r--r-- | scripts/numspell.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/scripts/numspell.py b/scripts/numspell.py new file mode 100644 index 0000000..2e416e3 --- /dev/null +++ b/scripts/numspell.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +"""Pasa los numeros de una transcripcion a palabras, para poder compararla +con el guion (que escribe todo en letras).""" +import re + +U = ["cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", + "diez", "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", + "dieciocho", "diecinueve", "veinte", "veintiuno", "veintidos", "veintitres", + "veinticuatro", "veinticinco", "veintiseis", "veintisiete", "veintiocho", "veintinueve"] +D = {3: "treinta", 4: "cuarenta", 5: "cincuenta", 6: "sesenta", + 7: "setenta", 8: "ochenta", 9: "noventa"} +C = {1: "ciento", 2: "doscientos", 3: "trescientos", 4: "cuatrocientos", 5: "quinientos", + 6: "seiscientos", 7: "setecientos", 8: "ochocientos", 9: "novecientos"} + + +def _lt1000(n): + if n < 30: + return U[n] + if n < 100: + d, u = divmod(n, 10) + return D[d] + (" y " + U[u] if u else "") + if n == 100: + return "cien" + c, r = divmod(n, 100) + return C[c] + (" " + _lt1000(r) if r else "") + + +def spell_int(n): + if n < 1000: + return _lt1000(n) + if n < 1000000: + m, r = divmod(n, 1000) + pre = "mil" if m == 1 else _lt1000(m) + " mil" + return pre + (" " + _lt1000(r) if r else "") + m, r = divmod(n, 1000000) + pre = "un millon" if m == 1 else _lt1000(m) + " millones" + return pre + (" " + spell_int(r) if r else "") + + +def _tok(m): + s = m.group(0) + s = re.sub(r"\.(?=\d{3}\b)", "", s) # 384.000 -> 384000 + if "," in s: + a, b = s.split(",", 1) + ent = spell_int(int(a or 0)) + dec = " ".join(U[int(c)] for c in b if c.isdigit()) + return f"{ent} coma {dec}" + if "." in s: # 0.5 estilo ingles + a, b = s.split(".", 1) + return f"{spell_int(int(a or 0))} coma " + " ".join(U[int(c)] for c in b if c.isdigit()) + return spell_int(int(s)) + + +def expand(text): + t = text.replace("%", " por ciento ").replace("º", "") + t = re.sub(r"\d+(?:[.,]\d+)*", _tok, t) + return re.sub(r"\s+", " ", t).strip() |