Spaces:
Running
Running
from setup.easy_imports import PyPDFLoader, RecursiveCharacterTextSplitter, Document | |
from typing import List, Dict, Tuple, Optional | |
from _utils.models.gerar_relatorio import ( | |
DocumentChunk, | |
) | |
import uuid | |
class Splitter: | |
def __init__( | |
self, | |
chunk_size, | |
chunk_overlap, | |
): | |
self.text_splitter = RecursiveCharacterTextSplitter( | |
chunk_size=chunk_size, chunk_overlap=chunk_overlap | |
) | |
self.chunk_metadata = {} # Store chunk metadata for tracing | |
def load_and_split_document(self, pdf_path: str) -> List[DocumentChunk]: | |
"""Load PDF and split into chunks with metadata""" | |
loader = PyPDFLoader(pdf_path) | |
pages = ( | |
loader.load() | |
) # Gera uma lista de objetos Document, sendo cada item da lista referente a UMA PÁGINA inteira do PDF. | |
chunks = [] | |
char_count = 0 | |
for page in pages: | |
text = page.page_content | |
page_chunks = self.text_splitter.split_text( | |
text | |
) # Quebra o item que é um Document de UMA PÁGINA inteira em um lista onde cada item é referente a um chunk, que são pedaços menores do que uma página. | |
for chunk in page_chunks: | |
chunk_id = str(uuid.uuid4()) | |
start_char = text.find( | |
chunk | |
) # Retorna a posição onde se encontra o chunk dentro da página inteira | |
end_char = start_char + len(chunk) | |
doc_chunk = DocumentChunk( # Gera o objeto do chunk com informações adicionais, como a posição e id do chunk | |
content=chunk, | |
page_number=page.metadata.get("page") + 1, # 1-based page numbering | |
chunk_id=chunk_id, | |
start_char=char_count + start_char, | |
end_char=char_count + end_char, | |
) | |
chunks.append(doc_chunk) | |
# Store metadata for later retrieval | |
self.chunk_metadata[chunk_id] = { | |
"page": doc_chunk.page_number, | |
"start_char": doc_chunk.start_char, | |
"end_char": doc_chunk.end_char, | |
} | |
char_count += len(text) | |
return chunks | |
def load_and_split_text(self, text: str) -> List[DocumentChunk]: | |
"""Load Text and split into chunks with metadata - Criei essa função apenas para o ragas""" | |
page = Document(page_content=text, metadata={"page": 1}) | |
chunks = [] | |
char_count = 0 | |
text = page.page_content | |
page_chunks = self.text_splitter.split_text( | |
text | |
) # Quebra o item que é um Document de UMA PÁGINA inteira em um lista onde cada item é referente a um chunk, que são pedaços menores do que uma página. | |
print("\n\n\n") | |
print("page_chunks: ", page_chunks) | |
for chunk in page_chunks: | |
chunk_id = str(uuid.uuid4()) | |
start_char = text.find( | |
chunk | |
) # Retorna a posição onde se encontra o chunk dentro da página inteira | |
end_char = start_char + len(chunk) | |
doc_chunk = DocumentChunk( # Gera o objeto do chunk com informações adicionais, como a posição e id do chunk | |
content=chunk, | |
page_number=page.metadata.get("page") + 1, # 1-based page numbering | |
chunk_id=chunk_id, | |
start_char=char_count + start_char, | |
end_char=char_count + end_char, | |
) | |
chunks.append(doc_chunk) | |
# Store metadata for later retrieval | |
self.chunk_metadata[chunk_id] = { | |
"page": doc_chunk.page_number, | |
"start_char": doc_chunk.start_char, | |
"end_char": doc_chunk.end_char, | |
} | |
char_count += len(text) | |
return chunks | |