Mostrando entradas con la etiqueta IA. Mostrar todas las entradas
Mostrando entradas con la etiqueta IA. Mostrar todas las entradas

miércoles, 25 de febrero de 2026

Orient-IA

IA Modelo experto (II)

Estrategias de razonamiento: encadenamiento hacia adelante y encadenamiento hacia atras

Al hablar del modelo experto, dijimos que constaba de tres componentes, la base de conocimiento, el motor de inferencias y el interfaz de usuario. Mientras que el primero y tercer componente no parecen ofrecer dificultades para su comprensión e identificación en una aplicación real, el segundo requiere una explicación más detallada. Este será el objetivo de esta segunda entrada sobre los modelos expertos de IA.

Aunque sin duda no es el único ejemplo, sí me parece que los informes automarizados de pruebas que ofrecen los sistemas de corrección on-line se acercan mucho a la representación del paradigma modelo experto IA. Con esto no quiero decir que funcionen limitándose a este modelo, pero sí que podrían hacerlo perfectamente. Es por ello que considero a estas aplicaciones o servicios una buena ejemplifición de los componentes de que están dotados estos modelos. Al menos en su parte visible e "intuible" así podrían considerarse.

Empezando por el final, el interfaz se muestra, generalmente, de modo generalmente tosco (tambiém hay que decirlo) como sistema de entrada de datos basado en un formulario simple. La base de conocimientos que sustenta el sistema está oculta, especialmente en lo que hace a los datos sensibles, aquellos sobre los que opera el sistema de reglas del motor de inferencias, aunque algunas de sus partes resultan evidentes en los informes resultantes (1).

Y aquí es cuando llegamos a la cuestión que llama ahora nuestra atención: ¿en que´consiste en la práctica eso que llaman motor de inferencias?, ¿qué es el encadenamiento hacia adelante y el encadenamiento hacia atrás?. Conocer estas cuestiones nos ayuda a implementar este tipo de soluciones en nuestras propuestas; especialmente ahí donde la automatización se puede beneficiar de una aplicación fundamentada del modelo experto IA (2)

Entendemos por encadenamiento hacia adelante (Forward Chaining) es un mecanismo de inferencia dirigido por los datos (data-driven), conceptos que vienen a ser sinónimos. El sistema comienza con los hechos conocidos y aplica las reglas si-entonces para generar nuevos hechos. Este proceso se repite hasta que no se pueden extraer más conclusiones. Se basa en la regla lógica Modus Ponens: Sabemos que P implica Q; si tenemos P, entonces se producirá Q.

Un ejemplo muy simple: sabemos que la regla "Si llueve, el suelo se moja" es cierta (P→Q); contatamos que "Está lloviendo" (P), así que el sistema deduce automáticamente que "El suelo está mojado" (Q).

En el encadenamiento hacia atrás (backward chaining) el motor de inferencias empieza con una meta o hipótesis y trabaja a la inversa para ver si los hechos la sustentan.

En este caso el modelo se guía por objetivos ((goal-driven)) e intenta demostrar una conclusión examinando las cláusulas ENTONCES (consecuentes) de las reglas. Si encuentra una regla cuya conclusión coincide con el objetivo, se mueve al SI (antecedente) y convierte esa condición en un nuevo objetivo a demostrar. Esto es, se basa en la búsqueda de evidencia para la implicación. Para demostrar que Q es cierto, el sistema busca si P lo es en la base de hechos o si existe otra regla que tenga a P como conclusión.

Para ejmplificar ambos procedimientos vamos a exponerlos en un contexto de evaluación clínica. Este contexto, además de no ser extraño para el SEO (al que con mucha frecuencia se le acusa de reproducir indebidamente el modelo clínico), resulta pertinente por ser uno de los contextos en que se han desarrollado soportes IA basados en el modelo experto.

Pondremos como ejemplo la atención médica a un paciente que llega a urgencias con dolor torácico. En este contexto, el procesamiento hacia adelante actúa como el triaje inicial qué sugieren los síntomas y el procesamiento hacia atrás actúa como el especialista que busca confirmar una sospecha específica (en este caso reponder a la pregunta: "¿es un infarto?"). Ambos procedimientos, más que antagónicos, resultan complementarios.

