Metre, verse boundaries, citations, and lemmas. import ganapati registers the Sanskrit reader
profiles, so a GRETIL or TEI source is chunked by verse and its tree is built from the citations.
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}]
Every chunk carries its metre as searchable metadata.
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'}
The scan behind it, and the metre that pattern names:
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ā'>
Forced alignment and ASR hand you lines, not verses. match_pada names a metre from one pāda and
group_verses finds 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| module | what is in it |
|---|---|
ganapati.text |
verse boundaries, pādas and verse numbers, the two chunkers, readers for GRETIL, TEI, VR XML and DCS |
ganapati.metre |
IAST transliteration, syllable weights, the gaṇas, 80 metres, mātrā metres, a metre by name |
ganapati.lemma |
vidyut lemmas, Monier-Williams glosses, the source’s own etymology entries and their repair, the reader profiles |
pip install ganapatiLemmas and glosses need vidyut and an 81 MB data download, both reached on first use. Without
them a store still gets metre, audio timings, and whatever analysis the source itself carries.