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(self,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(self,texto,chunk_size,chunk_overlap): """ Divide el texto en chunks Args: chunk_size (int): Largo del chunk. chunk_overlap (int): Sobreposicion de chunks texto (list): lista de textos a procesar Returns: list: Los textos limpios. """ splitter=RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=chunk_overlap, length_function=len, separators=["\n\n","\n"," ",""] ) chunks=splitter.create_documents(texto) return chunks