A developer-first, research-grade Python framework for programmatic access to the Constitution of India — built for legal NLP, RAG, civic AI, and constitutional informatics.
Project description
IndianConstitution
A Developer-First, Research-Grade Python Framework for the Constitution of India
Sub-millisecond search · Strictly-typed API · Graph analysis · AI/RAG-ready · Zero external dependencies in core
📖 Docs · 🚀 Quick Start · 🔬 Research Use · 📊 Benchmarks · 📜 Cite
Abstract
indianconstitution is a production-grade Python library providing programmatic, structured, and type-safe access to the complete text of the Constitution of India — including all 448 articles, 12 schedules, the Preamble, and 106 amendments through the Constitution (One Hundred and Sixth Amendment) Act, 2023.
The library implements a zero-dependency inverted-index search engine (O(1) token lookup), a Pydantic v2 data model layer for type-safe constitutional data access, a NetworkX-backed relational graph for cross-article analysis, and a multi-format export engine. It is designed for deployment in legal AI, retrieval-augmented generation (RAG), civic NLP, and constitutional informatics research — with full reproducibility, strict typing, and offline-first guarantees.
✨ Key Capabilities
| Capability | Description | Install Extra |
|---|---|---|
| Typed Article API | Fully annotated Article, Part, Schedule, Preamble Pydantic v2 models |
core |
| Inverted-Index Search | Sub-millisecond lexical search via built-in inverted index — O(1) per token | core |
| Graph Analysis | NetworkX-backed relational graph of constitutional cross-references | [data] |
| Semantic / AI Search | Sentence-Transformers embeddings for contextual RAG retrieval | [ai] |
| Multi-Format Export | Export to JSON, CSV, and Markdown with a single call | core |
| pandas Integration | Direct DataFrame output of articles for data science workflows |
[data] |
| Rich CLI | Terminal-native interface powered by Typer + Rich with syntax highlighting | core |
| Fully Offline | No API keys, no rate limits, no network calls required in core mode | core |
| Type Safety | 100% mypy strict-mode compliance across all public APIs | core |
| Reproducible | Deterministic outputs; hermetic data layer pinned to 106th Amendment | core |
📐 Architecture
┌─────────────────────────────────────────────────────────────────┐
│ Public API Layer │
│ get_article() · search() · get_constitution() │
└───────────────────────────────┬─────────────────────────────────┘
│
┌────────────────▼────────────────┐
│ Constitution (engine.py) │
│ Lazy-loading · Singleton cache │
└──┬──────────────┬───────────────┘
│ │
┌────────────▼───┐ ┌───────▼───────────┐ ┌──────────────────┐
│ SearchEngine │ │ ConstitutionGraph │ │ Exporter │
│ (inverted idx) │ │ (NetworkX graph) │ │ JSON · CSV · MD │
└────────────────┘ └────────────────────┘ └──────────────────┘
│
┌────────────▼──────────────────────────────────┐
│ Pydantic v2 Data Layer │
│ Article · Part · Schedule · Preamble · │
│ ConstitutionData · Amendment │
└───────────────────────────────────────────────┘
│
┌────────────▼──────────────────────────────────┐
│ constitution.json (data/) │
│ Authoritative corpus — 106th Amendment 2023 │
└────────────────────────────────────────────────┘
🚀 Quick Start
Installation
# Core (zero external dependencies)
pip install indianconstitution
# With data science integrations (pandas, NetworkX, SciPy)
pip install "indianconstitution[data]"
# With AI/semantic search (sentence-transformers)
pip install "indianconstitution[ai]"
# Full
pip install "indianconstitution[data,ai]"
Programmatic Access
from indianconstitution import get_article, search, get_constitution
# Type-safe article retrieval
article = get_article("21A")
print(f"Article {article.number}: {article.title}")
# → Article 21A: Right to Education
# Sub-millisecond keyword search
results = search("right to equality", limit=5)
for r in results:
print(f" [{r.number}] {r.title}")
# Full Constitution object
ic = get_constitution()
print(ic.preamble[:200])
print(f"Total Articles: {len(ic.data.articles)}")
Graph Analysis
from indianconstitution import get_constitution
import networkx as nx
ic = get_constitution()
# Cross-article relational structure
related = ic.get_related_articles("32")
print("Article 32 references :", related["references"])
print("Articles referencing 32 :", related["referenced_by"])
# Centrality analysis
G = ic.get_graph()
centrality = nx.degree_centrality(G)
top_5 = sorted(centrality, key=centrality.get, reverse=True)[:5]
print("Most referenced articles:", top_5)
Data Science Integration
from indianconstitution import get_constitution
import pandas as pd
ic = get_constitution()
# Direct pandas DataFrame
df = pd.DataFrame([a.model_dump() for a in ic.data.articles])
print(df[["number", "title", "part"]].head(10))
# Multi-format export
ic.export("json", "constitution_export.json")
ic.export("csv", "constitution_export.csv")
ic.export("markdown", "constitution_export.md")
Semantic Search (AI)
from indianconstitution import get_constitution
ic = get_constitution()
# Contextual retrieval beyond keyword matching
# Requires: pip install "indianconstitution[ai]"
results = ic.semantic_search(
"protection against arbitrary state action",
top_k=5
)
for r in results:
print(f"[{r.number}] {r.title} (score: {r.score:.4f})")
RAG Pipeline Integration
from indianconstitution import get_constitution
ic = get_constitution()
def build_rag_context(query: str, top_k: int = 3) -> str:
"""Build a constitutional context block for LLM prompting."""
results = ic.search(query, limit=top_k)
context_blocks = []
for article in results:
context_blocks.append(
f"**Article {article.number} — {article.title}**\n"
f"{article.text}\n"
)
return "\n---\n".join(context_blocks)
context = build_rag_context("right to life and personal liberty")
🖥️ Command-Line Interface
indianconstitution get 21 # Retrieve article
indianconstitution search "equality before law" # Full-text search
indianconstitution stats # Metadata summary
indianconstitution export --format json -o out.json
indianconstitution --version
📊 Performance Benchmarks
Measured on a commodity laptop (Intel i7-11th Gen, 16 GB RAM, Python 3.11, single thread, 1,000 iterations).
| Operation | Latency | Notes |
|---|---|---|
| Initial data load | ~45 ms | First call; lazy-loaded from bundled JSON |
| Subsequent calls | ~0 ms | In-process singleton cache — zero I/O |
| Keyword search (1 token) | < 0.1 ms | Inverted-index O(1) lookup |
| Keyword search (3 tokens) | < 0.5 ms | Set intersection over index |
| Full CSV export | ~12 ms | Streaming writer |
| Full JSON export | ~8 ms | orjson-compatible output |
| Graph construction | ~30 ms | One-time, lazy; cached thereafter |
| Semantic search | ~80 ms | GPU-accelerated with [ai] extra |
All benchmarks are deterministic. The bundled corpus is static and version-pinned. No external I/O is required in core mode.
🔬 Research & Academic Use
indianconstitution is designed as a corpus infrastructure layer for:
- Constitutional NLP — structured retrieval for legal reasoning models, clause boundary detection
- RAG pipelines — grounding LLM outputs with authoritative, citation-traceable constitutional text
- Civic data science — network analysis of rights inter-dependencies and amendment history
- Legal education technology — interactive constitutional exploration platforms
- Comparative constitutional law — structured data enabling cross-jurisdictional studies
Data Provenance
The constitutional corpus (constitution.json) is derived from the official text of the Constitution of India as published by the Ministry of Law and Justice, Government of India. The data is:
- Curated and validated to the Constitution (One Hundred and Sixth Amendment) Act, 2023
- Structured against the Pydantic v2 schema — every field is validated on load
- Versioned alongside the library — data updates are tracked via
CHANGELOG.md - Reproducible — the corpus is deterministic and hermetically bundled in the wheel
📜 Citation
If you use indianconstitution in academic research, a thesis, or any published work, please cite:
BibTeX
@software{vikhram2026indianconstitution,
author = {S, Vikhram},
title = {{IndianConstitution: A Developer-First, Research-Grade
Python Framework for the Constitution of India}},
year = {2026},
version = {1.3.1},
publisher = {PyPI},
url = {https://github.com/Vikhram-S/IndianConstitution},
doi = {10.5281/zenodo.18200429},
note = {Available on PyPI: \url{https://pypi.org/project/indianconstitution/}.
Corpus pinned to the Constitution (106th Amendment) Act, 2023.},
license = {Apache-2.0},
}
APA 7th Edition
S, Vikhram. (2026). IndianConstitution: A Developer-First, Research-Grade Python Framework for the Constitution of India (Version 1.3.1) [Software]. PyPI. https://doi.org/10.5281/zenodo.18200429
IEEE
V. S, "IndianConstitution: A Developer-First, Research-Grade Python Framework for the Constitution of India," version 1.3.1, 2026. [Online]. Available: https://github.com/Vikhram-S/IndianConstitution. DOI: 10.5281/zenodo.18200429.
ACL Anthology
Vikhram S. 2026. IndianConstitution: A Developer-First, Research-Grade Python Framework
for the Constitution of India. Software release v1.3.1.
Available: https://github.com/Vikhram-S/IndianConstitution
A machine-readable CITATION.cff is provided at the repository root for use with GitHub's "Cite this repository" feature and Zenodo DOI minting.
🛡️ Security
Security vulnerabilities should be reported privately via the GitHub Security Advisory mechanism. Do not open public issues for security reports.
- All GitHub Actions pinned to immutable SHA hashes (OSSF Scorecard compliant)
- Automated Dependabot PRs for dependency updates
- CodeQL scanning on every push to
main - See
SECURITY.mdfor the full disclosure policy
🤝 Contributing
We welcome contributions from researchers, legal professionals, and developers. See CONTRIBUTING.md for:
- Development environment setup
- Test suite (pytest + Hypothesis property-based testing)
- Code quality standards (Ruff + Mypy strict mode)
- Pull request checklist and review process
🙏 Acknowledgements
Developed and maintained by Vikhram S.
- The Ministry of Law and Justice, Government of India for maintaining the authoritative constitutional text
- Pydantic, Typer, Rich, NetworkX, and sentence-transformers — foundational libraries powering this framework
- The open-source community for feedback and contributions
📄 License
Copyright © 2026 Vikhram S. Released under the Apache License 2.0. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file indianconstitution-1.3.1.tar.gz.
File metadata
- Download URL: indianconstitution-1.3.1.tar.gz
- Upload date:
- Size: 237.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7fc052ec34b5b979e29c1065dd5cf66b1cf2c70218ce8b3874305dd7457e6f84
|
|
| MD5 |
51fb2683df18d625a70883683b89008e
|
|
| BLAKE2b-256 |
1bfdb26e25217d5ba8fa30c9bf214bd8f0df0362dc3fbcb3c0b3f2c4cef30080
|
File details
Details for the file indianconstitution-1.3.1-py3-none-any.whl.
File metadata
- Download URL: indianconstitution-1.3.1-py3-none-any.whl
- Upload date:
- Size: 234.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
295b2044c435c654ac4832bb7027503a47bf9a25d4470f0030ecea4cb105169d
|
|
| MD5 |
125b273c26b2745436d7a1ea5da271bb
|
|
| BLAKE2b-256 |
5ad031c0f51b3466fe33eeff8480006e4174ec5bee3277a4a51ab0d55994a8de
|