---
name: merge_entity_aliases
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def merge_entity_aliases(entity_names: list[str]) -> dict[str, str]"
description: "Coreference simple por normalizacion + substring: mapea cada nombre de entidad a su forma canonica. 'BBVA' y 'bbva' -> mismo canonical. Nombres cortos absorbidos por nombres largos que los contienen como palabra completa (min 4 chars normalizados)."
tags: [nlp, coreference, entity, alias, normalization, merge, graph, ner]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [re, collections.defaultdict]
params:
  - name: entity_names
    desc: "Lista de nombres de entidades tal como los extrajo el modelo NER. Puede contener duplicados, variaciones de casing (BBVA/bbva) y formas largas/cortas (BBVA / Banco Bilbao Vizcaya Argentaria, S.A.)."
output: "Dict {nombre_original: nombre_canonical}. Identidad para nombres que no son alias de nada. Lista vacia retorna dict vacio."
tested: true
tests:
  - "duplicados case-insensitive se mapean al mismo canonical"
  - "nombre corto se absorbe en nombre largo que lo contiene"
  - "siglas cortas menos de 4 chars no absorben falsamente"
  - "nombres totalmente disjuntos se mapean a si mismos"
test_file_path: "python/functions/core/tests/test_merge_entity_aliases.py"
file_path: "python/functions/core/merge_entity_aliases.py"
notes: |
  Validado en playground/server.py del analisis gliner_glirel_tuning.
  El criterio de 4 chars normalizados evita que siglas tipo "US", "EU", "SA"
  absorban entidades que meramente contienen esas letras.
  El merge es asimetrico: el nombre LARGO es el canonical, no el corto.
  Util como paso de post-proceso tras aggregate_extraction_results antes
  de construir el grafo final.
---

## Ejemplo

```python
from core.merge_entity_aliases import merge_entity_aliases

names = ["BBVA", "bbva", "Banco Bilbao Vizcaya Argentaria, S.A.", "Inditex"]
alias = merge_entity_aliases(names)
# alias["BBVA"]  -> "Banco Bilbao Vizcaya Argentaria, S.A."  (absorbido por substring)
# alias["bbva"]  -> "Banco Bilbao Vizcaya Argentaria, S.A."  (normalizado + absorbido)
# alias["Banco Bilbao Vizcaya Argentaria, S.A."] -> "Banco Bilbao Vizcaya Argentaria, S.A."
# alias["Inditex"] -> "Inditex"  (identidad, no hay alias)
```
