</> Cómo funciona

Diccionario semántico

Esta página documenta el módulo que da servicio a estos endpoints:

1Audio de pronunciación/v1/diccionario/audio1Colocaciones/v1/diccionario/colocaciones1Definición (diccionario semántico)/v1/diccionario/definicion1Ejemplos de uso/v1/diccionario/ejemplo1Refranes que contienen la palabra (cruce con refranario)/v1/diccionario/refranes1Clasificar palabras de una frase (auxiliar)/v1/diccionario/registros1Palabras relacionadas (campo semántico)/v1/diccionario/relacionadas1Traducción/v1/diccionario/traduccion

Definición(es) de una palabra en el diccionario semántico, con tipo, ejemplo e imagen. Lematiza la palabra antes de buscar.

Cómo funciona (por dentro)

Mapa de funciones

flowchart TD
  MOD[("repositorio")]
  _media_url["_media_url()"]
  _mvs["_mvs()"]
  definicion["definicion()"]
  ejemplo["ejemplo()"]
  relacionadas["relacionadas()"]
  colocaciones["colocaciones()"]
  traduccion["traduccion()"]
  audio["audio()"]
  _quitar_puntuacion["_quitar_puntuacion()"]
  registros["registros()"]
  refranes["refranes()"]
  audio --> _media_url
  audio --> _mvs
  colocaciones --> _mvs
  definicion --> _media_url
  definicion --> _mvs
  ejemplo --> _mvs
  registros --> _quitar_puntuacion
  relacionadas --> _mvs
  traduccion --> _mvs
  _media_url -. datos .-> MOD
  _mvs -. datos .-> MOD
  _quitar_puntuacion -. datos .-> MOD
  refranes -. datos .-> MOD
  classDef red fill:#fde7f0,stroke:#c0397b,color:#7a1e4d;
  class MOD red;

El código

# -*- coding: utf-8 -*-
"""diccionario.py — diccionario semántico: una red de asociación de palabras.

Toda consulta LEMATIZA primero la palabra y busca por el LEMA (no por la forma
concreta), sobre la unidad léxica y sus explicaciones. Se apoya en el Índice de
Contiguidad (palabras del mismo campo semántico están "cerca").

Un solo módulo da servicio a varios endpoints del diccionario: definición, ejemplo,
palabras relacionadas, colocaciones, traducción, audio, clasificación de una frase
y el cruce con los refranes. Todos comparten la misma búsqueda base por lema.
"""

import urllib.parse as _url

_IMG_BASE = "https://diccionario.wordkers.es/media/img/"
_AUDIO_BASE = "https://diccionario.wordkers.es/audio/"

# […consultas al repositorio del diccionario + tabla de idiomas (esquema interno)…]


def _media_url(base, fichero):
    # arma la URL pública del recurso (imagen/audio); None si no hay fichero
    return (base + _url.quote(fichero)) if fichero else None


def _mvs(cur, palabra):
    """Búsqueda BASE: filas unidad+explicación de la palabra (ya lematizada).
    Todas las funciones de abajo parten de aquí."""
    cur.execute(_SQL_MV, (palabra, palabra))
    return cur.fetchall()


def definicion(cur, palabra):
    """Definición(es) con tipo, ejemplo e imagen."""
    rows = _mvs(cur, palabra)
    return {"palabra": palabra, "encontrado": bool(rows), "definiciones": [
        {"lema": r[2], "tipo": r[4], "definicion": r[3], "ejemplo": r[6],
         "imagen": _media_url(_IMG_BASE, r[7])} for r in rows]}


def ejemplo(cur, palabra):
    """Ejemplos de uso (los que tengan ejemplo en su explicación)."""
    rows = _mvs(cur, palabra)
    return {"palabra": palabra, "encontrado": bool(rows),
            "ejemplos": [{"lema": r[2], "ejemplo": r[6]} for r in rows if r[6]]}


