Spaces:
Sleeping
Sleeping
| 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 | |