Concretando, llamemos escenario A a la aplicación del procesamiento hacia adelante (triaje) e identifiquemos sus pasos:

  • Hecho 1: Dolor torácico opresivo.
  • Hecho 2: Sudoración profusa.
  • Regla: SI "Dolor opresivo" Y "Sudoración" (datos) ENTONCES (inferir) "Posible Isquemia".
  • Resultado: El sistema alerta al médico para que priorice al paciente porque los datos indican posible riesgo coronario.

El escenario B se plantea como procedimiento hacia Atrás (cardiólogo)

  • Meta: Confirmar Infarto (IAM).
  • Regla necesaria: Para confirmar IAM necesito "Elevación del segmento ST en ECG" O "Troponinas altas en sangre".
  • Acción del sistema: El sistema pregunta: "¿Tiene el resultado del ECG?".
  • Hecho: El usuario sube el ECG con elevación ST.
  • Resultado: La meta "Infarto" se marca como Verdadera.

RESUMEN COMPARATIVO

Característica Encadenamiento Hacia Adelante (Data-driven) Encadenamiento Hacia Atrás (Goal-driven)
Punto de Partida Los Síntomas: El paciente dice que tiene dolor opresivo y sudoración fría. La Hipótesis: El cardiólogo sospecha de un "Infarto Agudo de Miocardio" (IAM)
Pregunta Guía ¿A qué diagnóstico nos llevan estos síntomas? ¿Qué pruebas necesito para confirmar que es un infarto?
Flujo de Trabajo Se introducen los datos ---> Se activan reglas ---> Se llega a una conclusión Se fija el objetivo ---> Se buscan las condiciones necesarias ---> Se solicitan los datos.
Resultado intermedio Genera todas las conclusiones posibles Solo genera las necesarias para probar la meta
Comportamiento Exploratorio: Puede concluir varias cosas a la vez: ENTONCES ---> angina | ansiedad | reflujo Confirmatorio: Se enfoca exclusivamente en evidencias que apoyen o descarten el IAM
Interacción Sistema-Sanitario El sistema procesa la información ya disponible en la ficha médica El sistema solicita activamente: "Realice un ECG" o "¿El dolor se irradia al brazo izquierdo?"
Control de búsqueda Puede generar inferencias no solicitadas Búsqueda dirigida y selectiva
Costo computacional Alto si la base de reglas es grande Más eficiente si la meta está bien definida
Naturaleza Exploratoria Confirmatoria
Eficiencia Alta cuando hay muchos síntomas y no se sabe qué pasa Alta cuando se precisa diagnóstico urgente y hay que descartar riesgos vitales
Ejemplo histórico Sistemas tipo CLIPS Sistemas tipo MYCIN

Consultas. Texto elaborado a partir de consultas a IA Gemini - IA ChatGPT (ambas versión gratuita, los mismos prompt)

Notas
1Sobre estas cuestiones trataremos en su momento dentro de la sección Evaluación.
2Como dije, la automatización de informes de pruebas parece ser un campo de trabajo especialmente apropiado. Lo que no implica que no presente limitaciones ni que otros modelos no sean pertinentes.

martes, 24 de febrero de 2026

Orient-IA

IA Modelo experto

El modelo experto (si se prefiere, el paradigma de sistema experto o "expert system paradigm") fue el paradigma de desarrollo de la IA en los años 70-80 (para algunos, hasta inicios 90). Este modelo se basa en la emulación explícita del conocimiento humano, concretamente de los procedimientos con los que los expertos resuelven problemas propios de su área de conocimiento, aplicando reglas de decisión. En esto se diferencia radicalmente de la IA generativa (modelo actualmente predominante) que se basa en el (auto)aprendizaje de patrones (machine learning).

El modelo experto es un enfoque de IA simbólica que tuvo su auge en los años 70-80 con sistemas como MYCIN (para el diagnóstico de infecciones bacterianas) o DENDRAL (para el análisis de estructuras químicas). Se basa en la premisa de que si podemos capturar el conocimiento declarativo y procedimental de un experto, podremos representarlo formalmente, por lo que una máquina puede reproducir su capacidad de decisión en ese dominio.

