</> Cómo funciona
Esta página documenta el módulo que da servicio a estos endpoints:
/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/traduccionDefinición(es) de una palabra en el diccionario semántico, con tipo, ejemplo e imagen. Lematiza la palabra antes de buscar.
commons/diccionario.py — un solo módulo con la búsqueda base _mvs() y las funciones de cada endpoint (definición, ejemplo, relacionadas, colocaciones, traducción, audio, registros, refranes)._mvs() y encima aplican su especialidad. Por eso son una sola página.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;# -*- 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()]}
Llámala con el código a la vista.
curl "https://api.wordkers.com/v1/diccionario/definicion?palabra=casa" \
-H "X-API-Key: TU_CLAVE"