feat: enricher split_words para probar grouping con volumen alto

split_sentences a menudo no llega al umbral de 50 (un texto medio
tiene 5-15 frases). split_words tokeniza el mismo notes en palabras
y trivialmente lo supera con cualquier parrafo decente -> Group
visible y testeable end-to-end sin necesidad de pegar megabytes.

Diferencias respecto a split_sentences:

* Splits por regex de letras (incluye acentos espanyoles + apostrofo
  interno como "don't"). Numeros y puntuacion ignorados.
* Lowercase + filtro por min_length (default 3, filtra a/el/de/y/o).
* Param `dedupe` (default true): vocabulario unico vs cada ocurrencia.
  Con dedupe=false sirve como stress test de volumen.
* Tipo `Word` en types.yaml: amarillo, ti-letter-w, principal_field=word.
* Relacion `WORD_OF` desde cada Word al source.
* Mismo patron de grouping que split_sentences (threshold 50, K=10
  preview, batch_id en metadata, Group con count + enricher).

Tests:

* below threshold no crea Group.
* >=50 tokens unicos -> Group + 10 sueltos + resto agrupados.
* dedupe=true (default) colapsa repeticiones; dedupe=false las
  conserva como nodos separados.
* min_length filtra correctamente.
* notes prioriza sobre node_name.
* texto vacio -> exit 2.
* max_words trunca.

WSL 89 / Windows 78 + 11 skipped.
This commit is contained in:
2026-05-04 00:14:57 +02:00
parent 87b9a4dc02
commit 352b27d488
4 changed files with 501 additions and 0 deletions
+12
View File
@@ -134,6 +134,18 @@ entities:
- { name: rank, type: int }
- { name: batch_id, type: string }
# Word — token emitido por split_words. Pensado para probar grouping
# con volumen alto: cualquier parrafo decente supera el umbral de 50
# tokens trivialmente. Color amarillo para distinguir de Sentence.
- name: Word
color: "#FCD34D"
icon: ti-letter-w
principal_field: word
fields:
- { name: word, type: string, required: true }
- { name: rank, type: int }
- { name: batch_id, type: string }
# Nodo grupo — cuadrado (regla de forma). Issue 0035: contenedor para
# agrupar resultados de enrichers cuando exceden el umbral. Los hijos
# son entidades reales con `group_id` apuntando al Group.