Para que un modelo experto funcione se requieren tres componentes:

  • A. Una base de conocimientos o repositorio de hechos y reglas de tipo "Si... entonces..." (IF-THEN). No se trata de datos brutos, sino conocimiento estructurado. Esta base de conocimientos contiene: hechos (o datos sobre el dominio), reglas de producción (de tipo *SI condición → ENTONCES conclusión) y, en algunos casos, marcos (frames) u ontologías. Ejemplo simplificado: SI fiebre = alta Y infección = probable -> ENTONCES prescribir antibiótico tipo X
  • B. Un motor de inferencias, o mecanismo de razonamiento que aplica las reglas lógicas a los hecho conocidos para deducir nuevas conclusiones. Opera mediante el encadenamiento hacia adelante (data-driven), el encadenamiento hacia atrás (goal-driven) y la lógica proposicional, lógica de predicados o esquemas probabilísticos (ej., factores de certeza en MYCIN).
  • C. Una interfaz de usuario, que es el medio mediante el cual el sistema hace preguntas al usuario y entrega una solución o explicación.

En el proceso de creación intervienen dos figuras principales: el experto, que provee de los conocimientos temáticos, y el ingeniero informático, que traduce ese conocimiento a código lógico que la máquina pueda entender.

Dada la naturaleza de la lógica subyacente, estos sistemas son capaces de justificar sus conclusiones: “Recomendé X porque se cumplen las reglas A, B y C”. Esto constituye una ventaja respecto a muchos de los sistemas actuales de aprendizaje profundo (deep learning), que no son capaces de informar de su proceso de toma de decisiones.

El modelo experto no pretende simular conciencia o comprensión profunda, sólo la capacidad decisional especializada mediante:

  • Inteligencia simbólica
  • Razonamiento explícito
  • Conocimiento formalizado y estructurado
  • Competencia estrecha (narrow AI)

El modelo experto presenta como puntos fuertes:

  • Una alta precisión en dominios acotados
  • Capacidad de explicar sus decisiones (trazabilidad del razonamiento), lo que constituye una ventaja crítica en entornos basados en regulaciones y en entornos clínicos.
  • Posibilidad de control lógico del sistema
  • Economía y estabilidad, ya que no exige ni depende de grandes volúmenes de datos.

Por el contrario, presenta también una serie de debilidades o limitaciones críticas que explican el predominio actual de los modelos IA de tipo Machine Learning.

1 - Limitaciones derivadas del cuello de botella que representa el conocimiento humano (knowledge acquisition bottleneck), dado que extraer conocimiento de expertos humanos es lento, costoso y parcial, dado que mucho conocimiento experto es intuitivo, tácito y no explícito.

2 - Rigidez y falta de capacidad de generalización. Esto modelos son deterministas y rígidos, funcionan bien sólo en el dominio para el que fueron diseñados, pero ni transfieren conocimiento ni aprenden por experiencia, salvo que se reprogramen reglas.

3 - Escalabilidad limitada. Al aumentar el número de reglas crece exponencialmente su complejidad, aparecen conflictos entre unas reglas y otras y el mantenimiento se vuelve problemático. Además, cada actualización requiere de la intervención humana.

4 - Incapacidad para manejar el contexto y la ambigüedad compleja. Dado que el mundo real es incierto, borroso y no completamente formalizable, los sistemas expertos clásicos presentan dificultades para enfrentarse a esta realidad, ya que operan mejor en entornos con variables discretas, ontologías claras y criterios normativos bien definidos.

5 - No capturan aprendizaje estadístico implícito. A diferencia del enfoque IA actual (IA generativa), basado en redes neuronales, el modelo experto no aprende de grandes corpus de datos, no infiere patrones latentes ni construye representaciones distribuidas. Su conocimiento es explícito, no emergente.

RESUMEN COMPARATIVO

Característica Modelo Experto (Simbólico) IA Moderna (Redes Neuronales)
Origen del conocimiento Basado en reglas. Ingenieros programando reglas Basado en datos. Datos y entrenamiento autónomo
Tipo de conocimiento Conocimiento explícito Representaciones implícitas
Aprendizaje No aprende solo Aprende por entrenamiento
Explicabilidad Alta (puedes ver la regla que aplicó) Baja ("caja negra")
Flexibilidad De dominio estrecho. Muy baja, es rígido. Generalización estadísticas. Muy alta, se adapta a nuevos datos
Uso ideal Tareas con reglas fijas y claras Areas complejas (visión, lenguaje)

Consultas

Además de IA Gemini - IA ChatGPT (ambas versión gratuita), consultar...

martes, 17 de febrero de 2026

DATOS

Limpieza de datos

¿En qué consiste?

