File size: 6,597 Bytes
67b82ae
e0b339d
67b82ae
d35e97b
67b82ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e0b339d
 
 
 
 
 
 
 
 
 
 
 
 
fda1a93
e0b339d
 
 
 
 
 
 
 
b226794
e0b339d
 
 
 
 
 
2e0d094
 
 
 
 
 
e0b339d
 
 
 
d56556d
e0b339d
 
d56556d
 
93a5ed3
d56556d
b226794
 
d56556d
 
b226794
 
eabea5d
d56556d
 
eabea5d
d56556d
eabea5d
 
b226794
 
 
eabea5d
b226794
 
 
 
 
eabea5d
b226794
 
 
 
 
d56556d
eabea5d
 
2e0d094
d56556d
eabea5d
b226794
 
eabea5d
 
b226794
 
 
 
 
eabea5d
b226794
 
 
d9436e3
 
b226794
d9436e3
b226794
 
 
 
 
d9436e3
 
 
 
eabea5d
 
 
d9436e3
eabea5d
 
 
b226794
 
eabea5d
b226794
 
d56556d
b226794
 
 
 
 
eabea5d
b226794
eabea5d
d56556d
2e0d094
b226794
eabea5d
b226794
 
eabea5d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import re 
import time
import tempfile
from gradio_client import Client, handle_file

async def procesaImagen(image):

    try:
        temp_image = await imageToTemp(image)
        client = Client("BuzzwordMx/ai_ocr")
        dict_recibido = client.predict(
                img=handle_file(temp_image),
                lang="en",
                api_name="/predict"
        )
                   
        #Aquí es donde personalizo el proceso:
        textos_extraidos = listaTextosExtraidos(dict_recibido) 
        return textos_extraidos
    except Exception as e:
        print(f"Error al procesar el archivo: {e}")
        return 'Error'

async def imageToTemp(image):

    try:
        with tempfile.NamedTemporaryFile(delete=False, suffix=f"_{image.filename}") as tmp_file:
            contents = await image.read()
            tmp_file.write(contents)
            temp_file_path = tmp_file.name
        
        print(f"Archivo temporal guardado en: {temp_file_path}")
        return temp_file_path

    except Exception as e:
        print(f"Error al procesar la imagen: {e}")
        return {"error": "Error al procesar la imagen"}

def listaTextosExtraidos(dict_recibido):

    result = dict_recibido['data']
    print("Datos extraídos (acceso directo):")
    
    textos_extraidos = [] 
    
    for item in result:
        texto = item[1][0] 
        print(texto)
        textos_extraidos.append(texto)
    return textos_extraidos

def simplificaTextos(textos_extraidos):
    textos_extraidos_simplificados = [texto.lower().replace(" ", "") for texto in textos_extraidos]   
    print("Textos extraídos simplificados:")
    print(textos_extraidos_simplificados)
    return textos_extraidos_simplificados

#Herramientas para DNI Panamá.

def buscaIndexPalabra(arreglo, palabra):
    palabra_limpia = palabra.lower().replace(" ", "")
    for i, texto_limpio in enumerate(arreglo):
        if palabra_limpia in texto_limpio:
            return i
    return None # Cambiado de 'error' a None

def buscaIndexMultiplesPalabras(arreglo_textos, conceptos_requeridos):
    """
    Busca el índice de la primera línea que contiene todas las palabras requeridas (o sus alternativas)
    y devuelve la línea con las alternativas corregidas a su forma preferida.

    Args:
        arreglo (list): Lista de strings de texto extraído (limpios).
        conceptos_requeridos (list): Lista de diccionarios, donde cada diccionario define un concepto:
                                    Ej: {'preferida': 'nacimiento', 'alternativas': ['nacimento', 'nacimuento']}

    Returns:
        tuple: (índice, arreglo_corregido) si se encuentra, o (None, None) si no se encuentra.
    """
    print(f"\n--- Entre a busqueda palabras index ---")
        
    # Paso 1: Normalizar los conceptos y prepararlos para la búsqueda y corrección
    conceptos_preparados = []
    for concepto in conceptos_requeridos:
        print("Preparación de conceptos, estoy en el concepto: ", concepto)
        preferida = concepto['preferida'].lower().replace(" ", "")
        alternativas = [alt.lower().replace(" ", "") for alt in concepto.get('alternativas', [])]
        
        # Combinamos la preferida con las alternativas para la búsqueda
        todas_las_formas = [preferida] + alternativas
        print("Todas las formas quedó como: ", todas_las_formas)
        
        conceptos_preparados.append({
            'preferida': preferida,
            'todas_las_formas': todas_las_formas,
        })

        print("Conceptos preparados quedó como: ", conceptos_preparados)

    for i, texto_linea in enumerate(arreglo_textos):
        texto_linea_lower = texto_linea.lower()
        print("Trabajando la línea: ", texto_linea_lower)
        
        # Variables para seguir el rastro de la línea actual
        es_coincidencia_completa = False
        print("La var es_coincidencia_completa empieza como false...")
        palabras_encontradas_en_linea = {} # Almacena {forma_encontrada: forma_preferida}

        # Paso 2: Verificar si TODAS las condiciones se cumplen en esta línea
        for concepto in conceptos_preparados:
            encontrado_en_esta_linea = False
            print("Revisando CONCEPTO: ", concepto)
            
            # Buscamos si alguna forma (preferida o alternativa) está en la línea
            for forma in concepto['todas_las_formas']:
                print("Evaluando la siguiente forma en el concepto: Forma: ", forma)
                print(f"Ahora, si la forma --{forma}-- está en la línea: --{texto_linea_lower}--, entonces: ")
                if forma in texto_linea_lower:
                    print("Encontrado línea es True!")
                    encontrado_en_esta_linea = True
                    
                    # Guardamos qué forma se encontró y cuál es la preferida
                    palabras_encontradas_en_linea[forma] = concepto['preferida']
                    
                    print("Estoy por hacer break porque encontré la línea...")
                    # Hemos encontrado una forma para este concepto, pasamos al siguiente concepto
                    break #Éste break entonces si se sale del for. De no hacerlo, volvería arriba.

            if encontrado_en_esta_linea:
                es_coincidencia_completa = True
                print(f"Línea {i}: Concepto '{concepto['preferida']}' : Encontrado.")
                break # Se sale del for grande.
            
            
        print("Paso: if es_coincidencia_completa:")  
        # Paso 3: Si se encontró una coincidencia completa, corregimos la línea y la retornamos
        if es_coincidencia_completa:
            print("Aquí llega cuando encuentra algo, en su línea respectiva, pero cuando no encuentra nada, se queda en cero.")
            print(f"ÉXITO: Coincidencia completa en el índice {i}.")
            print(f"Texto linea es: {texto_linea}")

            linea_corregida = texto_linea
            
            for forma_encontrada, forma_preferida in palabras_encontradas_en_linea.items():
                patron_reemplazo = re.compile(re.escape(forma_encontrada), re.IGNORECASE)
                linea_corregida = patron_reemplazo.sub(forma_preferida, linea_corregida, count=1)
            
            print(f"Línea corregida: '{linea_corregida}'")
            arreglo_textos[i] = linea_corregida
            
            return i, arreglo_textos
    
    print("Paso: Búsqueda finalizada.:")
    print(f"\n--- Búsqueda finalizada ---")
    print("Ninguna línea contiene todas las palabras requeridas.")
    return None, None