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] @staticmethod 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 @staticmethod 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