La limpieza de datos es un conjunto de procedimientos que permiten identificar y corregir los errores e incoherencias que pueden presentar los datos para mejorar su calidad, a fin de garantizar que sean precisos, completos, coherentes y utilizables (1).

Se puede decir que la limpieza de datos es una fase crítica en el desarrollo de cualquier solución basada en código, especialmente necesaria en el campo de la inteligencia artificial (IA), dado que en ella importa tanto la cantidad como la calidad. Si la cantidad no es suficiente, los modelos no alcanzan el nivel crítico de rendimiento para ser funcionales, pero si los datos son de mala calidad, el resultado es necesariamente también de mala calidad.

Fruto del interés que tiene la limpieza de datos es la sistematización de la que ha sido objeto, derivando de esta la identificación de seis fases en su desarrollo:

1. Inspección: Antes de nada, observa si hay columnas con nombres extraños, fechas que parecen texto, números imposibles...
2. Gestión de los valores faltantes: Los famosos códigos NaN ante los que caben tres opciones: eliminarlos (si son pocos), imputarlos (usando la media o la mediana) o marcarlos como "Desconocido".
3. Tratamiento de valores atípicos: Identificar outliers: ¿ese dato (900 archivos en un expediente) es un error de escritura o un valor extraordinario?. Según la respuesta y el objetivo que se persiga con el análisis previsto se decide mantenerlo o eliminarlo.
4. Estandarización: Unificar formatos en expresiones como "madrid", "MADRID" y "Madrid ".
5. Deduplicación: Los registros repetidos (duplicados) son ruido que se debe elimínar para evitar sesgos.
6. Validación final: Si tras la limpieza, en un registro aparece una edad de -5 años es que algo no se hizo bien.

Para desarrollar todo este conjunto de actuaciones disponemos de diferentes estrategias, herramienta y enfoques.

POdemos recurrir a procedimientos manuales, basados en la inspección visual, las referencias cruzadas o las tablas dinámicas basadas en Excel o Calc.

En el extremo opuesto a lo "manual" se sitúan las alternativas basadas en la IA, con los que se prioriza la automatización del proceso por entero y que contempla diferentes opciones:

  • Para el análisis de los datos originales, las herramientas de limpieza de datos con IA pueden identificar automáticamente patrones, anomalías e incoherencias y sugerir correcciones.
  • Para la estandarización de los datos, las técnicas de procesamiento del lenguaje natural (PLN) pueden estandarizar texto no estructurado (el formato de direcciones, por ejemplo); los modelos de machine learning (ML) pueden identificar formatos y recomendar los que se adecúan a determinados datos, como fechas o unidades monetarias; y los generadores de expresiones regulares basados en IA permite automatizar la detección y normalización de formatos incoherentes con la naturaleza de los datos.
  • Para la consolidación de duplicados, los modelos de IA basados en reglas o en estrategias aprendizaje-máquina pueden decidir la mejor opción ante la posibilidad de eliminar duplicados, atendiendo a criterios de precisión, actualización y fiabilidad.
  • Para la aplicación de reglas, los modelos de IA pueden automatizar la creación y aplicación de reglas de limpieza de datos resultanres del aprendizaje (historial de correcciones pasadas) y aplicar estas reglas a nuevos conjuntos de datos. También pueden generar reglas personalizadas para aplicar en sectores o dominios específicos.

A pesar de su potencia, estos sistemas no son infalibles, no siempre están disponibles y no son necesariamente la mejor opción; de hecho presentan problemas de coste, de tratamiento confidencial de datos y de limitaciones para correr en nuestros sistemas en local.

Además simplemente podemos optar por mantener el control sobre el proceso de limpieza sin delegarlo totalmente en la IA y/o preferir alternativas basadas en lenguajes como Python o R. Si optamos por Python tenemos a nuestra disposición herramientas (bibliotecas) como las siguientes:
1. Pandas: Herramienta básica que permite cargar datos, filtrarlos y manejar valores nulos.
2. NumPy: Potencia matemática ideal para transformaciones numéricas complejas y para el manejo eficiente de grandes matrices.
3. Scikit-learn: Herramienta pensada para machine learning (ML) cuyo módulo preprocessing permite normalizar escalas y codificar variables categóricas con gran precisión y fiabilidad.
4. Missingno: Visualización de datos vacíos que permite vilualizar dónde están los "huecos" en tu conjunto de datos (dataset)

Nota (1)

