Files
fn_registry/python/functions/datascience/translate_es_to_en.md
T
egutierrez faac610745 feat: extraccion masiva footprint_aurgi (41 funcs + 4 types + stack Docker geo)
Extrae al registry funciones del proyecto interno footprint_aurgi:
- core (6): slugify_ascii, normalize_for_join, cp_provincia_es, infer_provincia_from_cp, safe_read_csv_fallback, csv_to_parquet_duckdb
- geo puras (7): haversine_km, point_in_ring, point_in_polygon, point_in_polygons_bbox, polygon_bbox, extent_with_padding, distance_bucket
- geo I/O (4): load_geojson_polygons, load_boundary_gdf, add_basemap_osm, add_basemap_with_timeout
- valhalla client (4): valhalla_route, valhalla_isochrone, valhalla_isochrones_async, valhalla_matrix_1_to_n
- datascience stats (7): trimmed_mean, geometric_mean, detect_distribution_type, best_central_tendency, summary_stats, kde_density_levels, alpha_shape_concave_hull
- datascience fuzzy (3): fuzzy_merge_adaptive (rapidfuzz), words_to_dataset, remove_words_from_column
- datascience viz (2): plot_kde_2d, plot_heatmap_log
- infra (4): compress_pdf_ghostscript, render_table_page_pdfpages, add_header_logo, osm2pgsql_ingest
- pipelines (4): setup_geo_stack_docker, compute_centers_reachability, generate_isochrones_by_zone, count_points_per_zone
- types geo (4): LonLat, BBox, IsochroneRequest, Centro

Incluye:
- apps/footprint_geo_stack/ (PostGIS + Martin + Valhalla via docker-compose)
- 131/132 tests pasan (1 skip esperado: osm2pgsql en PATH)
- Issue tracker dev/issues/0052-footprint-aurgi-extraction.md
- Atribucion uniforme: source_repo internal:footprint_aurgi, source_license internal-aurgi
- Build con 9 agentes en paralelo (8 wave 1 + 1 wave 2 pipelines)

Tambien commitea trabajo previo no commiteado: aggregate_extraction_results, chunk_with_overlap, clean_pdf_text, merge_entity_aliases, extract_graph_gliner2, extract_relations_mrebel, extract_triples_spacy_es, gliner2/mrebel/marianmt/rebel/spacy_es load_model, parse_rebel_output, translate_es_to_en, issue 0050/0051.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 23:35:22 +02:00

3.5 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path, notes
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path notes
translate_es_to_en function py datascience 1.0.0 impure def translate_es_to_en(text: str, tokenizer: Any, model: Any, max_length: int = 512, num_beams: int = 4) -> str Traduce texto espanol a ingles frase a frase usando MarianMT. Divide por boundaries de oracion, traduce cada una independientemente y une con espacio. Preserva nombres propios mejor que pasar el parrafo entero.
marianmt
translation
es-en
nlp
datascience
python
marianmt_es_en_load_model_py_datascience
false error_go_core
re
name desc
text texto en espanol a traducir — puede ser una frase o un parrafo multi-oracion
name desc
tokenizer tokenizer MarianMT cargado con marianmt_es_en_load_model
name desc
model modelo MarianMT cargado con marianmt_es_en_load_model
name desc
max_length longitud maxima en tokens por oracion para tokenizacion y generacion (defecto 512)
name desc
num_beams numero de beams para beam search — mas alto = mejor calidad, mas lento (defecto 4)
texto traducido al ingles. Frases unidas con espacio simple. String vacio si el input es vacio. true
texto vacio retorna string vacio
una frase en espanol produce output no vacio
python/functions/datascience/tests/test_translate_es_to_en.py python/functions/datascience/translate_es_to_en.py impure: invoca model.generate que depende del estado del modelo (pesos, device). El split por oracion usa regex lookahead-behind sobre [.!?] seguidos de espacio. Esto preserva nombres propios con puntos (S.A., U.S.A.) mejor que NLTK sent_tokenize porque no usa reglas de abreviacion — simplemente divide donde hay espacio despues de puntuacion terminal. Util como preprocesador para rebel_load_model (English-only, Apache 2.0): ES text -> translate_es_to_en -> EN text -> REBEL -> triplets Alternativa directa: mrebel_load_model (multilingue, CC BY-NC-SA).

Ejemplo

from python.functions.datascience.marianmt_es_en_load_model import marianmt_es_en_load_model
from python.functions.datascience.translate_es_to_en import translate_es_to_en

tokenizer, model = marianmt_es_en_load_model()

text = "Pablo Isla es presidente de Inditex. La empresa tiene sede en Arteixo."
translated = translate_es_to_en(text, tokenizer, model)
# "Pablo Isla is president of Inditex. The company is headquartered in Arteixo."

Por que frase a frase

Pasar el parrafo entero a MarianMT puede degradar la traduccion de nombres propios porque el modelo redistribuye la atencion sobre el contexto completo. Dividir por oraciones:

  1. Contexto mas corto → menos confusion en nombres propios.
  2. Truncation menos probable (512 tokens alcanza para oraciones normales).
  3. Pipeline mas predecible para debugging (se puede inspeccionar cada frase).

Patron pipeline ES -> EN -> REBEL

# Paso 1: cargar modelos
mt_tok, mt_model = marianmt_es_en_load_model()
rebel_tok, rebel_model = rebel_load_model()

# Paso 2: traducir
en_text = translate_es_to_en(es_text, mt_tok, mt_model)

# Paso 3: extraer relaciones
inputs = rebel_tok(en_text, return_tensors="pt", max_length=512, truncation=True)
generated = rebel_model.generate(**inputs, num_beams=4, max_length=256)
decoded = rebel_tok.decode(generated[0], skip_special_tokens=False)
triplets = parse_rebel_output(decoded)