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
📖 Documentation · 🚀 Quick Start · 🔬 Research Use · 📊 Benchmarks · 📜 Cite
Abstract
indianconstitution is a production-grade, research-ready 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 — all designed for deployment in legal AI, retrieval-augmented generation (RAG), civic NLP, and constitutional informatics research.
This package is designed to meet the infrastructure standards expected by NeurIPS, ACL, and EMNLP research workflows — offering reproducibility, strict typing, and offline-first guarantees.
📑 Table of Contents
- Key Capabilities
- Architecture
- Quick Start
- Data Science Integration
- AI / Semantic Search
- CLI Reference
- Performance Benchmarks
- Research & Academic Use
- Citation
- Contributing
- Security
- License
✨ 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 installation (zero external dependencies) ───────────────
pip install indianconstitution
# ─── Data science integrations (pandas, NetworkX, SciPy) ──────────
pip install "indianconstitution[data]"
# ─── AI/semantic search (sentence-transformers) ───────────────────
pip install "indianconstitution[ai]"
# ─── Full installation ────────────────────────────────────────────
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
print(f" Part: {article.part} | Amendment: {article.inserted_by}")
# ─── Sub-millisecond Keyword Search ───────────────────────────────
results = search("right to equality", limit=5)
for r in results:
print(f" [{r.number}] {r.title} — Part {r.part}")
# ─── Full Constitution Object ──────────────────────────────────────
ic = get_constitution()
print(ic.preamble[:200])
print(f"Total Articles : {len(ic.data.articles)}")
print(f"Total Schedules: {len(ic.data.schedules)}")
Graph Analysis
from indianconstitution import get_constitution
ic = get_constitution()
# ─── Discover cross-article relational structure ──────────────────
related = ic.get_related_articles("32")
print("Article 32 references :", related["references"])
print("Articles referencing 32 :", related["referenced_by"])
# ─── Compute centrality (which articles are most referenced?) ─────
import networkx as nx
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")
AI / Semantic Search
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)
# Usage with any LLM
context = build_rag_context("right to life and personal liberty")
print(context)
🖥️ Command-Line Interface
# ─── Retrieve and display an article with syntax highlighting ─────
indianconstitution get 21
# ─── Full-text search across all articles ────────────────────────
indianconstitution search "equality before law"
# ─── Display constitution statistics and metadata ─────────────────
indianconstitution stats
# ─── Export to JSON / CSV / Markdown ────────────────────────────
indianconstitution export --format json --output constitution.json
indianconstitution export --format csv --output constitution.csv
indianconstitution export --format markdown --output constitution.md
# ─── Show version ────────────────────────────────────────────────
indianconstitution --version
📊 Performance Benchmarks
Benchmarks measured on a commodity laptop (Intel Core i7-11th Gen, 16 GB RAM, Python 3.11, single thread, averaged over 1,000 iterations).
| Operation | Latency | Notes |
|---|---|---|
| Initial data load | ~45 ms | First call only; lazy-loaded from bundled JSON |
| Subsequent calls | ~0 ms | In-process singleton cache — zero I/O |
| Keyword search (single token) | < 0.1 ms | Inverted-index O(1) lookup |
| Keyword search (multi-token, 3) | < 0.5 ms | Set intersection over index |
| Full CSV export (all articles) | ~12 ms | Streaming writer |
| Full JSON export | ~8 ms | orjson-compatible output |
| Graph construction (NetworkX) | ~30 ms | One-time, lazy; cached thereafter |
| Semantic search (sentence-transformers) | ~80 ms | GPU-accelerated with [ai] extra |
Reproducibility note: All benchmarks are fully deterministic. The bundled
constitution.jsoncorpus is static and version-pinned. No external I/O is required in core mode.
🔬 Research & Academic Use
indianconstitution is engineered for research-grade deployment. It is suitable 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 and quiz engines
- Multilingual legal AI — Hindi/English constitutional analysis (see
[Unreleased]roadmap) - Comparative constitutional law — structured data enabling cross-jurisdictional ML studies
Data Provenance & Corpus Integrity
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 the
CHANGELOG.md - Reproducible — the corpus is deterministic and hermetically bundled in the wheel
Reproducibility Checklist
For NeurIPS / ACL / EMNLP paper authors using this library:
- Pin to a specific release:
pip install indianconstitution==1.3.0 - Record the
__version__in your experiment scripts - Cite via the BibTeX entry below
- Archive the data corpus via Zenodo DOI (see Citation section)
📜 Citation
If you use indianconstitution in academic research, a thesis, or any published work, please cite it as follows:
BibTeX (Preferred)
@software{vikhram2026indianconstitution,
author = {S, Vikhram},
title = {{IndianConstitution: A Developer-First, Research-Grade
Python Framework for the Constitution of India}},
year = {2026},
version = {1.3.0},
publisher = {PyPI},
url = {https://github.com/Vikhram-S/IndianConstitution},
doi = {10.5281/zenodo.XXXXXXX},
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.0) [Software]. PyPI. https://doi.org/10.5281/zenodo.XXXXXXX
IEEE
V. S, "IndianConstitution: A Developer-First, Research-Grade Python Framework for the Constitution of India," version 1.3.0, 2026. [Online]. Available: https://github.com/Vikhram-S/IndianConstitution. DOI: 10.5281/zenodo.XXXXXXX.
ACL Anthology Format
Vikhram S. 2026. IndianConstitution: A Developer-First, Research-Grade Python Framework
for the Constitution of India. Software release v1.3.0.
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.
- Supply-chain security: All GitHub Actions are pinned to immutable SHA hashes (OSSF Scorecard compliant)
- Dependency hygiene: Automated Dependabot PRs for all dependency updates
- Static analysis: CodeQL scanning on every push to
main - Vulnerability disclosure: See
SECURITY.mdfor the full policy
🤝 Contributing
We welcome contributions from researchers, legal professionals, and developers. See CONTRIBUTING.md for guidelines on:
- Setting up the development environment
- Running the test suite (pytest + Hypothesis property-based testing)
- Code quality standards (Ruff + Mypy strict mode)
- Documentation contributions (MkDocs Material)
- Submitting pull requests and the review process
🙏 Acknowledgements
This library is developed and maintained by Vikhram S at Saveetha Engineering College, Chennai, India. We gratefully acknowledge:
- The Ministry of Law and Justice, Government of India for maintaining the authoritative constitutional text
- The developers of Pydantic, Typer, Rich, NetworkX, and sentence-transformers — the foundational libraries that power this framework
- The open-source community for their invaluable feedback and contributions
📄 License
Copyright © 2026 Vikhram S. Released under the Apache License 2.0.
You may use this software freely for academic, commercial, and government purposes with proper attribution. See LICENSE for the full text.
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.0.tar.gz.
File metadata
- Download URL: indianconstitution-1.3.0.tar.gz
- Upload date:
- Size: 243.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04d499836a0558c3c8a4688537c489067d6047ac429679a35366ca8fc223eff3
|
|
| MD5 |
00031231c1fd0ff00aeb85ed2505788a
|
|
| BLAKE2b-256 |
08848acae7a9ede6d32433e2242890b37f0ea87b419d609b025662463d0f3cd5
|
File details
Details for the file indianconstitution-1.3.0-py3-none-any.whl.
File metadata
- Download URL: indianconstitution-1.3.0-py3-none-any.whl
- Upload date:
- Size: 235.5 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 |
df1e48660d9dfcbf7484d98591cddbbdb8d07d8903ddd7c8c19a570af1f11c66
|
|
| MD5 |
c1473b7bd9789475be86dc988c843f2d
|
|
| BLAKE2b-256 |
5bdb31be8a0f97e0e03a15db9e10ff106fb17e87b8641588f69a387d7971e861
|