Spaces:
Runtime error
Runtime error
from langchain_community.document_loaders import PyMuPDFLoader | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
import re | |
class Loader: | |
"""Clase encargada de la carga desde PDFs, | |
admite PDFs con texto seleccionable unicamente. Realiza | |
carga y devuelve lista de chunks de texto. | |
""" | |
def __init__(self, path: str): | |
self.path = path | |
def load_docs(self, pag: slice = None): | |
"""Carga el PDF y devuelve lista de chunks de texto.""" | |
loader = PyMuPDFLoader(self.path) | |
docs = loader.load() | |
if pag: | |
docs = docs[pag] | |
return [doc.page_content for doc in docs] | |
def limpiar_texto(texto: str) -> str: | |
""" | |
Limpia el texto eliminando caracteres basura y normalizando espacios y saltos de línea. | |
Esta función está diseñada para preprocesar libros u otros documentos largos, | |
facilitando su uso en aplicaciones de Retrieval Augmented Generation (RAG). | |
Args: | |
texto (str): El texto original a limpiar. | |
Returns: | |
str: El texto limpio. | |
""" | |
# 1. Eliminar saltos de línea, tabulaciones y otros caracteres de control | |
texto = re.sub(r'[\r\n\t]+', ' ', texto) | |
# 2. Eliminar caracteres no imprimibles (códigos de control) | |
texto = re.sub(r'[\x00-\x1F\x7F]', '', texto) | |
# 3. Sustituir múltiples espacios por uno solo | |
texto = re.sub(r'\s+', ' ', texto) | |
# 4. Eliminar caracteres que no sean letras, dígitos o signos de puntuación comunes | |
# Se conservan letras con acentos y caracteres propios del español. | |
texto = re.sub(r'[^\w\s.,;:¡!¿?\-áéíóúÁÉÍÓÚñÑ]', '', texto) | |
# 5. Eliminar espacios al inicio y al final | |
texto = texto.strip() | |
return texto | |
def splitter(texto, chunk_size, chunk_overlap): | |
""" | |
Divide el texto en chunks | |
Args: | |
chunk_size (int): Largo del chunk. | |
chunk_overlap (int): Sobreposición de chunks. | |
texto (list): lista de textos a procesar. | |
Returns: | |
list: Los textos en chunks. | |
""" | |
splitter = RecursiveCharacterTextSplitter( | |
chunk_size=chunk_size, | |
chunk_overlap=chunk_overlap, | |
length_function=len, | |
separators=["\n\n", "\n", " ", ""] | |
) | |
chunks = splitter.create_documents(texto) | |
return chunks | |