The Citation Graph: How We Know What the Dictionaries Quote
The great Sanskrit dictionaries do not just define words — they prove them, by citing
the classical texts where each sense occurs. In the Cologne digital sources those proofs
are <ls> (literary source) tags: <ls>MBh. 3, 12965</ls> is Monier-Williams citing the
Mahābhārata. Each dictionary, however, abbreviates in its own way — MBh., MBH,
MAHĀBHĀRATA — so the citations of different dictionaries could not be compared until the
sibling csl-atlas project resolved every
dictionary's own abbreviations to shared canonical text nodes.
The result is the <ls> citation graph: 828,505
resolved citations linking 11 dictionaries to
912 canonical texts through
1,701 dictionary→text edges. This page explains
what that graph is, how it was built, and how to query it yourself. (For the interactive
per-dictionary profiles, see What Each Dictionary Quotes.)
What the graph is — and is not
It is a citation-frequency graph: each edge says dictionary D cites text T, n times. That makes citation habits comparable — you can see that Apte's favourite text is the Raghuvaṃśa while Böhtlingk & Roth lean on the epics and Pāṇini — and it makes the tradition's canon measurable: which texts every lexicographer reached for, and which only one ever quoted.
It is not a per-passage index. The locus (book/verse) inside each <ls> tag is
discarded — counts are per source-text only. And it is not a completeness claim:
citation frequency measures lexicographic habit, not a text's importance.
Who feeds the graph
Resolved <ls> citations per dictionary — 828,505 across the 11 covered dictionaries.
Data table
| Dictionary | Resolved citations | Share of graph | Distinct texts cited |
|---|---|---|---|
| PWG | 536,172 | 64.7% | 475 |
| AP | 57,113 | 6.9% | 155 |
| PW | 50,701 | 6.1% | 243 |
| BEN | 49,003 | 5.9% | 96 |
| BHS | 40,875 | 4.9% | 136 |
| AP90 | 37,993 | 4.6% | 149 |
| MW | 20,250 | 2.4% | 5 |
| LRV | 16,469 | 2.0% | 106 |
| SCH | 11,496 | 1.4% | 160 |
| PWKVN | 8,386 | 1.0% | 172 |
| MD | 47 | 0.0% | 4 |
PWG (Böhtlingk & Roth's seven-volume Petersburger Wörterbuch) dominates — its citation
apparatus was industrial in scale, and two-thirds of its raw <ls> tags resolve. At the
other end, MD contributes 47 citations: real, but read it as a
placeholder, not a profile.
The long tail of the canon
Breadth is as telling as volume. A handful of texts — the Mahābhārata, the Ṛgveda, the Rāmāyaṇa, the Manusmṛti — are quoted across nearly the whole tradition. But most of the canon is narrow:
Breadth of citation: of the 912 canonical texts, 608 appear in only one dictionary.
Data table
| Cited by exactly n dictionaries | Canonical texts | Share of texts |
|---|---|---|
| 1 | 608 | 66.7% |
| 2 | 97 | 10.6% |
| 3 | 102 | 11.2% |
| 4 | 31 | 3.4% |
| 5 | 25 | 2.7% |
| 6 | 20 | 2.2% |
| 7 | 12 | 1.3% |
| 8 | 13 | 1.4% |
| 9 | 4 | 0.4% |
Two-thirds of the texts in the graph are cited by a single dictionary — typically a specialist reaching where nobody else did: BHS citing Buddhist Sanskrit texts no other dictionary touches, or PW's Nachträge tradition quoting obscure śāstra editions. The widely-shared core is small: only 74 texts appear in five or more dictionaries.
How it was built
The full method lives in the csl-atlas citations README; in brief:
- Extract every
<ls>…</ls>tag from the csl-orig digital sources (~1.5 million raw tags across the 11 covered dictionaries). - Resolve each leading abbreviation against that dictionary's own abbreviation legend (this site's abbreviations dataset), by longest-prefix match.
- Filter non-citations. MW reuses
<ls>for grammatical markers (A.= Active,ind.) and editorial tags (ibid., theL.= "lexicographers" convention) — 63,582 such markers are excluded auditably, not silently. - Borrow keys where a dictionary has no legend of its own but a documented shared convention: AP borrows AP90's key (same Apte system); SCH and PWKVN borrow PWG's (the Petersburger tradition).
- Fold variants into one canonical node — diacritic- and case-insensitive merging
(
ṚGVEDA≡Ṛg-veda≡Ṛgveda) plus a small hand-verified alias table (Mānavadharmaśāstra and Manu's Gesetzbuch → Manusmṛti), every mapping a well-established identification, never a guess.
Overall, 57.8% of raw text-bearing <ls> tags resolve to a canonical text. The rest —
unkeyed abbreviations, ambiguous scholar shorthands like AUFRECHT — stay in a public
unresolved-keys worklist
rather than being guessed.
Known limitations
- Coverage is 11 of the 43 dictionaries — those whose abbreviation legends resolve.
The Vedic concordances (VEI, PUI) carry no
<ls>tags at all; GRA's Rigveda references are verse numbers, not abbreviations; IEG cites inscription corpora, a separate epigraphic universe deliberately left out. - MW's yield is genuinely low (~8% of its raw tags): after the grammatical-marker
filter, most of what remains follows the untracked
L.convention or unkeyed abbreviations, so MW currently resolves to only 5 coarse text nodes. Treat MW's edges as trustworthy but its profile as a placeholder. - Borrowed keys resolve partially — SCH at 37%, PWKVN at 48% (they share only part of the PWG abbreviation set).
- Title-synonymy tail. The alias table folds the biggest variants; a text cited under a second, lesser-used title may still count as two nodes (MD's "Rigveda" is not yet folded into "Ṛgveda").
- Refinements in flight. Per-locus resolution of Mahābhārata references and verification of the Indische Sprüche anthology citations are active work on the csl-atlas side; expect those regions of the graph to sharpen.
Query it yourself
The graph is three small public TSV files — no database needed:
| File | Columns |
|---|---|
ls_citation_edges.tsv | dict · canonical_text · count — the graph itself |
ls_citation_nodes.tsv | canonical_text · total_cites · n_dicts · variant_forms |
ls_citation_unresolved_top.tsv | the QA worklist of unresolved abbreviations |
A ten-line start, straight from the raw file:
import csv, urllib.request
URL = ('https://raw.githubusercontent.com/sanskrit-lexicon/csl-atlas/'
'main/data/citations/ls_citation_edges.tsv')
rows = list(csv.DictReader(
urllib.request.urlopen(URL).read().decode('utf-8').splitlines(),
delimiter='\t'))
# Which dictionaries cite the Kathāsaritsāgara, and how often?
for r in rows:
if r['canonical_text'] == 'Kathāsaritsāgara':
print(r['dict'], r['count'])
To rebuild the graph from scratch, run
build_ls_citation_graph.py
in a csl-atlas checkout with csl-orig and csl-guides as siblings (~1 minute). The data
is CC BY-SA — cite csl-atlas and the Cologne Digital Sanskrit Dictionaries.
- Evidence: both figures above are computed at build time from the committed
src/data/citation-sources.jsonfeed, vendored byscripts/build-atlas-viz.mjsfrom the csl-atlas citation graph (edges + nodes TSVs above; method in its README): 828,505 resolved<ls>citations → 912 canonical texts × 11 dictionaries, 1,701 edges (graph v2, 06-07-2026; feed re-verified against the TSVs 12-07-2026). - Limitations: as listed above — 11 of 43 dictionaries; MW and MD are placeholders; resolution rate 57.8% of text-bearing tags; frequency ≠ importance.
- Owner repo: csl-atlas (data) / this repo (rendering).
See also
- What Each Dictionary Quotes — the interactive per-dictionary profiles
- Abbreviations & citations — how
<ls>tags work in the sources - Abbreviations comparison — the per-dictionary legends the resolver uses
- The dictionary landscape — era × novelty × size for all 43