Text Splitters
On this page
Module: chunks.text_splitter
Import: from zerda.chunks import CharacterTextSplitter, RecursiveCharacterTextSplitter, TokenTextSplitter, SentenceTextSplitter
LangChain-compatible text splitters. All inherit from TextSplitter (see Base Classes).
Table of Contents
- TextSplitter Base
- CharacterTextSplitter
- RecursiveCharacterTextSplitter
- TokenTextSplitter
- SentenceTextSplitter
- Common Patterns
TextSplitter Base
All splitters share these methods:
class TextSplitter(ABC):
def split_text(self, text: str) -> List[str]: ... # abstract
def split_documents(self, documents: List[Document]) -> List[Document]: ...
def create_documents(
self,
texts: List[str],
metadatas: Optional[List[dict]] = None,
) -> List[Document]: ...
split_documentssplits eachDocument.page_contentand returns newDocumentobjects with preserved (and extended) metadata.create_documentswraps plain strings inDocumentobjects then splits.
CharacterTextSplitter
Splits text at a single separator string, then merges pieces back up to chunk_size with chunk_overlap characters of context.
CharacterTextSplitter(
separator: str = "\n\n",
chunk_size: int = 1000,
chunk_overlap: int = 200,
length_function: Callable[[str], int] = len,
keep_separator: bool = False,
strip_whitespace: bool = True,
config: Optional[ChunkConfig] = None,
)
Parameters
Algorithm
- Split text on
separator. - Filter empty strings.
- Merge adjacent pieces into chunks ≤
chunk_size, addingchunk_overlapcontext between. - Return
List[str].
Example
from zerda.chunks import CharacterTextSplitter
splitter = CharacterTextSplitter(separator="\n\n", chunk_size=500, chunk_overlap=50)
texts = splitter.split_text(raw_text)
RecursiveCharacterTextSplitter
Tries a list of separators from most-to-least preferred, recursively splitting until all pieces are ≤ chunk_size.
RecursiveCharacterTextSplitter(
separators: Optional[List[str]] = None,
chunk_size: int = 1000,
chunk_overlap: int = 200,
length_function: Callable[[str], int] = len,
keep_separator: bool = False,
arabic_mode: bool = False,
config: Optional[ChunkConfig] = None,
)
Parameters
Default Separators
English (arabic_mode=False):
["\n\n", "\n", ". ", "! ", "? ", "; ", ", ", " ", ""]
Arabic (arabic_mode=True):
["\n\n", "\n", "؟ ", "! ", ". ", "؛ ", "، ", " ", ""]
Algorithm
split_text(text):
for sep in separators:
splits = text.split(sep)
good = [s for s in splits if len(s) <= chunk_size]
oversized = [s for s in splits if len(s) > chunk_size]
recursively split oversized with remaining separators
merge good pieces up to chunk_size with overlap
Examples
from zerda.chunks import RecursiveCharacterTextSplitter
# English
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = splitter.split_text(document)
# Arabic
arabic_splitter = RecursiveCharacterTextSplitter(
arabic_mode=True,
chunk_size=400,
chunk_overlap=80,
)
texts = arabic_splitter.split_text(arabic_document)
TokenTextSplitter
Splits text by token count using tiktoken. Requires pip install tiktoken.
TokenTextSplitter(
encoding_name: str = "cl100k_base",
chunk_size: int = 1000,
chunk_overlap: int = 200,
config: Optional[ChunkConfig] = None,
)
Parameters
Algorithm
tiktoken.get_encoding(encoding_name)— loads encoding (cached).encoding.encode(text)→ token ID list.- Slides a window of
chunk_sizetokens withchunk_overlapstep. encoding.decode(window)→ string chunk.
Raises
ImportErroriftiktokenis not installed.
Example
from zerda.chunks import TokenTextSplitter
splitter = TokenTextSplitter(
encoding_name="cl100k_base",
chunk_size=256,
chunk_overlap=32,
)
texts = splitter.split_text(long_text)
SentenceTextSplitter
Splits at sentence boundaries (., !, ?, ؟), then groups sentences into chunks by character count.
SentenceTextSplitter(
chunk_size: int = 1000,
chunk_overlap: int = 200,
sentence_endings: Optional[List[str]] = None,
config: Optional[ChunkConfig] = None,
)
Parameters
Algorithm
- Regex split on
[.!?؟]+\s+. - Group sentences into chunks ≤
chunk_size. - Apply character overlap by carrying tail sentences.
Example
from zerda.chunks import SentenceTextSplitter
splitter = SentenceTextSplitter(chunk_size=400, chunk_overlap=60)
texts = splitter.split_text(article_text)
Common Patterns
LangChain-Style Document Splitting
All splitters implement split_documents():
from zerda.chunks import RecursiveCharacterTextSplitter, Document
docs = [Document(page_content=t, metadata={"source": f}) for t, f in pairs]
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_docs = splitter.split_documents(docs)
# Returns List[Document] with inherited + chunk_index metadata
Creating Documents from Strings
texts = ["chunk one", "chunk two"]
metadatas = [{"page": 1}, {"page": 2}]
docs = splitter.create_documents(texts, metadatas=metadatas)