</> Cómo funciona

pluralizar

GET
/v1/pluralizar

Función pura del español.

Parámetros

parámetrotipopor defectoqué hace
palabrastring— (obligatorio)la palabra en singular

Cómo funciona (por dentro)

Mapa de funciones

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;

El código

# -*- 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)…]

Pruébalo

Llámala con el código a la vista.

Ejemplos con el SDK

curl "https://api.wordkers.com/v1/pluralizar" \
  -H "X-API-Key: TU_CLAVE"

Cómo empezar con el SDK →

¿Quieres que cambie algo, o copiar la lógica para lo tuyo? Sin problema — escríbeme. Lo que ves es el algoritmo; los datos y las claves se quedan en casa.

Wordkers · Catálogo · Empezar · Tu cuenta