Skip to main content

ganapati

ganapati reads Sanskrit texts and describes them in ways a search index can use. It finds where each verse ends in a GRETIL, TEI, DCS or vedicreader file and cuts the text into chunks on those boundaries. It works out the metre of every verse from the weights of its syllables, and it records the lemmas (dictionary forms) and English glosses behind the words. It also maps an epithet such as Pārtha to the name a translation uses, and it can derive a word through Pāṇini’s grammar.

ganapati is built to work with litesearch, but only the search profiles and filters in ganapati.lemma need it. When both are installed, litesearch finds ganapati through a package entry point, so a Sanskrit file added to an index is chunked by verse and each chunk gets its metre as metadata, which by_meter can then filter on:

from litesearch import Index
from ganapati import Meter

ix = Index('vault.db')
ix.add('mahabharata.htm')
ix.search('dharma')[:3]
ix.db.by_meter(meter=Meter.ANUSTUBH)[:3]
/Users/71293/code/personal/orgs/ganapati/.venv/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

[{'content': 'nārāyaṇaṃ namaskṛtya naraṃ caiva narottamam\ndevīṃ sarasvatīṃ caiva tato jayam udīrayet',
  'metadata': '{"meter": "anuṣṭubh", "variant": "pathyā", "gana": "ta_ra_ga_ga", "pada": "8"}',
  'node_id': '73a63025c7fc3d14#0',
  'doc_id': '73a63025c7fc3d14',
  'page': 0},
 {'content': 'samāsīnān abhyagacchad brahmarṣīn saṃśitavratān\nvinayāvanato bhūtvā kadā cit sūtanandanaḥ',
  'metadata': '{"meter": "anuṣṭubh", "variant": "pathyā ra-vipulā", "gana": "ya_ta_ga_ga", "pada": "8"}',
  'node_id': '73a63025c7fc3d14#0',
  'doc_id': '73a63025c7fc3d14',
  'page': 2},
 {'content': 'tam āśramam anuprāptaṃ naimiṣāraṇyavāsinaḥ\ncitrāḥ śrotuṃ kathās tatra parivavrus tapasvinaḥ',
  'metadata': '{"meter": "anuṣṭubh", "variant": "pathyā", "gana": "ja_sa_ga_ga", "pada": "8"}',
  'node_id': '73a63025c7fc3d14#0',
  'doc_id': '73a63025c7fc3d14',
  'page': 3}]

verse_meta writes that metadata. For Gītā 1.1 it finds an anuṣṭubh, the metre of the epics, in its regular form (pathyā), with eight syllables to the pāda (quarter-verse):

verse_meta('dharmakṣetre kurukṣetre samavetā yuyutsavaḥ '
           'māmakāḥ pāṇḍavāścaiva kimakurvata sañjaya')
{'meter': 'anuṣṭubh', 'variant': 'pathyā', 'gana': 'ma_ra_ga_ga', 'pada': '8'}

Behind it is the scansion. scan marks each syllable heavy (g, guru) or light (l, laghu), and detect_meter compares the whole pattern with the metres it knows. Here it recognises the first verse of the Meghadūta as mandākrāntā:

scan('dharmakṣetre kurukṣetre')     # g for heavy, l for light
'gggglggg'
detect_meter('kaścit kāntāvirahaguruṇā svādhikārātpramattaḥ '
             'śāpenāstaṃgamitamahimā varṣabhogyeṇa bhartuḥ '
             'yakṣaścakre janakatanayāsnānapuṇyodakeṣu '
             'snigdhacchāyātaruṣu vasatiṃ rāmagiryāśrameṣu')['name']
<Meter.MANDAKRANTA: 'mandākrāntā'>

A line at a time

Aligned recordings and speech recognition give you lines, not verses. match_pada names the metres a single pāda could belong to, and group_verses works out how many lines make a verse.

padas = ['kaścit kāntāvirahaguruṇā svādhikārātpramattaḥ',
         'śāpenāstaṃgamitamahimā varṣabhogyeṇa bhartuḥ',
         'yakṣaścakre janakatanayāsnānapuṇyodakeṣu',
         'snigdhacchāyātaruṣu vasatiṃ rāmagiryāśrameṣu']
match_pada(padas[0]), group_verses(padas).size

Names and terms

A reader may ask about Sri Ranganatha where the translation writes Viṣṇu, or about anumana where it says inference. canonical and term_gloss connect the two:

canonical('Sri Ranganatha'), canonical('Partha'), term_gloss('anumana')
(('viṣṇu', 'nārāyaṇa', 'hari'), ('arjuna',), ('inference',))

The modules

module what is in it
ganapati.sanskrit Vedic accent removal, an ASCII search key for a word in any script, citation ids
ganapati.text verse boundaries, verse layout by pāda, the two chunkers, readers for GRETIL, TEI, vedicreader XML and JSON, and DCS
ganapati.metre IAST transliteration, syllable weights, the gaṇas, 100 fixed-pattern metres, the āryā family, checks against recorded audio
ganapati.lemma vidyut lemmas, Monier-Williams glosses, a source’s own word-by-word analysis and its repair, the litesearch profiles and search filters
ganapati.names one key for every spelling of a name, epithets of deities and heroes, English for śāstra and jyotiṣa terms
ganapati.vyakarana derivations through the Aṣṭādhyāyī, a word-by-word analysis matched to its line, the sandhi rule at a join, two words joined into their saṃhitā

from ganapati import * brings in every module except ganapati.sanskrit, which you import by name.

Install

pip install ganapati

Use pip install 'ganapati[search]' to install litesearch with it. Lemmas need vidyut’s data, an 81 MB download made the first time you ask for a lemma, and glosses need Monier-Williams, downloaded the first time you call mw_lexicon. Without either, an index still gets each verse’s metre, its audio timings, and any analysis the source itself carries.

Credits

The joiner in ganapati.vyakarana reads vidyut’s table of sandhi rules, shipped as ganapati/data/vidyut_sandhi_rules.csv. vidyut is by ambuda.org (https://github.com/ambuda-org/vidyut) and is MIT licensed. Its copyright notice and licence travel with the table in ganapati/data/LICENSE-vidyut.

Metadata

Release files for ganapati 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ganapati 0.1.5
File Size Uploaded Provenance
ganapati-0.1.5.tar.gz 54.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ganapati 0.1.5
File Interpreter ABI Platform
ganapati-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 112.5 kB

Release files / ganapati-0.1.5.tar.gz

Download URL ganapati-0.1.5.tar.gz
Size 54.5 kB
Tags Source
SHA-256 checksum
How to use checksums
38354974ad5c8f8dc249dcc5944ab7970c8c1fc280e3edf8708bb1f83397c397
BLAKE2b-256 checksum
How to use checksums
ac9f50a202d75fb206752de86104a109e201aefa11fa2b24b2b4a4b988282aa1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release files / ganapati-0.1.5-py3-none-any.whl

Download URL ganapati-0.1.5-py3-none-any.whl
Size 58.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fcda3f7606259a25687c4b71a6789a6b1319168ecdba9cf2c5611c46c40abf07
BLAKE2b-256 checksum
How to use checksums
06ae7716ad33bec9c3a32c876a2c339b9f3d5f4e6fd27ae27caef0ff796d62e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Security for ganapati 0.1.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page