docs: issues 0041 (split thresholds) + 0042 (GLiNER2), supersedes mREBEL

Cierra el ciclo del analysis gliner_glirel_tuning: documenta en app.md el
pipeline NER+RE disponible en el registry y abre los dos issues que faltan
para cablearlo en extract_graph_hybrid + panel paste_extract. Archiva el
0042 original (mREBEL) tras la decision a favor de GLiNER2 (Apache 2.0,
joint NER+RE, 20-30x mas rapido en CPU).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-05 10:07:43 +02:00
parent 3c98fee443
commit 5e6023f639
4 changed files with 498 additions and 0 deletions
+31
View File
@@ -98,3 +98,34 @@ cmake --build build/linux --target graph_explorer -j$(nproc)
filesystem propio para evitar lock con otras apps que esten escribiendo.
- El `graph_hash` se calcula a partir del path canonico del input. Mismo path
= mismo grafo a efectos de layout guardado.
### Pipeline NER+RE disponible en el registry (2026-05-04)
Tras la investigacion del analysis `gliner_glirel_tuning` (proyecto `osint_graph`), el stack completo de extraccion de entidades + relaciones desde texto / PDF esta listo como funciones del registry. **Esto desbloquea los issues 0041 y 0042**:
```python
# Pipeline E2E recomendado (texto -> grafo)
from pipelines.extract_graph_from_text import extract_graph_from_text
from datascience.gliner2_load_model import gliner2_load_model
model = gliner2_load_model() # Apache 2.0, NER+RE joint, 340M params
result = extract_graph_from_text(text, ENTITY_LABELS, RELATION_LABELS, ALLOWED, model)
# result = {'nodes': [...], 'edges': [...], 'stats': {...}}
```
Componentes (mira `python/functions/{core,datascience,pipelines}/`):
- **core (puras):** `clean_pdf_text`, `chunk_with_overlap`, `merge_entity_aliases`, `filter_relations_by_entity_types`, `aggregate_extraction_results`.
- **datascience (impuras):** `gliner2_load_model`, `extract_graph_gliner2`, `spacy_es_load_model`, `extract_triples_spacy_es` (OpenIE schema-less ES).
- **pipelines:** `extract_graph_from_text` — composicion E2E.
Recetas validadas en notebooks 04-08 del analysis y vaultadas en `vaults/osint_nlp_models/`:
- `threshold=0.3` (vs default 0.5) para GLiNER2.
- snake_case verbal labels (`works_at`, `ceo_of`...).
- `chunk_with_overlap` para texto > 1500 chars.
- `filter_relations_by_entity_types` para descartar `Madrid president_of Persona`.
- `merge_entity_aliases` para fusionar `BBVA` ⊂ `Banco Bilbao Vizcaya Argentaria, S.A.`.
- spaCy ES dep-rules como capa OpenIE schema-less complementaria (predicado = verbo del texto).
Issues que desbloquea: `issues/0041-split-confidence-thresholds.md` y `issues/0042-gliner2-unified-extractor.md`. El registry tiene todas las funciones necesarias; solo falta cablearlas en `extract_graph_hybrid_py_pipelines` y el panel `paste_extract`.
Playground de referencia: `projects/osint_graph/analysis/gliner_glirel_tuning/playground/` (FastAPI + Sigma.js, sirviendo en `localhost:7878`).