legal-expand1.6.0

Referencia de configuración

Configurar legal-expand

Todo lo que puedes ajustar en el paquete: opciones de expansión, formatos, configuración global, enriquecimiento del BOE y EUR-Lex, diccionarios propios y la CLI. Cero dependencias en tiempo de ejecución, type hints completos y compatible con Python 3.9 o superior.

Introducción

Instala el paquete desde PyPI:

pip install legal-expand

La expansión básica no necesita configuración: expandir_siglas(texto) devuelve el texto con cada sigla seguida de su significado entre paréntesis. A partir de ahí, cada función acepta un objeto de opciones para ajustar su comportamiento.

from legal_expand import expandir_siglas, ExpansionOptions

expandir_siglas('La AEAT revisa el IVA.')
# 'La AEAT (Agencia Estatal de Administración Tributaria) revisa el IVA (Impuesto sobre el Valor Añadido).'

Expansión de siglas

ExpansionOptions controla cómo se expanden las siglas. Se pasa como segundo argumento aexpandir_siglas() y funciones relacionadas.

OpciónTipoDefectoDescripción
format'plain' | 'html' | 'structured''plain'Formato de salida: texto con la expansión entre paréntesis, HTML semántico con <abbr>, o salida estructurada con posiciones y estadísticas.
force_expansionbool | NoneNoneFuerza (True) o desactiva (False) la expansión para esta llamada, por encima de la configuración global. None respeta la global.
preserve_caseboolTrueMantiene mayúsculas/minúsculas de la variante detectada (AEAT, aeat, A.E.A.T.).
expand_only_firstboolFalseExpande solo la primera aparición de cada sigla; las siguientes se dejan intactas.
excludelist[str][]Siglas que nunca se expanden (por ejemplo, ["BOE"]).
includelist[str] | NoneNoneSiglas que se expanden incluso si son palabras funcionales ("LA", "LO") normalmente omitidas.
auto_resolve_duplicatesboolFalseResuelve automáticamente siglas con varios significados usando el contexto y la prioridad.
duplicate_resolutiondict[str, str]{}Mapa manual sigla → significado para forzar la resolución de ambigüedades concretas.
custom_dictionarieslist[str][]Rutas a diccionarios propios (.json o .csv) que se añaden al base.
from legal_expand import expandir_siglas, ExpansionOptions

opts = ExpansionOptions(expand_only_first=True, exclude=['BOE'])
expandir_siglas('AEAT y BOE. AEAT otra vez.', opts)

Formatos de salida

El campo format de ExpansionOptions admite tres valores:

  • 'plain' — texto con la expansión entre paréntesis (por defecto).
  • 'html' — HTML semántico con etiquetas <abbr> y tooltips; el texto se escapa siempre.
  • 'structured' — objeto con el texto expandido, la lista de siglas (con posiciones) y estadísticas.
html = expandir_siglas('La AEAT publica el IVA.', ExpansionOptions(format='html'))
datos = expandir_siglas('La AEAT publica el IVA.', ExpansionOptions(format='structured'))
datos.stats.total_acronyms_found  # 2

Configuración global

configurar_globalmente(GlobalConfig(...)) fija opciones por defecto para toda la aplicación, sin repetirlas en cada llamada. Recuerda resetear con resetear_configuracion() al terminar.

OpciónTipoDefectoDescripción
enabledboolTrueActiva o desactiva la expansión en toda la aplicación.
default_optionsExpansionOptions | NoneNoneOpciones por defecto que se aplican cuando una llamada no las especifica.
from legal_expand import configurar_globalmente, resetear_configuracion, GlobalConfig, ExpansionOptions

configurar_globalmente(GlobalConfig(
    default_options=ExpansionOptions(format='html', expand_only_first=True),
))
# ... tu aplicación ...
resetear_configuracion()

Enriquecimiento BOE y EUR-Lex

enriquecer_boe(texto, BOEOptions(...)) detecta referencias normativas, enlaza cada norma (BOE para España, EUR-Lex para la UE) y, en modo online, descarga el texto íntegro del artículo citado. Es determinista: ante una cita ambigua no inventa, la marca para revisión.