Fuentes de información utilizadas: artículo www.ibm.com e información resultante de la consulta a IA Gemini (versión gratuíta básica)

lunes, 9 de febrero de 2026

Expedientes

Acceso a archivos

Este se puede considera el proceso inverso a lo que en su momento constituyó la generación automatizada de un documento de acreditación; también se puede entender como fase inicial del análisis de datos. Sea lo uno o lo otro, lo que nos importa es la consecuencia: se trata de generar un procedimiento que nos permita acceder al contenido de determinados documentos.

Pero como de algún modo hay que plantearlo para darle contexto, aprovecho la ocasión y el trabajo ya desarrollado para invertir su lógica y cerrar el círculo: si entonces se trataba de generar masivamente documentos partiendo de una tabla de datos, ahora se pretender procesar automáticamente y en cascada ciertos documentos para acceder a determinados datos y crear una fuente de datos.

Aunque el objetivo no es lo relevante, no está de más decir que se enmarca dentro del seguimiento o análisis de la intervención, que es una forma de análisis de datos adaptado a la acción de los SEO.

Dado que los datos son inventados (escandalosamente inventados), publicar el contenido de los documentos carece de importancia (cualquier parecido es mera coincidencia), incluyendo su uso (a fines comparativos) en Gemini o NotebookLM.

No puedo asegurar que sea así en todos los casos ya que mi experiencia es muy limitada, pero utilizar estas herramientas IA (y también ChatGPT) en el proceso descrito en la entrada antes citada ("Combinar correspondencia"), aunque es posible, sólo relativamente, con limitaciones cuantitativas y nunca exento de posibilidades de error. Esto es cierto al menos en determinadas condiciones, como son en las que yo me encuentro: Gemini y ChatGPT en sus cuentas gratuitas.

