Jajula Chunking Documentation
Welcome to the comprehensive documentation for the Jajula Chunking library. This library provides various text chunking strategies optimized for RAG (Retrieval-Augmented Generation) applications.
Table of Contents
- Installation
- Quick Start
- Core Concepts
- Chunking Strategies
- Utilities
- Advanced Usage
- API Reference
- Examples
- Best Practices
- Troubleshooting
Installation
Basic Installation
pip install jajula-chunking
Installation with Optional Dependencies
# For development
pip install jajula-chunking[dev]
# For documentation
pip install jajula-chunking[docs]
# For semantic chunking (requires more resources)
pip install jajula-chunking
pip install torch sentence-transformers
System Requirements
- Python 3.8 or higher
- 4GB+ RAM (8GB+ recommended for semantic chunking)
- 2GB+ disk space for models
Quick Start
Basic Usage
from jajula_chunking import FixedSizeChunker
# Create a chunker
chunker = FixedSizeChunker(chunk_size=500, overlap=50)
# Chunk your text
text = "Your long text here..."
chunks = chunker.chunk(text)
# Process chunks
for chunk in chunks:
print(f"ID: {chunk.chunk_id}")
print(f"Content: {chunk.content}")
print(f"Metadata: {chunk.metadata}")
print("---")
Multiple Strategies
from jajula_chunking import (
SentenceBasedChunker,
ParagraphBasedChunker,
AdaptiveChunker
)
# Sentence-based chunking
sentence_chunker = SentenceBasedChunker(max_sentences=3)
sentence_chunks = sentence_chunker.chunk(text)
# Paragraph-based chunking
paragraph_chunker = ParagraphBasedChunker(max_paragraphs=2)
paragraph_chunks = paragraph_chunker.chunk(text)
# Adaptive chunking (automatically selects best strategy)
adaptive_chunker = AdaptiveChunker()
adaptive_chunks = adaptive_chunker.chunk(text)
Core Concepts
Chunk Object
Each chunk is represented by a Chunk object with the following attributes:
content: The actual text contentchunk_id: Unique identifier for the chunkstart_index: Starting position in original textend_index: Ending position in original textmetadata: Additional information about the chunk
Base Chunker
All chunkers inherit from BaseChunker, which provides:
- Common configuration management
- Input validation
- Chunk ID generation
- Error handling
Chunking Strategies
The library offers 9 different chunking strategies, each optimized for different use cases:
- Fixed Size: Consistent chunk sizes
- Sentence Based: Semantic coherence
- Paragraph Based: Document structure
- Semantic: AI-powered similarity
- Hierarchical: Multi-level organization
- Structure Based: HTML/Markdown aware
- Token Based: LLM token counting
- Recursive: Multi-separator approach
- Adaptive: Automatic strategy selection
Chunking Strategies
1. Fixed Size Chunker
Best for: Consistent chunk sizes, simple text processing
from jajula_chunking import FixedSizeChunker
chunker = FixedSizeChunker(
chunk_size=1000, # Characters per chunk
overlap=100, # Overlapping characters
split_on_word=True # Avoid breaking words
)
chunks = chunker.chunk(text)
Parameters:
chunk_size: Target chunk size in charactersoverlap: Number of overlapping characterssplit_on_word: Whether to respect word boundaries
2. Sentence Based Chunker
Best for: Maintaining semantic coherence, natural language text
from jajula_chunking import SentenceBasedChunker
chunker = SentenceBasedChunker(
max_sentences=5, # Sentences per chunk
overlap_sentences=1, # Overlapping sentences
language='english' # Language for tokenization
)
chunks = chunker.chunk(text)
Parameters:
max_sentences: Maximum sentences per chunkoverlap_sentences: Number of overlapping sentenceslanguage: Language for sentence tokenization
3. Paragraph Based Chunker
Best for: Document structure, articles, reports
from jajula_chunking import ParagraphBasedChunker
chunker = ParagraphBasedChunker(
max_paragraphs=3, # Paragraphs per chunk
overlap_paragraphs=1, # Overlapping paragraphs
paragraph_separators=None # Custom separators
)
chunks = chunker.chunk(text)
Parameters:
max_paragraphs: Maximum paragraphs per chunkoverlap_paragraphs: Number of overlapping paragraphsparagraph_separators: Custom paragraph separator patterns
4. Semantic Chunker
Best for: Technical documents, complex content, AI applications
from jajula_chunking import SemanticChunker
chunker = SemanticChunker(
model_name='all-MiniLM-L6-v2', # Sentence transformer model
similarity_threshold=0.6, # Similarity threshold
max_chunk_size=1000, # Maximum chunk size
min_sentences_per_chunk=1 # Minimum sentences per chunk
)
chunks = chunker.chunk(text)
Parameters:
model_name: Sentence transformer model to usesimilarity_threshold: Threshold for splitting chunksmax_chunk_size: Maximum chunk size in charactersmin_sentences_per_chunk: Minimum sentences per chunk
Note: Requires sentence-transformers and torch to be installed.
5. Hierarchical Chunker
Best for: Multi-level documents, complex organization
from jajula_chunking import HierarchicalChunker
# Custom hierarchical levels
levels = [
{'name': 'document', 'max_size': 10000, 'chunker': 'paragraph'},
{'name': 'section', 'max_size': 3000, 'chunker': 'sentence'},
{'name': 'paragraph', 'max_size': 1000, 'chunker': 'fixed'},
{'name': 'sentence', 'max_size': 200, 'chunker': 'word'}
]
chunker = HierarchicalChunker(levels=levels, overlap=100)
chunks = chunker.chunk(text)
# Get hierarchy information
tree = chunker.get_hierarchy_tree(chunks)
root_chunks = chunker.get_root_chunks(chunks)
leaf_chunks = chunker.get_leaf_chunks(chunks)
6. Structure Based Chunker
Best for: HTML, Markdown, and structured documents
from jajula_chunking import StructureBasedChunker
chunker = StructureBasedChunker(
max_chunk_size=1000, # Maximum chunk size
overlap=100, # Overlapping characters
preserve_structure=True # Maintain document structure
)
chunks = chunker.chunk(html_text)
chunks = chunker.chunk(markdown_text)
Features:
- Automatic HTML/Markdown detection
- Structure-aware chunking
- Element type preservation
7. Token Based Chunker
Best for: LLM applications, token counting
from jajula_chunking import TokenBasedChunker
chunker = TokenBasedChunker(
max_tokens=512, # Maximum tokens per chunk
overlap_tokens=50, # Overlapping tokens
model_name="gpt-3.5-turbo" # OpenAI model for tokenizer
)
chunks = chunker.chunk(text)
# Count tokens in text
token_count = chunker.count_tokens(text)
Note: Requires tiktoken to be installed.
8. Recursive Chunker
Best for: Complex text with multiple separators
from jajula_chunking import RecursiveChunker
# Custom separators in order of preference
separators = [
"\n\n", # Double newline (paragraphs)
"\n", # Single newline
". ", # Sentence endings
" ", # Spaces
"" # No separator (character-level)
]
chunker = RecursiveChunker(
separators=separators,
chunk_size=1000,
overlap=100
)
chunks = chunker.chunk(text)
# Modify separators
chunker.add_separator("; ", position=2)
chunker.remove_separator("\n")
9. Adaptive Chunker
Best for: Automatic strategy selection, mixed content
from jajula_chunking import AdaptiveChunker
chunker = AdaptiveChunker(
max_chunk_size=1000,
overlap=100,
enable_semantic=True
)
# Automatic chunking
chunks = chunker.chunk(text)
# Get strategy recommendation
recommendation = chunker.get_strategy_recommendation(text)
print(f"Recommended: {recommendation['recommended_strategy']}")
print(f"Reasoning: {recommendation['reasoning']}")
print(f"Alternatives: {recommendation['alternative_strategies']}")
# Get available strategies
strategies = chunker.get_available_strategies()
Utilities
Text Processor
from jajula_chunking import TextProcessor
# Clean text
cleaned_text = TextProcessor.clean_text(
text,
remove_html=True,
normalize_whitespace=True,
remove_special_chars=False
)
# Extract information
sentences = TextProcessor.extract_sentences(text)
paragraphs = TextProcessor.extract_paragraphs(text)
words = TextProcessor.extract_words(text, min_length=3)
keywords = TextProcessor.extract_keywords(text, max_keywords=10)
# Get statistics
stats = TextProcessor.get_text_statistics(text)
print(f"Characters: {stats['characters']}")
print(f"Words: {stats['words']}")
print(f"Sentences: {stats['sentences']}")
print(f"Paragraphs: {stats['paragraphs']}")
# Language detection
language = TextProcessor.detect_language(text)
# Split into chunks
chunks = TextProcessor.split_text_into_chunks(text, chunk_size=500, overlap=50)
Chunk Validator
from jajula_chunking import ChunkValidator
# Validate single chunk
validation = ChunkValidator.validate_chunk(
chunk,
min_length=10,
max_length=10000
)
print(f"Valid: {validation['is_valid']}")
print(f"Score: {validation['score']}/100")
print(f"Errors: {validation['errors']}")
print(f"Warnings: {validation['warnings']}")
# Validate multiple chunks
validation_result = ChunkValidator.validate_chunks(chunks)
print(f"Overall valid: {validation_result['is_valid']}")
print(f"Overall score: {validation_result['overall_score']}/100")
print(f"Valid chunks: {validation_result['summary']['valid_chunks']}")
# Get improvement suggestions
suggestions = ChunkValidator.suggest_improvements(validation_result)
for suggestion in suggestions:
print(f"- {suggestion}")
# Get chunk statistics
stats = ChunkValidator.get_chunk_statistics(chunks)
print(f"Total chunks: {stats['total_chunks']}")
print(f"Average length: {stats['avg_chunk_length']:.1f}")
print(f"Chunk types: {stats['chunk_types']}")
Advanced Usage
Custom Chunking Strategy
from jajula_chunking.chunkers.base import BaseChunker, Chunk
class CustomChunker(BaseChunker):
def __init__(self, custom_param=100, **kwargs):
super().__init__(**kwargs)
self.custom_param = custom_param
def chunk(self, text):
self._validate_input(text)
# Custom chunking logic here
chunks = []
# ... implementation ...
return chunks
Batch Processing
from jajula_chunking import AdaptiveChunker, ChunkValidator
# Process multiple documents
documents = [
{"id": "doc1", "content": "Content 1..."},
{"id": "doc2", "content": "Content 2..."},
{"id": "doc3", "content": "Content 3..."}
]
chunker = AdaptiveChunker()
all_chunks = []
for doc in documents:
chunks = chunker.chunk(doc["content"])
# Add document metadata
for chunk in chunks:
chunk.metadata["document_id"] = doc["id"]
all_chunks.extend(chunks)
# Validate all chunks
validation = ChunkValidator.validate_chunks(all_chunks)
print(f"Batch processing complete: {validation['summary']['total_chunks']} chunks")
Performance Optimization
# For large documents, use streaming approach
def stream_chunks(text, chunker, batch_size=1000):
"""Stream chunks in batches to reduce memory usage."""
chunks = chunker.chunk(text)
for i in range(0, len(chunks), batch_size):
batch = chunks[i:i + batch_size]
yield batch
# Usage
chunker = FixedSizeChunker(chunk_size=500)
for batch in stream_chunks(large_text, chunker):
# Process batch
process_chunks(batch)
API Reference
Base Classes
BaseChunker
Methods:
chunk(text: str) -> List[Chunk]: Abstract method for chunking_validate_input(text: str) -> None: Validate input text_get_next_id() -> str: Generate unique chunk IDget_config() -> Dict[str, Any]: Get chunker configurationreset_counter() -> None: Reset chunk counter
Chunk
Attributes:
content: str: Chunk text contentchunk_id: str: Unique identifierstart_index: int: Starting positionend_index: int: Ending positionmetadata: Dict[str, Any]: Additional information
Configuration
All chunkers support keyword arguments for configuration:
chunker = SomeChunker(
param1=value1,
param2=value2,
custom_param="custom_value"
)
# Access configuration
config = chunker.get_config()
Examples
Basic Examples
See examples/basic_usage.py for comprehensive basic examples.
Advanced Examples
See examples/advanced_examples.py for advanced features and complex scenarios.
Running Examples
# Basic examples
python examples/basic_usage.py
# Advanced examples
python examples/advanced_examples.py
Best Practices
1. Choose the Right Strategy
- Fixed Size: For consistent chunk sizes and simple processing
- Sentence Based: For maintaining semantic coherence
- Paragraph Based: For document structure preservation
- Semantic: For complex content and AI applications
- Adaptive: For automatic strategy selection
2. Optimize Chunk Sizes
- Too small: May lose context and coherence
- Too large: May reduce retrieval precision
- Optimal range: 200-1000 characters for most RAG applications
3. Handle Overlap Appropriately
- Low overlap: Better for storage efficiency
- High overlap: Better for retrieval continuity
- Recommended: 10-20% of chunk size
4. Validate Your Chunks
# Always validate chunks
validation = ChunkValidator.validate_chunks(chunks)
if not validation['is_valid']:
print("Chunk validation failed!")
print(f"Errors: {validation['errors']}")
5. Use Text Preprocessing
# Clean text before chunking
cleaned_text = TextProcessor.clean_text(
text,
remove_html=True,
normalize_whitespace=True
)
6. Monitor Performance
import time
start_time = time.time()
chunks = chunker.chunk(text)
processing_time = time.time() - start_time
print(f"Processed {len(chunks)} chunks in {processing_time:.2f} seconds")
Troubleshooting
Common Issues
1. Import Errors
# Install missing dependencies
pip install nltk beautifulsoup4 numpy scikit-learn
2. NLTK Data Missing
import nltk
nltk.download('punkt')
3. Semantic Chunking Fails
# Install required packages
pip install torch sentence-transformers
4. Token Counting Errors
# Install tiktoken
pip install tiktoken
5. Memory Issues
- Reduce chunk sizes
- Process documents in batches
- Use streaming approaches
- Monitor memory usage
Performance Tips
- Use appropriate chunk sizes for your use case
- Enable semantic chunking only when needed
- Process large documents in batches
- Cache chunkers for repeated use
- Monitor resource usage during processing
Debug Mode
import logging
# Enable debug logging
logging.basicConfig(level=logging.DEBUG)
# Chunkers will now provide detailed logging
chunker = FixedSizeChunker(chunk_size=500)
chunks = chunker.chunk(text)
Contributing
We welcome contributions! Please see our contributing guidelines for details.
Support
- Documentation: [Link to docs]
- Issues: [GitHub Issues]
- Discussions: [GitHub Discussions]
- Email: contact@jajula.com
License
This project is licensed under the MIT License - see the LICENSE file for details.
Metadata
Release files for jajula-chunking 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| jajula_chunking-0.1.4.tar.gz | 67.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jajula_chunking-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 97.8 kB
Release files / jajula_chunking-0.1.4.tar.gz
| Download URL | jajula_chunking-0.1.4.tar.gz |
|---|---|
| Size | 67.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1ba6f9a12eae50e521137417129b3a35fd19e1b6aa7646a76439c92d03bd8c8b
|
|
BLAKE2b-256 checksum How to use checksums |
78e10e3e650b45edf97502c1c64f7df8926263260c311509fd3268f1c5beb91e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.2
|
Release files / jajula_chunking-0.1.4-py3-none-any.whl
| Download URL | jajula_chunking-0.1.4-py3-none-any.whl |
|---|---|
| Size | 30.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
52c2cc9f1787222a63e550e225f36bc26fe66eb9893d81955755dfa2ad2697b7
|
|
BLAKE2b-256 checksum How to use checksums |
1631fcdc9f90e12fb572f2a3032388223845958b15bf8dae9e15edefcc422ca7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.2
|
Security for jajula-chunking 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.