Skip to content
Python JavaScript

Text Splitters (JavaScript/TypeScript)

Text splitters break large documents into manageable chunks while maintaining context and semantic coherence.

Overview

Text splitters help you: - Process large documents that exceed model context windows - Create embeddings for semantic search - Parallelize document processing - Maintain context across chunk boundaries

Available Splitters

Character Splitter

Splits text based on character count.

import { TextSplitter } from '@infinitibit_gmbh/graphbit';

const splitter = TextSplitter.character(
  1000,     // Chunk size
  200       // Chunk overlap (optional)
);

const chunks = splitter.split(text);

for (const chunk of chunks) {
  console.log(`Chunk: ${chunk.content.length} characters`);
  console.log(`Position: ${chunk.startIndex} to ${chunk.endIndex}`);
}

Recursive Splitter

Hierarchically splits text using multiple separators, ideal for structured documents.

import { TextSplitter } from '@infinitibit_gmbh/graphbit';

const splitter = TextSplitter.recursive(
  1000,     // Chunk size
  100       // Chunk overlap (optional)
);

const chunks = splitter.split(text);

Sentence Splitter

Maintains sentence boundaries for semantic coherence.

import { TextSplitter } from '@infinitibit_gmbh/graphbit';

const splitter = TextSplitter.sentence(
  500,      // Target size (optional)
  1         // Sentence overlap (optional)
);

const chunks = splitter.split(text);

Token Splitter

Splits based on token count, useful for LLM context limits.

import { TextSplitter } from '@infinitibit_gmbh/graphbit';

const splitter = TextSplitter.token(
  100,      // Max tokens per chunk
  20        // Token overlap (optional)
);

const chunks = splitter.split(text);

Working with Chunks

Each chunk has the following properties:

interface TextChunk {
  content: string;       // The chunk text
  startIndex: number;    // Start position in original text
  endIndex: number;      // End position in original text
  metadata?: string;     // Optional metadata (JSON string)
}

Example:

const splitter = TextSplitter.character(1000);
const chunks = splitter.split(text);

for (const chunk of chunks) {
  console.log('Content:', chunk.content);
  console.log('Start:', chunk.startIndex);
  console.log('End:', chunk.endIndex);
  console.log('Length:', chunk.endIndex - chunk.startIndex);
}

Best Practices

Choose the Right Splitter

  • Character Splitter: Simple documents, consistent chunk sizes
  • Token Splitter: Working with LLMs, precise token control
  • Sentence Splitter: Maintaining semantic boundaries
  • Recursive Splitter: Structured documents, code files

Optimize Chunk Size

Common sizes: - Embeddings: 500-1000 characters - LLM processing: 2000-4000 characters - Summarization: 1000-2000 characters

Use Appropriate Overlap

  • Small overlap (10-20%): General documents
  • Medium overlap (20-30%): Technical content
  • Large overlap (30-50%): Dense information

Complete Example

import { TextSplitter } from '@infinitibit_gmbh/graphbit';

async function processDocument(text: string) {
  // Create a recursive splitter
  const splitter = TextSplitter.recursive(1000, 100);

  // Split the text
  const chunks = splitter.split(text);

  console.log(`Created ${chunks.length} chunks`);

  // Process each chunk
  for (let i = 0; i < chunks.length; i++) {
    const chunk = chunks[i];
    console.log(`Chunk ${i}:`);
    console.log(`  Length: ${chunk.content.length}`);
    console.log(`  Position: ${chunk.startIndex}-${chunk.endIndex}`);
    // ... process chunk (e.g., generate embeddings)
  }
}

Integration with Embeddings

import { TextSplitter, EmbeddingClient, EmbeddingConfig } from '@infinitibit_gmbh/graphbit';

async function createEmbeddings(text: string) {
  // Split text
  const splitter = TextSplitter.recursive(1000, 100);
  const chunks = splitter.split(text);

  // Create embedding client
  const embedder = new EmbeddingClient(
    EmbeddingConfig.openai(process.env.OPENAI_API_KEY || '', 'text-embedding-3-small')
  );

  // Generate embeddings for each chunk
  const texts = chunks.map(chunk => chunk.content);
  const response = await embedder.embed(texts);

  return chunks.map((chunk, i) => ({
    content: chunk.content,
    embedding: response.embeddings[i],
    metadata: chunk.metadata
  }));
}