Pero si simulo el acceso al contenido de una colección de documentos para obtener determinados datos en NotebookLM los resultados son claramente positivos: es sencillo hacer la consulta y se obtienen resultados fiables y precisos. Cierto que si necesitamos procesar muchos documentos (y muchos no son tantos) deberás hacerlo en varios cuadernos porque no se puede sobrepasar un límite muy moderado (50 archivos en versión usuario, 300 en versión Google Workspace (empresa o educación).

Esta limitación de por sí es un hándicap nada despreciable, pero se puede asumir; lo que no se puede asumir (sí aquí por las características de la "base de datos" que uso) es la vulneración de la confidencialidad de datos que supone subir este tipo de archivos a la red, especialmente a un sistema IA. Esta limitación es radical y nos obliga a desarrollar otro tipo de alternativas si queremos combinar el análisis de nuestros datos con su automatización, lo que con frecuencia equivale a decir simplemente si realmente queremos realizar análisis de datos basados en la documentación disponible en el SEO.

La solución (una de ellas, porque ya sabemos que tampoco en informática hay una única solución) pasa, por ejemplo, por desarrollar un script Python que nos de respuesta al objetivo que nos podamos plantear. El problema: ni es sencillo ni es posible garantizar que lo que sirve para una cuestión sirva para otra, aunque parezca similar.

Es por ello que la propuesta que presento en esta entrada sirve para lo que se propone (y para otros casos) pero no está garantizado que se pueda generalizar. Deberemos plantear otras situaciones y otros objetivos para ir generando un almacén de herramientas de acceso y análisis de documentos. Ahora sólo estamos en los meros inicios.

Rebobino y concreto: tomo los archivos generados automáticamente mediante el script presentado en esta entrada y los convierto en documentación objeto de análisis. En realidad, más que de un análisis se trata de obtener de ellos datos funcionales para, por ejemplo, generar una "agenda de teléfonos" para establecer comunicación con los progenitores. Se requiere, por tanto, acceso al nombre del progenitor y al teléfono de contacto. Ambos son campos disponibles en nuestra base de datos de referencia, pero vamos a situarnos en ausencia de ese documento.

Primero buscaremos el nombre de los familiares. Para ello podemos aplicar este script...



import os
import re
from docx import Document

folder_path = 'Creados'
def extraer_familiar_regex(file_path):
	doc = Document(file_path)
    texto_total = []
    for tabla in doc.tables:
    	for fila in tabla.rows:
        	for celda in fila.cells:
            	t = celda.text.strip()
                if t and (not texto_total or t != texto_total[-1]):
                	texto_total.append(t)
	etiqueta_objetivo = "Nombre y apellidos:"
    contador = 0
	for i, texto in enumerate(texto_total):
    	if re.search(rf"^{etiqueta_objetivo}", texto, re.IGNORECASE):
        	contador += 1
            if contador == 2:
            	if i + 1 < len(texto_total):
                	return texto_total[i + 1]
               	
	return None

# --- Ejecución y muestra por consola ---

print(f"👤 Buscando nombres de familiares en '{folder_path}'...\n")

for filename in os.listdir(folder_path):
	if filename.endswith('.docx') and not filename.startswith('~$'):
    	ruta = os.path.join(folder_path, filename)
        try:
        	nombre_familiar = extraer_familiar_regex(ruta)
            if nombre_familiar:
            	print(f"✅ {filename}: {nombre_familiar}")
            else:
            	print(f"⚠️ {filename}: No se encontró el nombre del familiar.")
		except Exception as e:
        	print(f"❌ Error en {filename}: {e}")
print("\nBúsqueda finalizada. 🎯")


... que nos devuelve el listado de familiares por consola (te animo a que lo pruebes ubicándolo en la raíz del directorio que contiene la carpeta (subdirectorio) Creados, que contiene los documentos que sirve de base para este proyecto y que te dejo para descarga en Documentos.

De modo similar y con resultados parecidos, podemos obtener el dato Teléfonos:



import os
import re
from docx import Document

folder_path = 'Creados'

def extraer_telefonos_flexibles(file_path):
    doc = Document(file_path)
    telefonos_limpios = []
    
    # EXPLICACIÓN DEL PATRÓN (Marca):
    # \b[679]        -> Empieza por 6, 7 o 9 (límite de palabra)
    # (?:[\s.-]?\d)  -> Un número precedido opcionalmente por un espacio, punto o guion
    # {8}            -> Esto se repite 8 veces para completar los 9 dígitos
    # \b             -> Límite de palabra al final
    patron_flexible = r'\b[679](?:[\s.-]?\d){8}\b'
    
    for tabla in doc.tables:
        for fila in tabla.rows:
            for celda in fila.cells:
                texto = celda.text.strip()
                coincidencias = re.findall(patron_flexible, texto)
                
                for tel in coincidencias:
                    # Limpiamos el teléfono para que en el Excel/Consola quede uniforme (sin espacios)
                    # Ejemplo: "600 12 34 56" -> "600123456"
                    tel_limpio = re.sub(r'[\s.-]', '', tel)
                    
                    if tel_limpio not in telefonos_limpios:
                        telefonos_limpios.append(tel_limpio)
                        
    return telefonos_limpios

# --- Ejecución ---
print(f"🧐 Buscando teléfonos con formatos variables en '{folder_path}'...\n")

for filename in os.listdir(folder_path):
    if filename.endswith('.docx') and not filename.startswith('~$'):
        try:
            tels = extraer_telefonos_flexibles(os.path.join(folder_path, filename))
            if tels:
                print(f"✅ {filename}: {tels}")
            else:
                print(f"⚠️ {filename}: No se encontraron teléfonos.")
        except Exception as e:
            print(f"❌ Error en {filename}: {e}")


Aunque el código de ambos es muy interesante (lo que lo trabajaremos en entradas posteriores), no deja de ser una solución poco funcional, ya que lo deseable es que ambas búsquedas se den en el mismo script y que queden recogidas en un soporte fácil de consultar, como puede ser un archivo xlsx, por ejemplo.

Para responder a estas demandas vamos a presentar un script que unifique ambos procedimientos y devuelva ese archivo Excel.



import os
import re
import pandas as pd
from docx import Document

# Configuración
folder_path = 'Creados'
output_file = 'lista_datos2.xlsx'

def procesar_documentos():
    datos_finales = []
    
    # Patrones Regex
    patron_tel = r'\b[679](?:[\s.-]?\d){8}\b'
    etiqueta_nombre = "Nombre y apellidos:"

    print(f"🚀 Iniciando procesamiento de archivos en '{folder_path}'...")

    for filename in os.listdir(folder_path):
        if filename.endswith('.docx') and not filename.startswith('~$'):
            ruta = os.path.join(folder_path, filename)
            try:
                doc = Document(ruta)
                texto_total = []
                
                # 1. Aplanamiento lineal
                for tabla in doc.tables:
                    for fila in tabla.rows:
                        for celda in fila.cells:
                            t = celda.text.strip()
                            if t and (not texto_total or t != texto_total[-1]):
                                texto_total.append(t)
                
                # 2. Extracción de Familiar (2ª ocurrencia)
                nombre_familiar = "No encontrado"
                contador_nombres = 0
                for i, texto in enumerate(texto_total):
                    if re.search(rf"^{etiqueta_nombre}", texto, re.IGNORECASE):
                        contador_nombres += 1
                        if contador_nombres == 2:
                            if i + 1 < len(texto_total):
                                nombre_familiar = texto_total[i+1]
                            break

                # 3. Extracción de Teléfono (el primero que encuentre con Regex)
                # Unimos todo el texto para que Regex busque en todo el documento
                todo_el_texto = " ".join(texto_total)
                coincidencias_tel = re.findall(patron_tel, todo_el_texto)
                
                # Limpiamos el teléfono si existe
                tel_final = "No encontrado"
                if coincidencias_tel:
                    # Tomamos el primero y le quitamos espacios/puntos
                    tel_final = re.sub(r'[\s.-]', '', coincidencias_tel[0])

                # 4. Guardamos en la lista para Pandas
                datos_finales.append({
                    "Archivo": filename,
                    "Familiar": nombre_familiar,
                    "Teléfono": tel_final
                })
                
                print(f"✅ Procesado: {nombre_familiar} -> {tel_final}")

            except Exception as e:
                print(f"❌ Error en {filename}: {e}")

    # 5. Creación del DataFrame y Excel con Pandas
    if datos_finales:
        df = pd.DataFrame(datos_finales)
        df.to_excel(output_file, index=False)
        print(f"\n✨ Proceso completado. Se ha generado '{output_file}' con {len(df)} registros.")
    else:
        print("\n⚠️ No se encontraron datos para guardar.")

if __name__ == "__main__":
    procesar_documentos()
Mostrando lista_fam_tlf.py.


Este script, además de presentar por pantalla el listado de familiares y teléfonos, genera un archivo Excel (.xlsx) que contiene una tabla con esos mismos datos.

Aunque sólo sea por curiosidad, si quieres saber cómo lee Python los archivos docx, este script te muestra el resultado de aplicar las técnicas de simplificación que permiten a Python acceder a contenidos concretos. No se trata de la única opción existente, sólo una de las más sencillas pero potentes, como puedes ver por los resultados.



from docx import Document

file_path = 'Creados/Acredita_1.docx' 

def ver_lista_lineal(ruta):
    try:
        doc = Document(ruta)
        texto_total = []
        
        # 1. Proceso de "aplanamiento" (igual que en tu script original)
        for tabla in doc.tables:
            for fila in tabla.rows:
                for celda in fila.cells:
                    t = celda.text.strip()
                    # Filtro para evitar duplicados por celdas combinadas
                    if t and (not texto_total or t != texto_total[-1]):
                        texto_total.append(t)
        
        # 2. Mostrar el resultado como una lista pura
        print(f"--- LISTA LINEAL DE: {ruta} ---")
        for i, elemento in enumerate(texto_total):
            # Imprimimos el índice para que veas la "posición" de cada dato
            print(f"Posición {i}: {elemento}")
            
    except Exception as e:
        print(f"❌ Error: {e}")

ver_lista_lineal(file_path)


Puedes compara la sucesión de "etiquetas" y "campos" y la diferencia con la apariencia visual del documento .docx. Y es que uno de los problemas con los que nos encontramos a la hora de trabajar en este tipo de proyectos es la complejidad de los documentos objeto de análisis. Esta complejidad se incrementa cuanto tratamos con documentos prescriptivos, formados por una complicada estructura de tablas las cuales han sido modificadas a lo largo del tiempo generando problemas de acceso importantes que explicar las dificultades con las que nos podemos encontrar al tratar de automatizar procedimientos. Algo de esto ya sabemos.

Documentos.

Para finalizar te dejo acceso a los script Python y al listado de documentos sobre los que trabajan. En esta ocasión no aporto un cuaderno Colab porque no me detengo a analizar el código de los script. Son muchos y suficientemente complejos como para hacerlo ahora. Tiempo habrá y en ello colaborará Gemini, auxiliar también en la creación de estas soluciones.

RECUERDA Debes descargar estos documentos en una misma carpeta.