--- 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] 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", ...}] ```