---
name: extract_triples_spacy_es
kind: function
lang: py
domain: datascience
version: "1.0.0"
purity: impure
signature: "def extract_triples_spacy_es(text: str, nlp: Any) -> dict"
description: "Extraccion OpenIE schema-less en castellano via reglas de dependencia spaCy. Detecta patrones sujeto-verbo-objeto con el lemma del verbo como relacion (sin vocabulario fijo). Tambien extrae entidades NER (PER, ORG, LOC, MISC)."
tags: [spacy, openie, nlp, spanish, triples, dependency, ner, schema-less, datascience, python, mit, pendiente-usar]
uses_functions:
  - spacy_es_load_model_py_datascience
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [time, typing.Any]
params:
  - name: text
    desc: "Texto en castellano a analizar. Funciona mejor con oraciones completas. Admite multiples oraciones en el mismo texto."
  - name: nlp
    desc: "Instancia spaCy Language cargada con spacy_es_load_model. Debe incluir dependencias + POS + NER (es_core_news_md o lg)."
output: "Dict con 'text' (input), 'triples' (lista de {subject, relation, object, verb_form, object_dep, prep}), 'entities' (lista de {text, label}) y 'elapsed_s'. La relacion es el lemma del verbo, opcionalmente sufijado con preposicion (_en, _con) o modo pasivo ([pass])."
tested: true
tests:
  - "oracion simple produce tripleta con sujeto verbo objeto"
  - "carlos torres preside bbva produce tripleta president"
  - "amancio ortega fundo inditex en 1985 produce tripletas con fundar_en"
  - "texto sin verbos produce tripletas vacias"
  - "entities NER detecta PER ORG LOC"
test_file_path: "python/functions/datascience/tests/test_extract_triples_spacy_es.py"
file_path: "python/functions/datascience/extract_triples_spacy_es.py"
notes: |
  LICENSE: spaCy es MIT. Modelo es_core_news_md es CC BY-SA 4.0.
  Uso comercial permitido con atribucion.

  Validado en notebook 09 del analisis gliner_glirel_tuning.
  Complementa a extract_graph_gliner2: GLiNER2 usa vocabulario fijo de relaciones
  pero mayor precision; spaCy OpenIE usa lemmas verbales (sin vocabulario fijo)
  pero requiere post-filtrado manual.

  impure: invoca inferencia del modelo (side effect computacional).
  El nlp se inyecta externamente para permitir cache y reutilizacion.

  Relaciones compuestas: 'fundar_en' (fundar + preposicion 'en'),
  'ser_nombrado[pass]' (pasiva), 'trabajar_con' (trabajar + 'con').
---

## Ejemplo

```python
from datascience.spacy_es_load_model import spacy_es_load_model
from datascience.extract_triples_spacy_es import extract_triples_spacy_es

nlp = spacy_es_load_model()

result = extract_triples_spacy_es(
    "Amancio Ortega fundo Inditex en 1985 en La Coruna.",
    nlp=nlp,
)
# result["triples"]:
# [{"subject": "Amancio Ortega", "relation": "fundar", "object": "Inditex", ...},
#  {"subject": "Amancio Ortega", "relation": "fundar_en", "object": "1985", ...},
#  {"subject": "Amancio Ortega", "relation": "fundar_en", "object": "La Coruna", ...}]
```
