Biblioteca completa para normalizar nombres y apellidos en español con redistribución inteligente y detección de patrones
Project description
Nombre Normalizer ES
Una biblioteca completa para normalizar nombres y apellidos en español con redistribución inteligente y detección de patrones avanzada.
Características principales
🎯 Redistribución inteligente: Detecta y redistribuye apellidos mezclados en el campo nombre 🔍 Detección de patrones: Reconoce nombres compuestos tradicionales españoles 🔤 Manejo de tildes: Normaliza automáticamente acentos y caracteres especiales 📊 Procesamiento masivo: Procesa DataFrames completos de forma eficiente 🚨 Detección de casos problemáticos: Identifica registros que requieren revisión manual ⚡ Alto rendimiento: Optimizado para grandes volúmenes de datos
Instalación
pip install nombre-normalizer-es
Uso básico
Normalización simple
from nombre_normalizer import NombreNormalizer
# Crear instancia del normalizador
normalizador = NombreNormalizer()
# Normalizar un nombre simple
resultado = normalizador.normalizar_registro("JUAN CARLOS GARCIA LOPEZ")
print(resultado['nombres']) # "Juan Carlos"
print(resultado['apellidos']) # "García López"
# Con redistribución inteligente
resultado = normalizador.normalizar_registro(
nombre="Maria del Carmen Fernandez Rodriguez",
apellido="Martinez"
)
print(resultado['nombres']) # "María del Carmen"
print(resultado['apellidos']) # "Fernández Rodríguez Martínez"
Función de conveniencia
from nombre_normalizer import normalizar_nombre_simple
resultado = normalizar_nombre_simple("jose maria de la cruz")
print(resultado['nombres']) # "José María de la Cruz"
print(resultado['apellidos']) # ""
Procesamiento de DataFrames
import pandas as pd
from nombre_normalizer import NombreNormalizer
# Crear datos de ejemplo
df = pd.DataFrame({
'nombre_completo': [
'JUAN CARLOS GARCIA LOPEZ',
'maria del carmen rodriguez',
'JOSE LUIS DE LA TORRE MARTINEZ'
]
})
# Procesar DataFrame
normalizador = NombreNormalizer()
df_procesado = normalizador.procesar_dataframe(
df,
col_nombre='nombre_completo'
)
# Ver resultados
print(df_procesado[['nombres_norm', 'apellidos_norm']])
Procesamiento de archivos CSV
from nombre_normalizer import procesar_csv
# Procesar archivo CSV completo
procesar_csv(
archivo_entrada='datos_originales.csv',
archivo_salida='datos_normalizados.csv',
col_nombre='nombre',
col_apellido='apellido' # Opcional
)
Características avanzadas
Detección de nombres compuestos
La biblioteca reconoce automáticamente nombres compuestos tradicionales españoles:
normalizador = NombreNormalizer()
# Nombres compuestos con partículas
resultado = normalizador.normalizar_registro("MARIA DE LOS ANGELES GARCIA")
print(resultado['nombres']) # "María de los Ángeles"
print(resultado['apellidos']) # "García"
# Nombres dobles tradicionales
resultado = normalizador.normalizar_registro("JOSE MARIA FERNANDEZ LOPEZ")
print(resultado['nombres']) # "José María"
print(resultado['apellidos']) # "Fernández López"
Manejo de partículas
Las partículas se mantienen en minúscula según las reglas del español:
resultado = normalizador.normalizar_registro("juan de la torre")
print(resultado['nombres']) # "Juan"
print(resultado['apellidos']) # "de la Torre"
Detección de casos problemáticos
normalizador = NombreNormalizer()
# Procesar varios registros
registros = [
"NOMBRE COMPLEJO CON MUCHAS PALABRAS QUE ES DIFICIL DE SEPARAR",
"JUAN CARLOS GARCIA LOPEZ",
"X Y Z" # Caso problemático
]
for registro in registros:
resultado = normalizador.normalizar_registro(registro)
if resultado['es_problematico']:
print(f"⚠️ Revisar: {registro}")
# Obtener todos los casos problemáticos
casos_problema = normalizador.obtener_casos_problema()
print(f"Encontrados {len(casos_problema)} casos problemáticos")
# Exportar casos problemáticos a CSV
normalizador.exportar_casos_problema("revision_manual.csv")
Ejemplos de casos de uso
1. Limpieza de base de datos de clientes
import pandas as pd
from nombre_normalizer import NombreNormalizer
# Cargar datos
df = pd.read_csv('clientes.csv')
# Normalizar
normalizador = NombreNormalizer()
df_limpio = normalizador.procesar_dataframe(
df,
col_nombre='nombre_cliente',
col_apellido='apellido_cliente'
)
# Guardar resultado
df_limpio.to_csv('clientes_normalizados.csv', index=False)
# Revisar casos problemáticos
if normalizador.casos_problema:
print(f"⚠️ {len(normalizador.casos_problema)} casos requieren revisión")
normalizador.exportar_casos_problema('clientes_revisar.csv')
2. Procesamiento de formularios web
from nombre_normalizer import normalizar_nombre_simple
def procesar_formulario(datos_formulario):
"""Procesa y normaliza datos de un formulario web"""
resultado = normalizar_nombre_simple(
nombre=datos_formulario.get('nombre_completo', ''),
apellido=datos_formulario.get('apellidos', '')
)
return {
'nombres_normalizados': resultado['nombres'],
'apellidos_normalizados': resultado['apellidos'],
'requiere_revision': resultado['es_problematico']
}
# Ejemplo de uso
datos = {'nombre_completo': 'maria del carmen garcia lopez'}
resultado = procesar_formulario(datos)
print(resultado)
3. Análisis de datos con pandas
import pandas as pd
from nombre_normalizer import NombreNormalizer
# Cargar datos
df = pd.read_excel('empleados.xlsx')
# Normalizar nombres
normalizador = NombreNormalizer()
df = normalizador.procesar_dataframe(df, 'nombre_completo')
# Análisis post-normalización
print("Estadísticas de normalización:")
print(f"- Total registros: {len(df)}")
print(f"- Casos problemáticos: {df['es_problematico'].sum()}")
print(f"- Nombres únicos: {df['nombres_norm'].nunique()}")
# Encontrar posibles duplicados por nombre
duplicados = df.groupby(['nombres_norm', 'apellidos_norm']).size()
duplicados = duplicados[duplicados > 1]
print(f"- Posibles duplicados: {len(duplicados)}")
API Reference
Clase NombreNormalizer
__init__()
Inicializa el normalizador con diccionarios predefinidos de nombres, apellidos y partículas españolas.
normalizar_registro(nombre: str, apellido: str = "") -> Dict
Normaliza un registro individual.
Parámetros:
nombre(str): Campo nombre (puede incluir apellidos)apellido(str): Campo apellido (opcional)
Retorna:
dictcon claves:nombres,apellidos,es_problematico,original_nombre,original_apellido
procesar_dataframe(df: DataFrame, col_nombre: str, col_apellido: str = None, inplace: bool = False) -> DataFrame
Procesa un DataFrame completo.
Parámetros:
df(DataFrame): DataFrame a procesarcol_nombre(str): Nombre de la columna con nombrescol_apellido(str): Nombre de la columna con apellidos (opcional)inplace(bool): Si modificar el DataFrame original
Retorna:
DataFramecon columnas adicionales:nombres_norm,apellidos_norm,es_problematico
obtener_casos_problema() -> List[Dict]
Retorna la lista de casos problemáticos detectados durante el procesamiento.
exportar_casos_problema(archivo: str = "casos_problema.csv")
Exporta los casos problemáticos a un archivo CSV para revisión manual.
Funciones de conveniencia
normalizar_nombre_simple(nombre: str, apellido: str = "") -> Dict
Función de conveniencia para normalizar un nombre simple sin crear una instancia de la clase.
procesar_csv(archivo_entrada: str, archivo_salida: str, col_nombre: str, col_apellido: str = None)
Función de conveniencia para procesar un archivo CSV completo.
Casos especiales manejados
Nombres compuestos reconocidos
- María del Carmen, María de los Ángeles, José María, Juan Carlos, etc.
- Nombres con partículas religiosas: María del Socorro, María de la Paz
- Nombres dobles tradicionales: Ana María, José Luis, Miguel Ángel
Partículas manejadas
de,del,de la,de los,de lasy,e,ivan,von,da,dos,das,dosan,santa,santomc,mac,o,di,du,le,lo
Normalización de acentos
- Manejo automático de tildes y caracteres especiales
- Reconocimiento de variantes con y sin acentos
- Normalización Unicode completa
Requisitos
- Python 3.8+
- pandas >= 1.3.0
- unicodedata2 >= 15.0.0 (para Python < 3.13)
Licencia
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Contribuciones
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Soporte
Si encuentras algún problema o tienes sugerencias:
- Abre un issue
- Contacta al mantenedor: rmr@keepcoding.io
Changelog
v1.0.0
- Versión inicial
- Normalización inteligente de nombres y apellidos españoles
- Redistribución automática de apellidos
- Detección de casos problemáticos
- Soporte para procesamiento masivo con pandas
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nombre_normalizer_es-1.0.1.tar.gz.
File metadata
- Download URL: nombre_normalizer_es-1.0.1.tar.gz
- Upload date:
- Size: 21.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39d9d4ef8e2e2b583bbe95eea98e5201ac895bd9425dcfcb5d15a502e03a2120
|
|
| MD5 |
48d7d5d7d8570b985ef2af18b23579f4
|
|
| BLAKE2b-256 |
8bb864e9e0c103d769a7d1b43ec7023894cd6e653f9d3c54928c3f43da06be13
|
File details
Details for the file nombre_normalizer_es-1.0.1-py3-none-any.whl.
File metadata
- Download URL: nombre_normalizer_es-1.0.1-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecd3fc2043b5cadd3eb9537b18922c2a60545e5644970b2cb6c2ae4dd5e96740
|
|
| MD5 |
b5567eadc3df5462481ae1561256eeb0
|
|
| BLAKE2b-256 |
ec56b2167a69054714bda72af8bf2f0b92c7d1ec4380497cb72da5b34f9b7665
|