Spaces:
Runtime error
Runtime error
import gradio as gr | |
from setfit import SetFitModel | |
# Import libraries | |
import PyPDF2 | |
import openpyxl | |
import os | |
import glob | |
import re | |
import itertools | |
import platform | |
from tempfile import TemporaryDirectory | |
from pathlib import Path | |
import pytesseract | |
from pdf2image import convert_from_path | |
from PIL import Image | |
from gradio_client import Client | |
client = Client("https://9bc24cb52607aad436.gradio.live/") | |
def ocrtotext(filename): | |
# Almacena todas las páginas del PDF en una variable | |
image_file_list = [] # Lista para almacenar los nombres de los archivos de imagen | |
PDF_file = filename # Nombre del archivo PDF | |
text_file = (f'{filename}.txt') # Nombre del archivo de texto de salida | |
# Parte #1: Convirtiendo el PDF a imágenes | |
pdf_pages = convert_from_path(PDF_file, 300) | |
# Lee el archivo PDF a 300 DPI | |
# Itera a través de todas las páginas almacenadas arriba | |
for page_enumeration, page in enumerate(pdf_pages, start=1): | |
# Crea un nombre de archivo para almacenar la imagen | |
filename = f"page_{page_enumeration:03}.jpg" | |
# Guarda la imagen de la página en el sistema | |
page.save(filename, "JPEG") | |
image_file_list.append(filename) | |
# Parte #2: Reconociendo texto desde las imágenes usando OCR | |
output = '' # Variable para almacenar el texto reconocido | |
# Abre el archivo en modo de apendizaje para agregar contenido de todas las imágenes al mismo archivo | |
with open(text_file, "a") as output_file: | |
# Itera desde 1 hasta el número total de páginas | |
for image_file in image_file_list: | |
# Reconoce el texto en la imagen usando pytesseract | |
#text = str(((pytesseract.image_to_string(Image.open(image_file), lang="spa")))) | |
text = str(((pytesseract.image_to_string(Image.open(image_file))))) | |
# Elimina los guiones al final de las líneas | |
text = text.replace("-\n", "") | |
# Agrega el texto reconocido a la variable de salida | |
output += text | |
# Escribe el texto reconocido en el archivo de salida | |
output_file.write(output) | |
return output | |
def cortar_en_bloques(texto, longitud_bloque): | |
palabras = texto.split() | |
bloques = [] | |
bloque_actual = [] | |
for palabra in palabras: | |
bloque_actual.append(palabra) | |
if len(bloque_actual) == longitud_bloque: | |
bloques.append(" ".join(bloque_actual)) | |
bloque_actual = [] | |
# Si queda un bloque parcial al final, agregarlo | |
if bloque_actual: | |
bloques.append(" ".join(bloque_actual)) | |
return bloques | |
# Cargar el modelo | |
model = SetFitModel.from_pretrained("desarrolloasesoreslocales/SetFitPruebaRecorte") | |
# Mapear las etiquetas | |
# Definir la función de predicción | |
def predict(file): | |
recorte_general = "" | |
ocr_text = ocrtotext(file.name) | |
# Crear chunks | |
chunks = cortar_en_bloques(ocr_text, 150) | |
first = -1 | |
margin = int(len(chunks) * 0.25) | |
chunks_removable = chunks[:margin] + chunks[-margin:] | |
for i in range(len(chunks)): | |
print('Recortando -', round((i/len(chunks))*100), '%') | |
if chunks[i] not in chunks_removable or model.predict([chunks[i]]).item() == 1: | |
if first == -1: | |
first = i | |
recorte_general += chunks[i] + " " | |
if first > 0: | |
recorte_general = chunks[first-1] + recorte_general | |
print(100, '%') | |
recorte_final = "" | |
# Definir tamñano de fragmentos de texto | |
# text_splitter2 = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0, length_function=len) | |
# Crear chunks | |
chunks2 = cortar_en_bloques(recorte_general, 80) | |
margin_s = int(len(chunks2) * 0.1) | |
margin_e = int(len(chunks2) * 0.1) | |
# if margin_s > 1: | |
chunks_removable2 = chunks2[:margin_s] + chunks2[-margin_e:] | |
# chunks_removable2 = chunks2[-margin_e:] | |
for i in range(len(chunks2)): | |
print('Recortando -', round((i/len(chunks2))*100), '%') | |
if chunks2[i] not in chunks_removable2 or model.predict([chunks2[i]]).item() == 1: | |
recorte_final += chunks2[i] + " " | |
print(100, '%') | |
result = client.predict( | |
recorte_final, # str in 'text' Textbox component | |
api_name="/predict" | |
) | |
return result | |
# Crear una interfaz Gradio | |
iface = gr.Interface( | |
fn=predict, | |
inputs=gr.inputs.File(), | |
outputs=gr.Textbox(), | |
live=False, | |
title="Recortador de Texto" | |
) | |
# Iniciar la interfaz Gradio | |
iface.launch() |