Genre Comparison — Morphological Patterns Across Biblical Literature¶
Different literary genres use Hebrew and Greek grammar in systematically different ways:
- OT Narrative prose is dominated by the wayyiqtol (Consecutive Imperfect) — the narrative past tense that drives sequential action
- OT Poetry and Prophecy favor the yiqtol (Imperfect) and qatal (Perfect), reflecting ongoing states and vivid-present discourse
- OT Legal texts have higher construct-chain density and noun-heavy POS profiles
- NT Epistolary letters use Present and Perfect more than narratives
- NT Pauline letters have higher Passive voice ratios — "theological passives" avoid naming God as subject
- NT Revelation has dense Participle usage and unique vocabulary
This notebook quantifies those patterns using the TAHOT (OT) and TAGNT (NT) morphological databases.
import sys
sys.path.insert(0, '../../../src')
import pandas as pd
from IPython.display import Image
from bible_grammar.genre_compare import (
genre_compare,
print_genre_compare,
genre_heatmap,
genre_report,
OT_GENRES,
NT_GENRES,
)
1. OT Verb Stem Distribution by Genre¶
Hebrew verb stems (binyanim) encode voice, valency, and action intensity:
- Qal — simple active (~68% of all OT verbs)
- Niphal — passive/reflexive
- Piel — intensive/factitive/declarative
- Hiphil — causative-active
- Hophal — causative-passive
- Pual — passive of Piel
- Hithpael — reflexive-intensive
Across genres, the Qal dominates everywhere, but the proportions of derived stems differ — wisdom poetry uses more Piel (emphatic speech acts); legal texts use more Hiphil (causative commands).
print_genre_compare('OT', feature='verb_stem')
path = genre_heatmap('OT', feature='verb_stem')
print(f'Saved: {path}')
Image(str(path))
2. OT Verb Conjugation by Genre¶
The conjugation profile is the clearest genre marker in Biblical Hebrew:
- Consecutive Imperfect (wayyiqtol) dominates Torah and Historical narrative — it is the engine of sequential past-tense storytelling
- Imperfect (yiqtol) and Participle are proportionally higher in Wisdom and Prophets — reflecting habitual, ongoing, or vivid-present usage
- Perfect (qatal) is relatively stable across genres but higher in prophetic and wisdom speech
- Imperative is highest in legal texts (Leviticus, Numbers) and prophetic commands
The difference between Historical narrative and Wisdom poetry is the most visually striking contrast in the heatmap.
print_genre_compare('OT', feature='verb_conjugation')
path = genre_heatmap('OT', feature='verb_conjugation')
print(f'Saved: {path}')
Image(str(path))
3. OT Part-of-Speech Mix by Genre¶
The ratio of verbs to nouns shifts by genre: narrative is verb-heavy (action sequences), while poetry and law are noun-heavy (description, categorization). Prepositions are proportionally higher in construct-chain-rich legal and wisdom texts.
print_genre_compare('OT', feature='pos')
# Raw DataFrame for custom analysis
ot_pos_df = genre_compare('OT', feature='pos', normalize=True)
ot_pos_df
4. NT Verb Tense by Genre¶
Greek verb tenses encode both time and aspect:
- Aorist (punctiliar past) dominates narrative sections (Gospels, Acts) — the default past-tense tense
- Present (imperfective) dominates epistolary and didactic writing — habitual, ongoing, gnomic
- Perfect (R-form) marks completed action with ongoing relevance — highest in Hebrews and John's Gospel
- Imperfect (ongoing past) appears in narrative sections for background activity
The contrast between Gospels/Acts (Aorist-heavy) and Pauline letters (Present-heavy) reflects narrative vs. instructional register.
print_genre_compare('NT', feature='verb_tense')
path = genre_heatmap('NT', feature='verb_tense')
print(f'Saved: {path}')
Image(str(path))
5. NT Verb Voice by Genre¶
Voice distribution reveals discourse strategy:
- Active dominates everywhere but is proportionally highest in Gospels/Acts narrative
- Passive is elevated in Pauline letters — the "divine passive" (theological passive) avoids naming God as direct agent (e.g., "you were called," "grace was given")
- Middle/Deponent reflects grammaticalized middle constructions common in Greek idiom
Higher Passive ratios in Pauline and General letters is a recognized stylistic feature.
print_genre_compare('NT', feature='verb_voice')
path = genre_heatmap('NT', feature='verb_voice')
print(f'Saved: {path}')
Image(str(path))
6. NT Verb Mood by Genre¶
Mood distribution marks modality and clause type:
- Indicative dominates across all genres (main-clause statements)
- Participle is proportionally highest in Revelation and General letters — dense attributive and predicative participial clauses
- Subjunctive is highest in Pauline letters — purpose clauses (ἵνα + subjunctive), conditional sentences, and hortatory usage
- Imperative is relatively stable but slightly elevated in epistolary paraenesis (ethical commands)
print_genre_compare('NT', feature='verb_mood')
# Raw DataFrame
nt_mood_df = genre_compare('NT', feature='verb_mood', normalize=True)
nt_mood_df
7. Full Report¶
Generate a comprehensive Markdown genre comparison report with all heatmaps for OT and NT:
report_path = genre_report()
print(f"Report saved: {report_path}")
8. Quick Reference¶
from bible_grammar.genre_compare import (
genre_compare,
print_genre_compare,
genre_heatmap,
genre_report,
OT_GENRES,
NT_GENRES,
)
# Genre / section registries
OT_GENRES # {'Torah': [...], 'Historical': [...], 'Wisdom': [...], 'Prophets': [...]}
NT_GENRES # {'Gospels & Acts': [...], 'Pauline': [...], 'General & Rev': [...]}
# Available features:
# OT: 'verb_stem', 'verb_conjugation', 'pos', 'noun_state'
# NT: 'verb_tense', 'verb_voice', 'verb_mood', 'pos'
# Raw DataFrame (normalize=True gives row percentages; False gives counts)
genre_compare('OT', feature='verb_stem', normalize=True)
genre_compare('NT', feature='verb_tense', normalize=False)
# Formatted terminal table
print_genre_compare('OT', feature='verb_stem')
print_genre_compare('NT', feature='verb_tense')
print_genre_compare('OT', feature='verb_conjugation')
print_genre_compare('NT', feature='verb_voice')
print_genre_compare('NT', feature='verb_mood')
# Heatmap chart — returns path to saved PNG
genre_heatmap('OT', feature='verb_stem')
genre_heatmap('OT', feature='verb_conjugation')
genre_heatmap('NT', feature='verb_tense')
genre_heatmap('NT', feature='verb_voice')
genre_heatmap('OT', output_path='output/charts/ot-genre-stems.png')
# Full Markdown report with all heatmaps
genre_report(output_dir='output/reports/both/genre')
genre_report(ot_features=['verb_stem', 'pos'], nt_features=['verb_tense'])