Modos

  • 'offline' — no consulta red. Resuelve normas por alias curados y por el índice del catálogo, y la normativa UE a su página de EUR-Lex por número CELEX.
  • 'online' — además descarga el texto íntegro de los artículos (BOE y EUR-Lex).
  • 'cache-first' — usa la caché local y solo va a la red cuando falta.
OpciónTipoDefectoDescripción
mode'offline' | 'cache-first' | 'online''offline'offline no consulta red; online descarga el texto de los artículos; cache-first usa la caché y solo va a la red si falta.
include_unit_textboolTrueSi es True y el modo consulta red, inserta el texto íntegro del artículo o anexo citado.
use_boe_indexboolTrueResuelve cualquier norma española por su rango y número usando el índice local del catálogo consolidado (10.555 normas).
use_curated_aliasesboolTrueUsa los alias curados (LEC, CC, LECrim, Constitución…) además del índice.
infer_single_active_normboolTrueSi en un párrafo hay una sola norma inequívoca, asocia a ella las unidades citadas sin norma explícita.
timeout_secondsfloat4.0Tiempo máximo por petición a las fuentes oficiales.
max_resultsint5Máximo de candidatos a considerar al resolver una referencia.
max_retriesint2Reintentos ante errores de red transitorios.
retry_backoff_secondsfloat0.5Espera base entre reintentos (crece de forma progresiva).
cache_pathstr | NoneNoneCarpeta de caché para las respuestas de BOE/EUR-Lex (modos cache-first y online).
cache_ttl_daysint30Días que se considera válida una respuesta cacheada.
overrides_pathstr | NoneNoneRuta a un JSON de referencias manuales para corregir ambigüedades sin tocar el código.
from legal_expand import enriquecer_boe, BOEOptions

informe = enriquecer_boe(
    'El art. 14 de la Ley 39/2015 y el art. 6 del RGPD.',
    BOEOptions(mode='online', include_unit_text=True),
)
for ref in informe.references:
    print(ref.status, ref.original_text)

Diccionarios personalizados

Añade siglas propias sin tocar el diccionario base pasando rutas en custom_dictionaries. Se admite JSON (lista de entradas o un objeto con entries) y CSV con las mismas columnas. Cada entrada necesita al menos la sigla y su significado; el resto es opcional.

CampoAlias admitidosDescripción
originalsigla, acronymLa sigla (obligatorio).
significadomeaning, expansionEl significado completo (obligatorio).
variantsVariantes adicionales; lista o valores separados por coma/punto y coma.
context_keywordskeywordsPalabras de contexto para desambiguar significados.
priorityPrioridad al resolver conflictos (por defecto 100).
sourceOrigen de la entrada (informativo).
[
  {"original": "LXP", "significado": "Legal Expand Python", "variants": ["L.X.P."], "priority": 200}
]
from legal_expand import expandir_siglas, ExpansionOptions

opts = ExpansionOptions(custom_dictionaries=['mis_siglas.json'])
expandir_siglas('LXP junto a AEAT.', opts)

Interfaz de línea de comandos

Al instalar el paquete queda disponible el comando legal-expand:

SubcomandoQué hace
legal-expand expandExpande un archivo o la entrada estándar (stdin).
legal-expand auditAudita un texto sin modificarlo: conocidas, desconocidas, omitidas, repetidas.
legal-expand glossaryExporta el glosario de siglas de un texto (Markdown, CSV o JSON).
legal-expand batchProcesa una carpeta completa de forma recursiva (.txt, .md, .html).
legal-expand boeDetecta y enlaza referencias del BOE y EUR-Lex; con --mode online trae el articulado.
legal-expand infoMuestra la metadata del diccionario (número de siglas, versión, fuentes).
legal-expand benchmarkMide el rendimiento de expansión sobre un texto.

Ejemplos

# Expandir un documento a HTML
legal-expand expand documento.txt --format html --output salida.html

# Auditar sin modificar el texto
legal-expand audit escrito.txt --report-format markdown

# BOE/EUR-Lex con el texto íntegro de los artículos
legal-expand boe escrito.txt --mode online --report-format markdown

# Procesar una carpeta completa
legal-expand batch ./entrada ./salida --format html

Los flags --include/--exclude aceptan listas separadas por comas y se pueden repetir. El subcomando boe admite --mode, --overrides, --cache-path y--no-unit-text, entre otros; consulta legal-expand boe --help.

← Volver a la página principal