</> Cómo funciona
Función pura del español.
| parámetro | tipo | por defecto | qué hace |
|---|---|---|---|
palabra | string | — (obligatorio) | la palabra en singular |
commons/pluralizador.py → pluralizar() y las reglas _regla_*.-y que hacen -es.upln) para monosílabos, palabras en -y y reajustar la tilde.-y → -z → -s/-x → consonante → vocal.flowchart TD
MOD[("repositorio")]
_two_last["_two_last()"]
_regla_excepciones["_regla_excepciones()"]
_regla_compuesta["_regla_compuesta()"]
_regla_monosilabo["_regla_monosilabo()"]
_regla_termina_y["_regla_termina_y()"]
_regla_termina_z["_regla_termina_z()"]
_regla_termina_s_x["_regla_termina_s_x()"]
_regla_general_consonante["_regla_general_consonante()"]
_regla_general["_regla_general()"]
pluralizar["pluralizar()"]
_regla_compuesta --> pluralizar
_regla_general_consonante --> _two_last
_two_last -. datos .-> MOD
_regla_excepciones -. datos .-> MOD
_regla_monosilabo -. datos .-> MOD
_regla_termina_y -. datos .-> MOD
_regla_termina_z -. datos .-> MOD
_regla_termina_s_x -. datos .-> MOD
_regla_general -. datos .-> MOD
pluralizar -. datos .-> MOD
classDef red fill:#fde7f0,stroke:#c0397b,color:#7a1e4d;
class MOD red;# -*- coding: utf-8 -*-
"""
pluralizador.py — pasa una palabra de singular a plural.
Orden de reglas: excepciones → compuesta(-) → monosílabo → termina Y → termina Z
→ termina S/X → consonante general → general (vocal). Usa el silabeador/acentuador (upln).
"""
import json
import os
import upln
# […carga de excepciones de plural (repositorio léxico, interno)…]
_MONO_CONS_EXC = set("c,g,f,j,k,p,t,b,v,m,h,ll,w".split(","))
_PALABRAS_Y_ES = set("rey,ley,buey,virrey,matabuey,pejerrey".split(","))
_VOCALES = set("aeiou")
_VOC_ACENT = set("áéíóú")
def _two_last(s):
return s[-2:] if len(s) >= 2 else s
def _regla_excepciones(palabra):
return _EXC.get(palabra)
def _regla_compuesta(palabra):
partes = palabra.split("-")
if len(partes) <= 1:
return None
if len(partes) == 2:
opts = []
for pl in pluralizar(partes[0]).split(","):
opts.append(f"{pl}-{partes[1]}")
res = ",".join(opts)
for pl in pluralizar(partes[1]).split(","):
res += f",{partes[0]}-{pl}"
return res
else:
res = f"{pluralizar(partes[0])}-{partes[1]}-{partes[2]}"
res += f",{partes[0]}-{pluralizar(partes[1])}-{partes[2]}"
return res
def _regla_monosilabo(palabra):
sil = upln.silabear(palabra)
if upln.numero_silabas(sil) != 1:
return None
ult = upln.get_last_letter(palabra).lower()
if ult in _MONO_CONS_EXC:
return palabra + "s"
if upln._compara("e", ult): # e / é
return palabra + "s"
if ult == "i" and upln.get_num_vocales(palabra) == 1:
return upln.remplace_last("i", "íes", palabra)
if ult == "i":
return palabra + "s"
if ult == "u" and upln.get_num_vocales(palabra) == 1:
return upln.remplace_last("u", "úes", palabra)
if ult == "u":
return palabra + "s"
if ult == "z":
return upln.remplace_last("z", "ces", palabra)
return palabra + "es"
def _regla_termina_y(palabra):
if palabra.lower() in _PALABRAS_Y_ES:
return palabra.lower() + "es"
if upln.get_last_letter(palabra).lower() == "y":
sil = upln.silabear(palabra)
silsin = upln.desacentuar_palabra(sil)
pos = upln.int_silaba_tonica(sil)
opts = []
opts.append(upln.acentuar_silabeada(upln.remplace_last("y", "is", silsin), pos))
opts.append(upln.acentuar_silabeada(upln.remplace_last("y", "i" + upln.SEPARADOR + "es", silsin), pos + 1))
opts.append(upln.acentuar_silabeada(silsin + "s", pos))
opts.append(upln.acentuar_silabeada(upln.remplace_last("y", upln.SEPARADOR + "yes", silsin), pos + 1))
return ",".join(opts)
return None
def _regla_termina_z(palabra):
if upln.get_last_letter(palabra).lower() == "z":
return palabra[:-1] + "ces"
return None
def _regla_termina_s_x(palabra):
ult = upln.get_last_letter(palabra).lower()
sil = upln.silabear(palabra)
ns = upln.numero_silabas(sil)
if ult in ("s", "x") and ns >= 2 and upln.int_silaba_tonica(sil) != 1:
return palabra # invariable: crisis, lunes, tórax
elif ult in ("s", "x"):
pos = upln.int_silaba_tonica(upln.silabear(palabra))
aux = upln.silabear(palabra + "es")
p2 = upln.desacentuar_palabra(aux)
return upln.acentuar_silabeada(p2, pos + 1)
return None
def _regla_general_consonante(palabra):
sil = upln.silabear(palabra)
pos = upln.int_silaba_tonica(sil)
sil = upln.desacentuar_palabra(sil)
ult = upln.get_last_letter(palabra).lower()
dos = _two_last(sil)
if ult not in _VOCALES and ult not in _VOC_ACENT:
if ult in _MONO_CONS_EXC:
if dos.lower() == "ch":
plural = upln.remplace_last(dos, upln.SEPARADOR + dos + "es", sil)
pos += 1
else:
plural = sil + "s"
else:
plural = upln.remplace_last(ult, upln.SEPARADOR + ult + "es", sil)
pos += 1
return upln.acentuar_silabeada(plural, pos)
return None
def _regla_general(palabra):
ult = upln.get_last_letter(palabra)
if ult in _VOCALES or ult in ("á", "é", "ó"):
return palabra + "s"
if ult in ("í", "ú"):
return palabra + "s," + palabra + "es"
return None
def pluralizar(palabra):
"""Devuelve el plural de `palabra` (puede dar varias opciones separadas por coma)."""
if palabra is None:
return None
palabra = palabra.strip()
if palabra == "":
return ""
for regla in (_regla_excepciones, _regla_compuesta, _regla_monosilabo,
_regla_termina_y, _regla_termina_z, _regla_termina_s_x,
_regla_general_consonante, _regla_general):
r = regla(palabra)
if r is not None:
return r
return None
if __name__ == "__main__":
# […pruebas del módulo (casos de ejemplo y comprobación)…]
Llámala con el código a la vista.
curl "https://api.wordkers.com/v1/pluralizar" \
-H "X-API-Key: TU_CLAVE"