Skip to main content

Split text into semantically coherent, LLM-categorized chunks

Project description

chunklabel

A Python library for splitting text into categorized chunks using an LLM.

Overview

chunklabel segments text into semantically coherent spans, assigning a free-form category to each. Categories are named by the LLM without a predefined schema. Each chunk's quote is a verbatim excerpt from the source text, aligned back to the original after LLM output.

from chunklabel import ChunkLabeler

labeler = ChunkLabeler()
chunks = labeler.split(
    "The project kicked off in January with a small team. "
    "Budget constraints forced a scope reduction in March. "
    "Despite the setbacks, the product launched successfully in June."
)

# [
#   Chunk(category="initiation", quote="The project kicked off in January with a small team", start=0,   end=51),
#   Chunk(category="obstacle",   quote="Budget constraints forced a scope reduction in March", start=53,  end=104),
#   Chunk(category="outcome",    quote="the product launched successfully in June", start=120, end=160),
# ]

Installation

pip install chunklabel

For in-process inference with llama.cpp:

pip install "chunklabel[llamacpp]"

Data structures

The LLM returns raw chunks without span information. Alignment is performed as a separate step, producing the final Chunk with character-level positions.

# Intermediate: LLM output
@dataclass
class RawChunk:
    category: str   # Free-form category name assigned by the LLM
    quote: str      # Verbatim excerpt (may contain minor transcription noise)

# Final: after alignment
@dataclass
class Chunk:
    category: str   # Same as RawChunk
    quote: str      # Excerpt aligned to source text
    start: int      # Start index in source text
    end: int        # End index in source text

Pipeline

Input text
     │
     ▼
LLM  →  [{category, quote}, ...]   (RawChunk list)
     │
     ▼
rapidfuzz alignment  →  (start, end) resolved per chunk
     │
     ▼
Span post-processing  (lenient mode)
     │  gap-filling / overlap resolution
     ▼
Chunk list

Lenient mode

  • Gaps: unassigned spans between chunks are filled automatically as category="uncategorized"
  • Overlaps: the earlier chunk takes priority; the later chunk's start is pushed forward

Category normalization (offline)

After processing multiple texts, category names can drift across runs. A dedicated normalization step lets the LLM consolidate them in batch.

from chunklabel import Normalizer

normalizer = Normalizer()
normalizer.build_mapping(all_chunks)
# {"kick-off": "initiation", "project start": "initiation", "blocker": "obstacle", ...}

normalized_chunks = normalizer.apply(all_chunks)

The mapping is stored internally after build_mapping, so it can be passed to apply implicitly. To reuse the mapping across runs without calling the LLM again:

# Save after building
normalizer.save("mapping.json")

# Restore later
normalizer = Normalizer.load("mapping.json")
normalized_chunks = normalizer.apply(all_chunks)

Normalization runs offline over the full category inventory, so the LLM can make globally consistent decisions rather than local ones.

Configuration

labeler = ChunkLabeler(
    client="gpt-4o",     # model name string, or a BaseLLMClient instance
    fuzzy_threshold=80,  # match threshold for rapidfuzz alignment (0–100)
)

Using local LLMs

llama.cpp (in-process)

from llama_cpp import Llama
from chunklabel import ChunkLabeler
from chunklabel.llm import LlamaCppClient

client = LlamaCppClient(Llama(model_path="path/to/model.gguf", n_ctx=4096))
labeler = ChunkLabeler(client=client)

OpenAI-compatible server (e.g. llama.cpp server, Ollama)

Set OPENAI_BASE_URL before constructing the client:

OPENAI_BASE_URL=http://localhost:8080/v1 python your_script.py
from chunklabel import ChunkLabeler
from chunklabel.llm import OpenAIClient

labeler = ChunkLabeler(client=OpenAIClient(model="llama3", api_key="not-used"))

Note: local models must support JSON-mode structured output.

Downstream use cases

The Chunk list produced by chunklabel is designed as input for further analysis:

  • NLI: score the relationship between hypotheses and chunk categories
  • NER: analyze co-occurrence between entity labels and categories
  • Relation extraction: map entity-pair relations to chunk categories
  • Conditional generation: use category as a conditioning signal for language models

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chunklabel-0.2.0.tar.gz (195.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chunklabel-0.2.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file chunklabel-0.2.0.tar.gz.

File metadata

  • Download URL: chunklabel-0.2.0.tar.gz
  • Upload date:
  • Size: 195.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for chunklabel-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ae29834890f7a5c70ade5a8943b0c3b51b71078c60118b2f3de7d514beb70b35
MD5 b71314bea61c6b585a53253e1c29bcee
BLAKE2b-256 2bbd61d714b45489cf34a67be4feab31aea4b6be1535a94c1d2974d4e08e4888

See more details on using hashes here.

File details

Details for the file chunklabel-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: chunklabel-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for chunklabel-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 952150976c45431e9e93219d39430b21e324e33ac7d83abf0339a8cd0b35803b
MD5 6dc1f7c8c98dcbfbb295f3d8a3159e14
BLAKE2b-256 713464d6586f782ad55b9a419ff36c2a8a34a30efdd2978f3132ab5d32f05669

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page