OT Hebrew Verbal Syntax Analysis¶
Analysis of Hebrew verbal syntax at the discourse and syntactic level using the MACULA Hebrew WLC data. This notebook moves beyond morphology into how Hebrew verb forms function in narrative, poetry, prophecy, and law — covering verb form profiles, wayyiqtol chains, infinitive usage, clause type profiles, disjunctive clauses, conditional clauses, relative clauses, and aspect comparison across genres.
Sections:
- Verb Form Profile by Book
- Wayyiqtol Chains
- Infinitive Usage
- Clause Type Profile
- Stem Distribution by Book
- Disjunctive Clauses
- Conditional Clauses
- Relative Clauses
- Aspect Comparison Across Genres
import sys
sys.path.insert(0, '../../../src')
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
pd.set_option('display.max_rows', 60)
pd.set_option('display.max_columns', 20)
pd.set_option('display.width', 120)
print('Ready.')
1. Verb Form Profile by Book¶
verbal_syntax.py provides five analysis tools for studying the Hebrew verb system
at the syntactic and discourse level.
| Function | What it shows |
|---|---|
verb_form_profile |
Wayyiqtol/qatal/yiqtol/weqatal/ptc/inf distribution |
wayyiqtol_chains |
Consecutive narrative chains and their break types |
infinitive_usage |
Inf-cst governing preps; inf-abs paronomastic flag |
clause_type_profile |
Verbal vs nominal clauses; negation, conditional, relative |
stem_distribution |
Qal/Niphal/Piel/Hiphil/Hithpael etc. by book |
from bible_grammar import print_verb_form_profile
# Genesis: classic narrative prose — dominated by wayyiqtol (~42%)
print_verb_form_profile('Gen')
# Psalms: poetry — yiqtol dominant (~31%), wayyiqtol rare (~6%)
print_verb_form_profile('Psa')
# Isaiah: prophecy — compare with narrative and poetry
print_verb_form_profile('Isa')
2. Wayyiqtol Chains¶
The wayyiqtol (waw-consecutive imperfect) is the backbone of Hebrew narrative. It forms sequential chains of foreground action. Chain breaks occur when the author inserts a disjunctive clause, a speech, or a new scene marker. Genesis 1 shows how God's speech acts repeatedly interrupt the wayyiqtol chain.
from bible_grammar import print_wayyiqtol_chains
# Genesis 1: creation narrative — shows how God's speech breaks the chains
print_wayyiqtol_chains('Gen', 1)
# Ruth 1: narrative driven by wayyiqtol chains
# print_wayyiqtol_chains('Ruth', 1)
3. Infinitive Usage¶
Hebrew has two infinitive forms with distinct functions:
- Infinitive Construct (governed by prepositions): לְ (purpose), בְּ (temporal), כְּ (comparative), מִן (source)
- Infinitive Absolute (paronomastic/emphatic): placed before or after a finite verb to intensify it (Gen 2:16–17: אָכֹל תֹּאכַל 'you may surely eat' / מוֹת תָּמוּת 'you shall surely die')
from bible_grammar import print_infinitive_usage
# Genesis: inf construct (le purpose 66%), inf absolute (paronomastic: Gen 2:16-17)
print_infinitive_usage('Gen')
# Deuteronomy: rich in inf construct (instructions and laws)
# print_infinitive_usage('Deu')
4. Clause Type Profile¶
Hebrew clause types reveal the genre and rhetorical strategy of a text:
- Verbal clauses (verb-initial) = foreground / sequenced narrative
- Nominal clauses (noun/pronoun-initial) = background / description
- Conditional clauses (אִם / לוּ) = legal or hypothetical reasoning
- Relative clauses (אֲשֶׁר) = participant reference chains
from bible_grammar import print_clause_type_profile
# Genesis vs Proverbs: narrative vs wisdom prose clause types
print_clause_type_profile('Gen')
print_clause_type_profile('Pro')
5. Stem Distribution by Book¶
Qal typically accounts for 70–80% of verbs in any given book. The derived stems (Niphal, Piel, Hiphil, Hithpael) vary significantly by genre and theological emphasis.
from bible_grammar import print_stem_distribution, stem_chart
# Genesis: Qal dominant (77%), Hiphil 10%, Piel 7%
print_stem_distribution('Gen')
# Save a chart
# stem_chart('Gen')
6. Disjunctive Clauses¶
A disjunctive clause opens with a noun, pronoun, or adjective rather than a verb — the subject-first word order that signals a departure from the main narrative line. Discourse grammarians assign several functions:
| Function | Example |
|---|---|
| Circumstantial / background | Gen 1:2 וְהָאָרֶץ הָיְתָה תֹהוּ |
| Contrastive | Gen 37:3 וְיִשְׂרָאֵל אָהַב אֶת-יוֹסֵף |
| Summary / comment | Gen 37:2 אֵלֶּה תּוֹלְדֹת יַעֲקֹב |
| New subplot (background) | Gen 37:36 וְהַמְּדָנִים מָכְרוּ |
from bible_grammar import print_disjunctive_clauses
# Genesis 1: vv.1-2 set the stage with disjunctive background clauses
print_disjunctive_clauses('Gen', 1)
# Genesis 37: survey the Joseph narrative for disjunctives
print_disjunctive_clauses('Gen', 37)
from bible_grammar import print_disjunctive_in_chains
# Gen 37: chain terminated by background disjunctive at v36
# (subplot: Midianites sell Joseph to Potiphar)
print_disjunctive_in_chains('Gen', 37)
# Ruth 1 — classic disjunctive opening: wayyehi then subject-first
# print_disjunctive_in_chains('Ruth', 1)
7. Conditional Clauses¶
Hebrew conditionals fall into three main types:
| Type | Particle | Protasis verb | Example |
|---|---|---|---|
| Real / open future | אִם | yiqtol | Gen 18:26 אִם אֶמְצָא |
| Real / past-present | אִם | qatal | Gen 18:3 אִם מָצָאתִי |
| Irreal wish | לוּ | yiqtol | Gen 17:18 לוּ יִשְׁמָעֵאל |
| Irreal counterfactual | לוּ / לוּלֵא | qatal | Gen 31:42 לוּלֵי הָיָה |
Note: MACULA uses Deu (not Deut) for Deuteronomy book IDs.
from bible_grammar import print_conditional_clauses, print_conditional_summary
# Genesis 18: Abraham bargains with God (classic aleph-mem + yiqtol open conditions)
print_conditional_clauses('Gen', 18)
# Genesis: summary of all conditional types
print_conditional_summary('Gen')
# Compare conditional patterns across books
from bible_grammar import conditional_summary
books = ['Gen', 'Deu', 'Job', 'Pro', 'Psa']
frames = []
for b in books:
df = conditional_summary(b)
df['book'] = b
frames.append(df)
combined = pd.concat(frames, ignore_index=True)
pivot = combined.pivot_table(
index='condition_type', columns='book', values='count', fill_value=0
)
print(pivot.to_string())
8. Relative Clauses¶
Hebrew relative clauses are introduced by:
- אֲשֶׁר — standard relative marker (prose, formal poetry)
- שֶׁ — prefixed short form (Song of Songs, later BH)
- דִּי — Aramaic form (Daniel, Ezra)
The syntactic role of the relative pronoun within its clause is inferred:
| Role | Heuristic |
|---|---|
| subject | אֲשֶׁר fills the subject slot (no overt subject in rel clause) |
| object | rel clause has its own subject, OR resumptive pronoun role=o |
| oblique | resumptive pronoun role=p (prepositional phrase) |
| verbless | no verb in relative clause (predicate nominal) |
from bible_grammar import print_relative_clauses, print_relative_summary
# Genesis 3: all relative clauses (mostly obj qatal)
print_relative_clauses('Gen', 3)
# Genesis: full book summary
print_relative_summary('Gen')
# Compare relative clause profiles across books
from bible_grammar import relative_clauses
books = ['Gen', 'Rut', 'Psa', 'Pro', 'Job']
rows = []
for b in books:
df = relative_clauses(b)
if df.empty:
continue
for role in ['subject', 'object', 'oblique', 'verbless']:
cnt = (df['inferred_role'] == role).sum()
rows.append({'book': b, 'role': role, 'count': cnt})
pivot = pd.DataFrame(rows).pivot_table(
index='role', columns='book', values='count', fill_value=0
)
print('=== Relative clause role x book ===')
print(pivot.to_string())
9. Aspect Comparison Across Genres¶
Hebrew verb form distribution is one of the clearest markers of genre:
| Genre | Dominant forms | Signature |
|---|---|---|
| Narrative prose (Gen, Josh) | wayyiqtol ~40–50% | Sequential foreground action |
| Legal/instructional (Deu, Lev) | weqatal + yiqtol + impv | Future obligation sequences |
| Prophecy (Isa, Jer, Eze) | qatal + yiqtol balanced | Prophetic perfect; vision participles |
| Poetry (Psa, Pro, Job) | yiqtol + ptc.act high | Petition, habitual truth; wayyiqtol absent |
from bible_grammar import print_aspect_comparison, aspect_comparison_chart, GENRE_SETS
# Four-genre comparison: narrative / poetry / prophecy / law
print_aspect_comparison(['Gen', 'Psa', 'Isa', 'Deu'])
# Save grouped bar chart
path = aspect_comparison_chart(['Gen', 'Psa', 'Isa', 'Deu', 'Pro'])
print(f'Chart saved: {path}')
# Wisdom comparison: Job vs. Proverbs vs. Ecclesiastes
print_aspect_comparison(['Job', 'Pro', 'Ecc'])
# Use GENRE_SETS for convenience groupings
from bible_grammar import aspect_comparison
print("Available genre sets:", list(GENRE_SETS.keys()))
# Compare two specific narrative books vs. a prophecy book
print_aspect_comparison(['Gen', 'Josh', 'Isa'])
# Raw DataFrame for custom analysis
df = aspect_comparison(['Gen', 'Psa', 'Isa', 'Deu'])
print(df[[c for c in df.columns if c[1] == 'pct']].to_string())