Spaces:
Runtime error
Runtime error
File size: 4,400 Bytes
568ea9a bb4c496 ccbb379 bb4c496 56c25ef 4db117d bb4c496 0d5c6ec bb4c496 568ea9a 29cd488 568ea9a 9ed2b36 23d75e8 04f18c0 9ed2b36 04f18c0 bb4c496 04f18c0 c5be12e 04f18c0 c8c1181 568ea9a bb4c496 3b8e1b8 568ea9a 3b8e1b8 568ea9a |
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 |
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() |