def relacionadas(cur, palabra):
    """Palabras relacionadas = las del MISMO campo semántico (mismo subtipo).
    Es el mecanismo del Índice de Contiguidad."""
    rows = _mvs(cur, palabra)
    out = []
    for r in rows:
        rel = []
        if r[5] is not None:                       # r[5] = subtipo (campo semántico)
            cur.execute(_SQL_RELACIONADAS, (r[5], r[2]))
            rel = [x[0] for x in cur.fetchall()]
        out.append({"lema": r[2], "relacionadas": rel})
    return {"palabra": palabra, "encontrado": bool(rows), "resultados": out}


def colocaciones(cur, palabra):
    """Colocaciones (palabras que suelen ir juntas) de cada acepción."""
    rows = _mvs(cur, palabra)
    out = []
    for r in rows:
        cur.execute(_SQL_COLOCACIONES, (r[0],))    # r[0] = id de la explicación
        out.append({"lema": r[2], "colocaciones": [x[0] for x in cur.fetchall()]})
    return {"palabra": palabra, "encontrado": bool(rows), "resultados": out}


def traduccion(cur, palabra, idioma):
    """Traducciones a un idioma (en/de/fr/pt/it)."""
    idi = _IDIOMAS.get((idioma or "").lower())     # None si el idioma no está soportado
    rows = _mvs(cur, palabra)
    out = []
    if idi:
        for r in rows:
            cur.execute(_SQL_TRADUCCION, (r[0], idi))
            for t in cur.fetchall():
                out.append({"lema": r[2], "traduccion": t[0], "similitud": t[1], "matiz": t[2]})
    return {"palabra": palabra, "idioma": idioma, "idioma_valido": idi is not None,
            "encontrado": bool(out), "traducciones": out}


def audio(cur, palabra):
    """URL del audio de pronunciación de cada acepción (puede venir vacío)."""
    rows = _mvs(cur, palabra)
    out = []
    for r in rows:
        cur.execute(_SQL_AUDIO, (r[1],))           # r[1] = id de la unidad
        a = cur.fetchone()
        out.append({"lema": r[2], "audio": _media_url(_AUDIO_BASE, a[0]) if a else None})
    return {"palabra": palabra, "encontrado": bool(rows), "resultados": out}


def _quitar_puntuacion(frase):
    import re
    return re.sub(r"[^0-9A-Za-zÁÉÍÓÚÜÑáéíóúüñ\s]", " ", frase or "")


def registros(cur, frase, modo="clasificar"):
    """Auxiliar: clasifica cada palabra de una frase según tenga o no entrada en el
    diccionario. `modo`: clasificar (todas, con su estado) / validos / invalidos."""
    out = []
    for p in _quitar_puntuacion(frase).split():
        cur.execute(_SQL_REG_LEMAS, (p,))
        lemas = [x[0] for x in cur.fetchall()] or [p]
        registrado_alguno = False
        for lema in lemas:
            cur.execute(_SQL_REG_CHECK, (lema,))
            reg = cur.fetchone() is not None
            registrado_alguno = registrado_alguno or reg
            if modo == "clasificar":
                out.append({"entrada": p, "registro": lema, "registrado": reg})
            elif modo == "validos" and reg:
                out.append({"entrada": p, "registro": lema, "registrado": True})
        if modo == "invalidos" and not registrado_alguno:
            out.append({"entrada": p, "registrado": False})
    return {"frase": frase, "modo": modo, "resultados": out}


def refranes(cur, palabra):
    """CRUCE diccionario → refranero: refranes que contienen la palabra (por su lema).
    Es el puente hacia el grafo: una palabra y los refranes donde aparece."""
    cur.execute(_SQL_REFRANES, (palabra,))
    return {"palabra": palabra,
            "refranes": [{"id": x[0], "refran": x[1], "significado": x[2]} for x in cur.fetchall()]}

Pruébalo

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

Ejemplos con el SDK

curl "https://api.wordkers.com/v1/diccionario/definicion?palabra=casa" \
  -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