rad / herramientas.py
Moibe's picture
Buscador de palabras múltiples arreglado
d9436e3
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
time.sleep(7)
# 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.
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 # 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