# Data dictionary: public exports Generated by `scripts/build-exports.mjs` on 2026-08-09. Mirrors `data/exports/schema.json` in prose; the JSON file is the machine-readable source of truth. Source corpus: Dukes, Kais. The Quranic Arabic Corpus, version 0.4. Leeds: Language Research Group, University of Leeds, 2009-2017. https://corpus.quran.com/. GNU GPL. Chronology source (period-based fields): Egyptian Standard (Cairo 1924) revelation order, four-period classification following the Nöldeke-Bell tradition (Watt, "Bell's Introduction to the Qur'an", 1970). ## root-frequencies Every one of the 1,642 roots: raw occurrence count, overall normalized frequency, and per-period count and normalized frequency. (1642 rows.) **Counting rule:** Root occurrence = token count from Leeds morphology (root field non-empty). Normalized frequency = (count / total tokens for the given scope) * 1000, i.e. occurrences per 1,000 tokens. **Verification:** totalCount and normalizedFrequencyOverall: Verified (direct computation). Per-period fields: Nuanced (depend on the four-period chronology named in _chronologySource). | Field | Type | Unit | Description | | --- | --- | --- | --- | | `root` | string | n/a | Buckwalter-transliterated root. | | `safeKey` | string | n/a | URL/filename-safe encoding of root, used to link to data/association/{safeKey}.json and roots.html?root={safeKey}. | | `arabic` | string | n/a | Root letters in Arabic script, space-separated. | | `rootLatin` | string | n/a | Root in Latin transliteration with diacritics. | | `totalCount` | integer | tokens | Total occurrences of this root across the whole corpus (77,429 tokens). | | `normalizedFrequencyOverall` | number | occurrences per 1,000 tokens | (totalCount / 77,429) * 1000. | | `count_meccan-early` | integer | tokens | Occurrences of this root in the Early Meccan period. | | `normalizedFrequency_meccan-early` | number | occurrences per 1,000 tokens | (count_meccan-early / period token total) * 1000. | | `count_meccan-middle` | integer | tokens | Occurrences of this root in the Middle Meccan period. | | `normalizedFrequency_meccan-middle` | number | occurrences per 1,000 tokens | (count_meccan-middle / period token total) * 1000. | | `count_meccan-late` | integer | tokens | Occurrences of this root in the Late Meccan period. | | `normalizedFrequency_meccan-late` | number | occurrences per 1,000 tokens | (count_meccan-late / period token total) * 1000. | | `count_medinan` | integer | tokens | Occurrences of this root in the Medinan period. | | `normalizedFrequency_medinan` | number | occurrences per 1,000 tokens | (count_medinan / period token total) * 1000. | ## association-pairs Root-pair association statistics: the union of every pair appearing in any root's top-25-by-LLR partner list, deduplicated by unordered pair. (5211 rows.) **Counting rule:** Co-occurrence counted at the verse level over N = 6,236 verses. Only pairs with at least 5 shared verses were computed by scripts/compute-association-stats.mjs; only the top 25 partners per root (by LLR) are represented here, so this is not the complete set of all pairs meeting the 5-shared-verse threshold. **Verification:** Verified: direct computation from Leeds morphology, cross-checked against a hand-computed 2x2 table and against data/cooccurrence/*.json's independently computed counts. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `rootA` | string | n/a | First root of the pair (Buckwalter). | | `rootASafeKey` | string | n/a | URL/filename-safe encoding of rootA. | | `rootALatin` | string | n/a | rootA in Latin transliteration. | | `rootB` | string | n/a | Second root of the pair (Buckwalter). | | `rootBSafeKey` | string | n/a | URL/filename-safe encoding of rootB. | | `rootBLatin` | string | n/a | rootB in Latin transliteration. | | `sharedVerses` | integer | verses | k11: number of verses in which both roots are attested. | | `pmi` | number | bits (log base 2) | Pointwise mutual information: log2((k11*N)/((k11+k12)*(k11+k21))), N=6,236, rounded to 2 decimals. | | `dice` | number | n/a | Dice coefficient: 2*k11/(2*k11+k12+k21), rounded to 3 decimals. | | `llr` | number | n/a | Dunning's log-likelihood ratio (G2) over the pair's verse-level 2x2 table, rounded to 2 decimals. | ## surah-stats Per-surah corpus fingerprint: all 114 surahs. (114 rows.) **Counting rule:** verseCount/tokenCount/distinctRootCount and diversity ratios are read from data/surah-profiles.json (Leeds morphology tally per surah). revelationOrder and period are read from data/chronology.json. formMATTR/formMTLD are length-robust alternatives to the raw formDiversityRatio type-token ratio (scripts/lib/lexical-diversity.mjs), included because raw TTR is mechanically confounded by surah length. **Verification:** verseCount/tokenCount/distinctRootCount/diversity ratios/nounPct/verbPct: Verified (direct computation). formMATTR/formMTLD: Verified (direct computation; formulas hand-verified against fixed-point fixtures). revelationOrder/period: Nuanced (Cairo 1924 / Nöldeke-Bell chronology, one scheme among several). | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number, 1-114, Cairo (mushaf) order. | | `nameTranslit` | string | n/a | Transliterated surah name. | | `nameArabic` | string | n/a | Surah name in Arabic script. | | `nameEnglish` | string | n/a | English meaning of the surah name. | | `revelationOrder` | integer | n/a | Position in the Cairo 1924 revelation-order sequence (1 = first revealed). | | `period` | string | n/a | One of meccan-early, meccan-middle, meccan-late, medinan (Nöldeke-Bell four-period classification). | | `verseCount` | integer | verses | Number of verses (ayat) in the surah, Cairo numbering. | | `tokenCount` | integer | tokens | Total Leeds morphological tokens in the surah. | | `distinctRootCount` | integer | roots | Count of distinct roots attested in the surah. | | `rootDiversityRatio` | number | n/a | distinctRootCount / tokenCount. | | `distinctFormCount` | integer | forms | Count of distinct surface (written) forms in the surah. | | `formDiversityRatio` | number | n/a | distinctFormCount / tokenCount. Mechanically declines as tokenCount grows (a sample-size artifact); see formMATTR/formMTLD for length-robust alternatives. | | `formMATTR` | number | n/a | Moving-average type-token ratio (Covington & McFall 2010) over the surah's ordered surface-form tokens, 25-token window. Null for the 9 surahs shorter than the window. | | `formMTLD` | number | tokens | Measure of Textual Lexical Diversity (McCarthy & Jarvis 2010): mean tokens-per-factor at a 0.72 TTR threshold, bidirectionally averaged. Null only if the surah's running TTR never reaches the threshold. | | `distinctLemmaCount` | integer | lemmas | Count of distinct lemmas in the surah. | | `lemmaDiversityRatio` | number | n/a | distinctLemmaCount / tokenCount. | | `nounPct` | number | percent | Percentage of the surah's tokens tagged noun (N) by Leeds POS tagging. | | `verbPct` | number | percent | Percentage of the surah's tokens tagged verb (V) by Leeds POS tagging. | ## verse-lengths Every verse in the corpus (6,236 rows) with its token length and revelation period. (6236 rows.) **Counting rule:** tokens = number of Leeds morphological tokens in the verse (data/morphology/{surah}.json entry length). Ordered by surah, then verse. **Verification:** surah/verse/tokens: Verified (direct tally). period: Nuanced (Cairo 1924 / Nöldeke-Bell chronology). | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number, 1-114. | | `verse` | integer | n/a | Verse (ayah) number within the surah, Cairo numbering. | | `tokens` | integer | tokens | Number of Leeds morphological tokens in this verse. | | `period` | string | n/a | One of meccan-early, meccan-middle, meccan-late, medinan; null if the surah has no chronology entry. | ## formulas Every recurring 3-5 word sequence in the Qur'an (18,408 rows: 6,403 root-view + 12,005 surface-view), with its first occurrence. (18408 rows.) **Counting rule:** A sequence recurs if it appears 2+ times, counted two independent ways: root stream (words reduced to their consonantal root; unrooted particles skipped, so matched words need not be consecutive) and surface stream (diacritic-stripped written form, all words included, always consecutive). Only the first occurrence's location is included here; full occurrence lists are in data/formulas-root.json and data/formulas-surface.json. **Verification:** Verified (direct computation from Leeds morphology). | Field | Type | Unit | Description | | --- | --- | --- | --- | | `stream` | string | n/a | root or surface. | | `n` | integer | words | Sequence length, 3-5. | | `display` | string | n/a | Root stream: dot-separated Latin transliteration. Surface stream: the Arabic phrase itself. | | `arabic` | string | n/a | Arabic script for the sequence (root stream: root letters; surface stream: same as display). | | `count` | integer | occurrences | Total occurrences of this sequence across the corpus. | | `firstSurah` | integer | n/a | Surah of the sequence's first occurrence. | | `firstVerse` | integer | n/a | Verse of the sequence's first occurrence. | ## centrality Network centrality for all 1,642 roots over the root co-occurrence graph (5,211 edges, built from each root's top-25-by-LLR partners). (1642 rows.) **Counting rule:** Degree, weighted degree (sum of incident LLR weights), betweenness (Brandes' algorithm, unweighted shortest paths), and eigenvector centrality (power iteration on the LLR-weighted adjacency matrix), each with its rank among all 1,642 roots. Method detail in data/centrality/methods.json. **Verification:** Nuanced: the four measures rank roots differently by design, and the graph itself is a subset (each root's top-25 partners, not every pair meeting the underlying 5-shared-verse threshold). | Field | Type | Unit | Description | | --- | --- | --- | --- | | `root` | string | n/a | Buckwalter-transliterated root. | | `safeKey` | string | n/a | URL/filename-safe encoding of root. | | `rootLatin` | string | n/a | Root in Latin transliteration with diacritics. | | `degree` | integer | neighbors | Count of distinct partner roots. | | `degreeRank` | integer | n/a | Rank by degree, 1 = highest, among 1,642 roots. | | `weightedDegree` | number | n/a | Sum of incident edge weights (LLR). | | `weightedDegreeRank` | integer | n/a | Rank by weighted degree. | | `betweenness` | number | n/a | Betweenness centrality (unweighted shortest paths). | | `betweennessRank` | integer | n/a | Rank by betweenness. | | `eigenvector` | number | n/a | Eigenvector centrality (LLR-weighted, power iteration, L2-normalized). | | `eigenvectorRank` | integer | n/a | Rank by eigenvector centrality. | ## rhyme-summary Per-surah roll-up of verse-ending (rhyme) patterns for all 114 surahs. (114 rows.) **Counting rule:** Verse-final word per verse, diacritics/tatweel stripped (an orthographic proxy for pausal form, not a phonological transcription). familyCount/dominantKey/dominantShare/shiftCount are over the fine rhyme key (last two letters after collapsing hamza seats). meanRunLength = verseCount / (shiftCount + 1). Full method note and per-verse detail in data/rhyme/{surah}.json. **Verification:** Verified (direct computation from Leeds morphology and the Tanzil Uthmani text). | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number, 1-114. | | `verseCount` | integer | verses | Number of verses in the surah. | | `familyCount` | integer | n/a | Count of distinct fine-key rhyme families in the surah. | | `dominantKey` | string | n/a | The most frequent fine rhyme key in the surah. | | `dominantShare` | number | n/a | Share of verses ending on the dominant key, 0-1. | | `shiftCount` | integer | n/a | Number of verse-to-verse changes in the fine rhyme key. | | `topRefrainPausal` | string | n/a | Pausal form of the most-repeated verse ending recurring 3+ times, if any; null otherwise. | | `topRefrainCount` | integer | n/a | Occurrences of topRefrainPausal; null if there is no refrain. | | `meanRunLength` | number | verses | verseCount / (shiftCount + 1): average consecutive-verse run on one ending before it changes. | ## fawatih The 29 surahs opening with a sequence of isolated letters (fawatih / al-muqatta'at), and which combination. (29 rows.) **Counting rule:** Detected from the Leeds morphology: a surah's opening verse consisting solely of isolated-letter tokens. 14 distinct letter combinations recur across the 29 surahs. **Verification:** Verified (direct detection from Leeds morphology). The letters' meaning is not asserted; the classical tradition has never settled it. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number. | | `verse` | integer | n/a | Verse carrying the isolated letters (always 1). | | `letters` | string | n/a | The isolated letters in Arabic script, as written. | ## discursive-pivots 137 verses mechanically flagged for opening with a temporal particle (idh or idha) while sharing a content root with the immediately preceding verse. (137 rows.) **Counting rule:** A verse qualifies if its first content word is idh or idha (Leeds lemma) and it shares at least one non-stoplisted root with the previous verse. A candidate marker of a discursive turn, not a scholar's identification of one; method note in data/discursive-pivots.json. **Verification:** Nuanced: depends on the fixed marker list and content-root stoplist; a different choice of either would change the count. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number. | | `verse` | integer | n/a | The flagged verse. | | `marker` | string | n/a | The temporal particle opening the verse: idh or idha. | | `previousVerse` | integer | n/a | The preceding verse the flagged verse shares a root with. | | `sharedRoots` | string | n/a | Semicolon-separated list of the shared root(s) in Latin transliteration. | ## structure Mechanically segmented sections for all 114 surahs (TextTiling-derived changepoint detection over lexical cohesion), not a transcribed scholarly outline. (417 rows.) **Counting rule:** Per-verse boundary scores from five weighted signals (rhyme-family change, verse-length discontinuity, lexical-cohesion drop, formula onset, discursive-pivot markers); section count set by a per-surah significance threshold, not a fixed target. 34 of 114 surahs get exactly one section (no boundary cleared the threshold). Full method and per-boundary evidence in data/structure/{surah}.json. **Verification:** Nuanced: a computed segmentation, not a scholar's reading; never attributed to any named scholar. See docs/maintainer-guide.md on the named-scholar outline policy. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number. | | `sectionIndex` | integer | n/a | 1-based section number within the surah. | | `fromVerse` | integer | n/a | First verse of the section. | | `toVerse` | integer | n/a | Last verse of the section. | | `verseCount` | integer | verses | Number of verses in the section. | ## structure-tests Four block-level mirror-symmetry tests (concentric pairing, inclusio, formula bookending, verse-length symmetry) over the computed sections in the structure table, one row per surah. (114 rows.) **Counting rule:** Each test's p-value comes from a block-order permutation null (blocks kept intact, 10,000 seeded shuffles, or exact enumeration when feasible), corrected jointly across all 345 candidates from all four tests via Benjamini-Hochberg (q<0.05). Null for surahs with too few sections for a given test. 0 of 345 candidates reached significance after correction. Full method in data/structure-tests.json. **Verification:** Nuanced: a null result describes this specific mechanical test over a computed segmentation, not the scholarly literature on ring composition, which this site never asserts an outline from. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number. | | `verseCount` | integer | verses | Verses in the surah. | | `sections` | integer | n/a | Number of computed sections (from the structure table). | | `concentricParallelism_observed` | number | n/a | Observed mean Jaccard similarity of mirrored section pairs; null if the surah has too few sections for this test. | | `concentricParallelism_pValue` | number | n/a | Permutation p-value for concentricParallelism; null if not applicable. | | `concentricParallelism_survivor` | boolean | n/a | Whether this candidate survived the pooled Benjamini-Hochberg correction; null if not applicable. | | `inclusio_observed` | number | n/a | Observed vocabulary overlap between the first and last section; null if not applicable. | | `inclusio_pValue` | number | n/a | Permutation p-value for inclusio; null if not applicable. | | `inclusio_survivor` | boolean | n/a | Whether this candidate survived correction; null if not applicable. | | `formulaBookending_observed` | number | n/a | Observed formula-bracketing statistic; null if not applicable. | | `formulaBookending_pValue` | number | n/a | Permutation p-value for formulaBookending; null if not applicable. | | `formulaBookending_survivor` | boolean | n/a | Whether this candidate survived correction; null if not applicable. | | `lengthSymmetry_observed` | number | n/a | Observed correlation of the verse-length profile with its reverse; null if not applicable. | | `lengthSymmetry_pValue` | number | n/a | Permutation p-value for lengthSymmetry; null if not applicable. | | `lengthSymmetry_survivor` | boolean | n/a | Whether this candidate survived correction; null if not applicable. | ## theme-surah-density Sparse theme-by-surah matrix: for each surah, the themes whose root-family vocabulary clusters most densely in it. (252 rows.) **Counting rule:** perThousand = theme-root tokens per 1,000 surah tokens (Leeds counts, minimum 2 tokens). Each theme lists at most its top 8 surahs by density, so a surah's absence from this table for a given theme means it is not among that theme's densest, not that the vocabulary is absent entirely. Root-to-theme grouping is editorial (see themes.html); the counting is mechanical. **Verification:** Nuanced: perThousand is a direct computation, but which roots belong to which theme is an editorial classification, not a computed fact. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number. | | `themeSlug` | string | n/a | Theme identifier, matches themes.html's slug. | | `themeTitle` | string | n/a | Theme display title. | | `perThousand` | number | theme-root tokens per 1,000 surah tokens | Density of this theme's root family in this surah. | ## formulaic-density Per-surah mean share of words covered by a recurring 3-5-word phrase (Bannister's oral-formulaic density), tested against a length-matched null, for all 114 surahs. (114 rows.) **Counting rule:** meanDensity{Root,Surface} = unweighted mean of per-verse density (covered word positions / verse token count) across the surah. p-value: one-sided, 10,000 draws resampling verseCount verses with replacement from the pooled corpus per-verse densities. survivor: true if this candidate is among the 228 (114 surahs x 2 streams) jointly Benjamini-Hochberg corrected at q<0.05. Per-verse detail and method in data/formulaic-density.json. **Verification:** Nuanced: the significance test's null (uniform resampling across the whole corpus) does not control for genre or period, only length. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `surah` | integer | n/a | Surah number. | | `verseCount` | integer | n/a | Verses in this surah. | | `meanDensityRoot` | number | n/a | Mean per-verse root-stream formulaic density, 0-1. | | `pValueRoot` | number | n/a | One-sided permutation p-value, root stream. | | `survivorRoot` | boolean | n/a | Survives the pooled BH-FDR correction at q<0.05, root stream. | | `meanDensitySurface` | number | n/a | Mean per-verse surface-stream formulaic density, 0-1. | | `pValueSurface` | number | n/a | One-sided permutation p-value, surface stream. | | `survivorSurface` | boolean | n/a | Survives the pooled BH-FDR correction at q<0.05, surface stream. | ## dispersion How evenly each of the 1,642 roots is spread across the 114 surahs, weighted by surah token count. (1642 rows.) **Counting rule:** dp/dpNorm: Gries's Deviation of Proportions (Gries 2008) and its corrected normalization (Lijffijt & Gries 2012). juillandD: Juilland & Chang-Rodriguez (1964), over each surah's per-1,000-token rate; classically assumes comparably-sized parts, which this corpus's 114 surahs are not. adjustedFrequency = totalCount * (1 - dp). Method detail in data/dispersion/methods.json. **Verification:** Nuanced: dp/dpNorm and juillandD are independent formulas that can and do disagree; this site reports both rather than picking one as authoritative. | Field | Type | Unit | Description | | --- | --- | --- | --- | | `root` | string | n/a | Buckwalter-transliterated root. | | `safeKey` | string | n/a | URL/filename-safe encoding of root. | | `rootLatin` | string | n/a | Root in Latin transliteration with diacritics. | | `totalCount` | integer | occurrences | Corpus-wide occurrence count. | | `surahsOccurringIn` | integer | n/a | Count of the 114 surahs the root occurs in at least once. | | `dp` | number | n/a | Gries's Deviation of Proportions. Range [0, 1 - min part share]. Attains 1 - min part share exactly when all occurrences fall in the corpus's smallest part. | | `dpNorm` | number | n/a | DP rescaled to [0, 1] via the Lijffijt & Gries (2012) correction. Attains 1 at the same extreme as dp's own maximum. | | `juillandD` | number | n/a | Juilland's D; 1 = perfectly even. Not clamped, can be negative. | | `adjustedFrequency` | number | n/a | totalCount * (1 - dp): raw frequency discounted for clumping. | ## Files Each table above ships as both `{name}.csv` and `{name}.json` (a flat JSON array of the same rows) under `data/exports/`. CSV values are comma-separated, UTF-8, header row first; fields containing a comma, quote, or newline are quoted per RFC 4180. ## License Data derived from the Leeds Quranic Arabic Corpus is GPL-licensed, per `NOTICE.md`. Surah names and the Cairo 1924 chronology are factual/public-domain reference data. Site code (this script included) is MIT-licensed.