|
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" |
|
) |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
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 |
|
|
|
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 ---") |
|
|
|
|
|
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', [])] |
|
|
|
|
|
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) |
|
|
|
|
|
es_coincidencia_completa = False |
|
print("La var es_coincidencia_completa empieza como false...") |
|
palabras_encontradas_en_linea = {} |
|
|
|
|
|
for concepto in conceptos_preparados: |
|
encontrado_en_esta_linea = False |
|
print("Revisando CONCEPTO: ", concepto) |
|
|
|
|
|
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 |
|
time.sleep(7) |
|
|
|
|
|
palabras_encontradas_en_linea[forma] = concepto['preferida'] |
|
|
|
print("Estoy por hacer break porque encontré la línea...") |
|
|
|
break |
|
|
|
print("Paso if encontrado_en_esta_linea es True...") |
|
if encontrado_en_esta_linea: |
|
es_coincidencia_completa = True |
|
print(f"Línea {i}: Concepto '{concepto['preferida']}' : Encontrado.") |
|
print("Estoy por hacer break por que es_coincidencia_completa es True...") |
|
break |
|
|
|
|
|
print("Paso: if es_coincidencia_completa:") |
|
|
|
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 |