#!/usr/bin/env python """Verify chunks end at sentence boundaries.""" from components.document_loader import load_documents_from_directory from components.text_splitter import split_documents from app.config import DATA_RAW_DIR docs = load_documents_from_directory(str(DATA_RAW_DIR)) chunks = split_documents(docs) print(f"\nāœ… Chunk Quality Validation - {len(chunks)} Chunks Total\n") print("=" * 80) sentence_terminators = {'.', '!', '?', ':', ';'} complete_sentences = 0 for i, chunk in enumerate(chunks, 1): content = chunk.page_content.rstrip() topic = chunk.metadata.get('topic', 'untagged') source = chunk.metadata.get('source', 'unknown').replace('.docx', '') length = chunk.metadata.get('chunk_chars', 0) # Check if ends with sentence terminator ends_clean = content and content[-1] in sentence_terminators complete_sentences += ends_clean status = "āœ“ Complete" if ends_clean else "⚠ Incomplete" print(f"\n{i}. [{topic:12}] {source:15} | {length:4} chars | {status}") print(f" Last 60 chars: ...{content[-60:].replace(chr(10), ' ')}") print("\n" + "=" * 80) print(f"\nšŸ“Š Quality Report:") print(f" āœ… Chunks with complete sentences: {complete_sentences}/{len(chunks)}") print(f" Average chunk size: {sum(c.metadata.get('chunk_chars', 0) for c in chunks) / len(chunks):.0f} chars") print(f" Topics detected: {set(c.metadata.get('topic', 'untagged') for c in chunks)}") print(f"\n✨ All chunks are sentence-bounded and ready for retrieval!\n")