Skip to main content

Parse a corpus, manage it and extract themes from a corpus.

Project description

theme-extractor

Python toolkit to compare theme/topic extraction strategies on the same corpus, with:

  • one unified CLI
  • one unified JSON output schema
  • offline-first execution options
  • Elasticsearch/OpenSearch backend support

Why this project

theme-extractor helps you answer one practical question: "Which extraction strategy works best for my corpus and constraints?"

It lets you run baseline lexical methods, embedding-based methods, and LLM-assisted methods with consistent outputs for easier comparison.

Core Commands

  • theme-extractor ingest
  • theme-extractor extract
  • theme-extractor benchmark
  • theme-extractor evaluate
  • theme-extractor report
  • theme-extractor doctor

Quickstart

Prerequisite: start one backend first (local Docker guide: /howto/docker-local.md).

uv sync --group elasticsearch
uv sync --group ingestion
uv run theme-extractor doctor --output data/out/doctor.json
uv run theme-extractor ingest --input data/raw --output data/out/ingest.json
uv run theme-extractor ingest \
  --input data/raw \
  --reset-index \
  --index-backend \
  --cleaning-options all \
  --default-stopwords \
  --manual-stopwords "de,le,la,the,and,of" \
  --output data/out/ingest_indexed.json
uv run theme-extractor benchmark \
  --methods baseline_tfidf,terms,significant_terms,keybert,bertopic \
  --backend elasticsearch \
  --backend-url http://localhost:9200 \
  --index theme_extractor \
  --focus both \
  --output data/out/benchmark.json
uv run theme-extractor evaluate \
  --input data/out/benchmark.json \
  --output data/out/evaluation.json
uv run theme-extractor report \
  --input data/out/benchmark.json \
  --output data/out/report_benchmark.md

ingest always generates a local JSON QA payload; with --index-backend, it also indexes cleaned/filtered text into Elasticsearch/OpenSearch.

Run significant_text separately with --agg-field content (see /howto/benchmark.md).

Methods Available

  • Baselines:
    • baseline_tfidf
    • terms
    • significant_terms
    • significant_text
  • Semantic:
    • keybert
    • bertopic (embedding on/off, reduction none/svd/nmf/umap, clustering kmeans/hdbscan)
  • Generative:
    • llm (offline fallback behavior supported)

What You Get

  • Unified extraction schema:
    • topic-first output (topics)
    • optional document-topic links (document_topics)
    • execution notes and metadata (notes, metadata)
  • Benchmark output:
    • per-method outputs
    • comparison block
  • Quantitative proxies via evaluate:
    • topic coherence proxy
    • inter-topic diversity
    • run-to-run stability

Documentation Map (How-To)

Detailed operations are intentionally kept in /howto:

Sphinx documentation is available under /docs (includes README, how-to pages, and API docstrings).

CLI code is now organized under src/theme_extractor/cli/:

  • __init__.py: CLI entrypoint (main)
  • argument_parser.py: parser and flags
  • command_handlers.py: command execution logic
  • ingest_backend_indexing.py: ingest-side backend indexing helpers
  • common_runtime.py: shared runtime helpers

Build locally:

uv run sphinx-build -b html docs docs/_build/html

Configuration

Use .env.template as bootstrap:

cp .env.template .env
set -a; source .env; set +a

Important variable groups:

  • backend/runtime (THEME_EXTRACTOR_BACKEND*, THEME_EXTRACTOR_PROXY_URL)
  • ingestion stopwords (THEME_EXTRACTOR_DEFAULT_STOPWORDS_ENABLED, THEME_EXTRACTOR_AUTO_STOPWORDS_*)
  • PDF OCR fallback (THEME_EXTRACTOR_PDF_OCR_*) for scanned PDFs
  • .msg extraction (THEME_EXTRACTOR_MSG_*) for metadata and attachment policy
  • local model resolution (THEME_EXTRACTOR_LOCAL_MODELS_DIR)
  • BERTopic embedding cache (THEME_EXTRACTOR_BERTOPIC_EMBEDDING_CACHE_*)

Dependency Groups

Install optional runtime groups with uv:

uv sync --group ingestion

ingestion includes parsers for PDF/Office/MSG formats (pymupdf, python-docx, openpyxl, python-pptx, extract-msg).

Project Governance

Community Standards

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

theme_extractor-0.2.0.tar.gz (53.0 kB view details)

Uploaded Source

Built Distribution

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

theme_extractor-0.2.0-py3-none-any.whl (68.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: theme_extractor-0.2.0.tar.gz
  • Upload date:
  • Size: 53.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for theme_extractor-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9f6601bb96204482290839d8406926b81bcedf3ed16b22f4cb695c253293b2c1
MD5 b0895f6f17163c544777acd12c1b0e49
BLAKE2b-256 5532376c0d67dfd2f607acc029b11645e1d9501b03d3220102f5b8f344e3156e

See more details on using hashes here.

Provenance

The following attestation bundles were made for theme_extractor-0.2.0.tar.gz:

Publisher: release.yml on Guillaume-Lombardo/theme-extractor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for theme_extractor-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3c8a64f6583a629c602c4c868f2184b096a26266b2c4fee86f6deaeef53c37d1
MD5 9205ab01f75225ea7d2444804032c7d1
BLAKE2b-256 f8de2f8a18ef747e47a101c96366c9687f1d2606f4752c3980ed9153a12ee97d

See more details on using hashes here.

Provenance

The following attestation bundles were made for theme_extractor-0.2.0-py3-none-any.whl:

Publisher: release.yml on Guillaume-Lombardo/theme-extractor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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