macula
MACULA Hebrew lowfat syntax trees of the Hebrew Bible into dependency trees, in CoNLL-U, as Ancient Hebrew (hbo) and Biblical Aramaic (arc); the Targums as text layers and a verse-aligned index in three languages.
Source. MACULA Hebrew Linguistic Datasets, available at github.com/Clear-Bible/macula-hebrew. © Biblica, Inc., CC BY 4.0. The syntax is the Westminster Hebrew Syntax of the J. Alan Groves Center (CC BY 4.0). The text and morphology come from the Open Scriptures Hebrew Bible (CC BY 4.0). The fields from the Semantic Dictionary of Biblical Hebrew (sdbh, lexdomain, coredomain, contextualdomain) are left out.
How it works
MACULA gives each sentence as word groups: clauses, with the roles of their parts (s, v, o, o2, io, pp, adv, p), and noun, preposition, number and adjective phrases, relative clauses and coordinations. The tool reads a dependency tree off them by head rules:
- clause: the verb (
v) heads; with no verb, the predicate (p); with neither, the first clause, then the first content word. הָיָה with a predicate is a copula (cop, AUX) and the predicate heads: always when MACULA marks the predicateo; with a prepositional predicate unless the verb is the narrative וַיְהִי (the phrase with ל and a noun first, then one with ל, then the first). - clauses side by side: in
ClCl2andCLandCL2the last clause heads; the ones before it arediscourse(הִנֵּה),dislocated(a hanging noun),advcl(a condition) orparataxis. In a group of clauses only, each ו belongs to the clause after it; a clause after a subordinator (כִּי, אִם …) isadvcl, after no conjunctionparataxis. After a verb of saying, the clauses that follow the quote's first clause continue the quote (conj/parataxisof it) up to the next narrative wayyiqtol. - לֵאמֹר: the ל heads and אמר is its
fixed; the ל is themarkof the quoted clause, which is theccompof the verb of saying (advclafter another verb); with no quote in the sentence, לֵאמֹר is the verb'sccomp. - preposition phrase: the noun (or clause) heads; the preposition is its
case. Before a headless relative clause («כַּאֲשֶׁר», «מֵאֲשֶׁר», «אֵת אֲשֶׁר») the preposition or את heads and the clause is itsacl:relcl. תַּחַת, נֶגֶד, עִמָּד and נֹכַח are nouns in construct (NOUN), and head their phrase. - noun and other phrases: the first content word heads, as in the first noun of a construct chain, or the noun after the article (
det) or the object marker את (case). A number, adverb or adjective before a noun («seven days») leaves the noun the head. Groups of function words only (מֵ + עִם, וְ + עַתָּה) are spliced into the group above, so each word hangs on the phrase it introduces. - coordination: the first member heads, and each later member of the same kind is
conj, also in lists with no conjunction (NpNpNp,2PpaPp,PpPp…). Each conjunction is accof the member after it; גַּם and אַף areadvmod; כִּי אִם is one subordinator (אִםfixed). - roles become relations:
s→ nsubj,o→ obj (a clause: ccomp),o2→ xcomp,io→ iobj,pp→ obl (an infinitive: advcl; xcomp after יכל, צוה, נתן, יסף, מאן … ),adv→ advmod / obl (a noun phrase) / obl:npmod (the infinitive absolute) / advcl / discourse (נָא),p→ xcomp beside a verb. - inside phrases: the construct chain (
NPofNP,QuanNP,AdjpofNp) iscompound:smixut, a pronoun suffix nmod:poss, an apposition appos. A relative clause is acl:relcl (on כָּל when the chain begins with it), a participle after a noun too (its article is then the relativemark), an adjective amod, a demonstrative (זֶה, זֹאת, אֵלֶּה, הַהוּא) det, a number nummod; the parts of a number areflat, orconjafter ו.
Words are MACULA's: prefixes (ו, ה, ב, ל …) and suffix pronouns are words of their own, and a written word of more than one is a multiword token (as in PTNK); the article swallowed by a preposition (בַּ = בְּ + הַ) is written ה. A name MACULA keeps as one word with a space (בְּאֵר שָׁבַע) is a word per part, flat:name. The paseq ׀, sof pasuq ׃ and the paragraph marks ס, פ are PUNCT tokens. FORM and LEMMA are in NFC. FEATS holds gender, number, person, PronType and the verb stem (HebBinyan, letters only). MISC holds the English gloss, the word reference, Strong's number and MACULA's argument frame (Frame=A0:…;A1:…, who does what), where it has one, and Lang=arc on the Aramaic words. The files pass the UD validator at level 2 (--lang hbo); level 3 finds 95 errors in the Torah (mostly advmod on a word that is no ADV).
Every tree is checked before it is written: one head per word, one root, no cycle (a negative control in the tests shows red).
Run
macula <lowfat-dir> <out-dir> [BOOK,…]
It writes <out-dir>/<BOOK>.conllu, with # sent_id = wlc:<BOOK>:<n> (one document per book) and # verse = GEN.1.1. It also writes <out-dir>/verses.tsv, which maps ids to verses. school-sents usfm gives English translations the same verse map, so the two line up verse by verse.
The Aramaic sentences go apart, to <out-dir>/arc/<BOOK>.conllu (# sent_id = wlc-arc:<BOOK>:<n>) and arc/verses.tsv. A sentence goes by the language of most of its words (MACULA's lang="A"); the whole Bible gives 268 Aramaic sentences (7 555 words, in Daniel, Ezra and Jeremiah 10:11) beside 22 945 Hebrew ones, and 2 sentences mix the two (Genesis 31:47 stays Hebrew).
Words are written in the order of the text. MACULA gives them in the order of its groups, which in 742 of 22 945 sentences (146 in the Torah) takes a word from further on (Ruth 1:1: «וַיֵּלֶךְ אִישׁ מִבֵּית לֶחֶם», אִישׁ in the subject group after the place). The heads are read in MACULA's order, then the words are sorted by their id and the heads renumbered. The scores against PTNK do not change, since they match words by id.
tools/hbo trains Mova's own parser for raw Hebrew on these trees.
Biblical Aramaic
MACULA marks every word with its language (lang="H" or "A"). The Aramaic words are Daniel 2:4b–7:28, Ezra 4:8–6:18 and 7:12–26, Jeremiah 10:11 and two words of Genesis 31:47. A sentence most of whose words are Aramaic goes to <out-dir>/arc/ (UD code arc), as above. Only two sentences mix the languages: Daniel 2:4 (the Hebrew frame «and the Chaldeans spoke to the king in Aramaic», then their words) goes to Aramaic, Genesis 31:47 (the name יְגַר שָׂהֲדוּתָא) stays Hebrew. Every Aramaic word has Lang=arc in MISC (in either folder), and a Hebrew word in an Aramaic sentence Lang=hbo.
The Aramaic trees use the same head rules, FEATS and MISC as the Hebrew ones; the stem is in HebBinyan too (PEAL, PAEL, HAPHEL, HITHPEEL …). Three lists have Aramaic members, used only for Aramaic words: the copula הֲוָה, the demonstratives דְּנָה, דָּא, אִלֵּין, דֵּךְ, אִלֵּךְ, דִּכֵּן (det), and the subordinator הֵן «if». The rest (verbs of saying אמר, ענה) share their consonants with Hebrew.
Limits: there is no Aramaic treebank to measure against, so the trees are unmeasured. MACULA's English glosses in the Aramaic chapters are shifted by one word around the emphatic article (the noun «the», the article «king»), and are carried as they are. The emphatic ending א is a word of its own (DET, det), as MACULA splits it.
The whole Tanakh (2026-10-18)
macula <WLC lowfat> <out>; the corpus keeps <out> as text/tanakh-wlc-macula and <out>/arc as text/tanakh-arc-macula:
| sentences | words | books | |
|---|---|---|---|
Hebrew (hbo) | 22 945 | 468 356 | 39 |
Aramaic (arc) | 268 | 7 555 | 3 (DAN, EZR, JER) |
0 trees fail the check; 1 106 groups had no rule for their head (first child). Every book passes the UD validator at level 2, the Hebrew with --lang hbo, the Aramaic with --lang arc (and hbo).
The Targums and the three-language index
macula targums <sefaria Tanakh/Targum dir> <text-dir>
macula tanakh3 <text-dir> <en-pool.tsv> <out-dir>
targums copies the Targums from Sefaria's export as text layers, verse by verse (BOOK.C.V → text, markup off, NFC): Targum Onkelos (the Torah, the toratemetfreeware edition), Targum Jonathan (the Prophets, Mikraot Gedolot) and the later Targums of the Writings (Psalms, Proverbs, Job, the Song, Ruth, Lamentations, Ecclesiastes, Esther from Mikraot Gedolot; Chronicles from Wikisource). Only an edition whose licence is «Public Domain» is copied; any other is refused (a test shows red on CC BY-SA and NC). Each layer has a SOURCES.tsv.
tanakh3 writes one TSV per book, a row per verse in the Hebrew numbering: the verse, the Hebrew sentence ids, the Aramaic (Biblical Aramaic sentence ids, and the Targum verse as onkelos:, jonathan: or targum:BOOK.C.V) and the English sentence ids (the pool's .verses). A sentence that spans verses is listed at each.
Measured (2026-10-18), verses with each language:
| verses | Hebrew | Aramaic | English | all three | |
|---|---|---|---|---|---|
| Torah | 5 853 | 5 853 | 5 846 | 5 852 | 5 845 |
| Prophets | 9 296 | 9 295 | 9 296 | 9 294 | 9 293 |
| Writings | 8 065 | 7 797 | 7 289 | 8 057 | 7 014 |
The Writings' Aramaic is missing where there is no Targum (Daniel's Hebrew chapters, Ezra, Nehemiah); the 268 verses of Daniel and Ezra in Aramaic have the Aramaic and no Hebrew. Eleven verses have no English sentence of their own: JPS joins them to the verse before inside one sentence (Psalm titles, Numbers 26:1).
The English follows the Hebrew numbering: eBible's JPS 1917 gives JPS's own (Hebrew) numbers in brackets where they differ from the English ones, and school-sents usfm … --hebrew-verses maps each sentence to the Hebrew verse it begins in (the marks are taken off before the cut, so the ids are the same with and without the flag, and the Torah keeps the ids of its pool of 2026-10-17). In the Ten Commandments (Exodus 20, Deuteronomy 5) JPS counts by the upper accents and the Westminster Leningrad Codex by the lower ones, as the English does, so there the English numbering stays.
No Aramaic parser exists yet: the Targums are text only, and their trees come later.
Measured (2026-10-17)
The Torah (GEN–DEU):
- 5 853 sentences and 125 807 words; 0 trees fail the check.
- 229 groups had no rule for their head, so the first child was taken.
- Relations: case 20 285, cc 14 027, obl 12 310, conj 10 168, det 9 281, compound:smixut 9 009, nsubj 7 969, obj 6 694, nmod:poss 6 591, …, cop 780, …, dep 59.
- Two runs give the same files, byte for byte. Takes 6 s.
The whole Hebrew Bible (39 books, 2026-10-18): 23 213 sentences and 475 911 words, 7 549 of them Aramaic (Lang=arc: DAN 5 687, EZR 1 835, JER 25, GEN 2); 0 trees fail the check; 1 106 groups had no rule for their head. The head rules were made on the Torah and are not measured beyond it.
Against UD PTNK
UD Ancient Hebrew PTNK (UD 2.18) is CC BY-NC, so it serves only as a measure. Its words carry MACULA ids, so they line up word for word (macula compare). LAS is counted on the relation without its subtype. The rules are decided on train and dev; the test split is read once per change of the rules.
| 2026-10-17 | test UAS | test LAS | dev UAS | dev LAS | train UAS | train LAS |
|---|---|---|---|---|---|---|
| first head rules | 86.24 | 73.79 | 84.59 | 70.87 | ||
| UD conventions for Hebrew | 88.38 | 82.23 | 86.61 | 79.98 | 87.10 | 80.72 |
| PTNK's readings, see below | 96.51 | 93.58 | 96.04 | 93.09 | 96.43 | 93.63 |
The second row follows the UD conventions for Hebrew: the construct chain is compound:smixut; subordinating conjunctions (כִּי, אִם, לְמַעַן, פֶּן …) are mark; a demonstrative after a noun is det; an infinitive after a preposition advcl; the parts of a compound number flat; a clause right after a verb of saying, with no conjunction between, its ccomp; a ו at the head of a clause hangs on the clause's head, and a conjunction never on another conjunction.
The third row reads the groups as PTNK does (above, «How it works»). Each rule's gain, dev / train, UAS and LAS (LAS only where no head changes), measured when it was added or by leaving it out of its step:
| rule | dev UAS | dev LAS | train UAS | train LAS |
|---|---|---|---|---|
| a number, adverb or adjective before a noun: the noun heads | +2.71 | +2.32 | +2.22 | +1.97 |
ClCl2, CLandCL2: the last clause heads | +1.21 | +1.01 | +1.54 | +1.42 |
| groups of function words spliced (מֵ + עִם, וְ + עַתָּה) | +0.68 | +0.63 | +0.72 | +0.72 |
a preposition or את before a headless relative heads (PpRelp, OmpRelp) | +0.48 | +0.46 | +0.37 | +0.38 |
| in a group of clauses ו belongs to the clause after it; a clause after כִּי, אִם … is advcl | +0.70 | +0.86 | +0.99 | +1.11 |
a clause after a clause with no conjunction is parataxis | +0.15 | +0.66 | ||
QuanNP, AdjpofNp and a participle or adjective in construct are compound:smixut | +1.46 | +1.13 | ||
זֶה, זֹאת, אֵלֶּה are det | +0.35 | +0.28 | ||
a participle after a noun is acl:relcl | +0.08 | +0.14 | ||
the article on a verbal participle is mark | +0.21 | +0.19 | ||
לֵאמֹר: ל heads, אמר fixed, ל the quote's mark | +0.37 | +0.37 | +0.51 | +0.52 |
הָיָה with an o predicate is a copula | +1.44 | +1.41 | +0.91 | +0.88 |
| הָיָה with a prepositional predicate (not וַיְהִי) is a copula | +0.77 | +0.73 | +1.17 | +1.12 |
| the quote's later clauses hang on its first, up to a wayyiqtol | +0.33 | +0.30 | +0.34 | +0.29 |
o2 is xcomp | +0.07 | +0.11 | ||
an infinitive after יכל, צוה, נתן, יסף, מאן … is xcomp | +0.20 | +0.14 | ||
a noun phrase in adv is obl | +0.64 | +0.35 | ||
the infinitive absolute in adv is obl:npmod | +0.08 | +0.16 | ||
a later member of a list is conj | +0.38 | +0.43 | ||
an object clause is ccomp | +0.05 | +0.29 | +0.03 | +0.16 |
גַּם, אַף are advmod | +0.19 | +0.13 | ||
the parts of a number after ו are conj | +0.17 | +0.12 | ||
כִּי אִם: אִם is fixed | +0.01 | +0.00 | +0.01 | +0.02 |
| a headless relative after any preposition (כַּאֲשֶׁר) | +0.05 | +0.00 | +0.09 | +0.05 |
| תַּחַת, נֶגֶד, עִמָּד, נֹכַח head their phrase | +0.35 | +0.32 | +0.29 | +0.27 |
| a relative clause on the noun after כָּל hangs on כָּל | +0.31 | +0.31 | +0.17 | +0.17 |
נָא and other interjections in adv are discourse | +0.09 | +0.06 |
Measured and not kept: flattening a coordination inside a later conjunct (dev UAS −0.10, train +0.02); an adjective on the noun after כָּל hung on כָּל (dev −0.07); carrying the quote of לֵאמֹר over the clauses after it (train +0.01).
Lemmas compare by their consonants, since the order of points differs between sources.
Still apart from PTNK (train, right head, other relation): conj → parataxis 309, orphan → obl 179 (gapping is not read), xcomp → obl 143 (a second accusative of material, «overlay it with gold»), ccomp → obj 142, advmod → cc 121, advcl → parataxis 111. Most head errors left are where PTNK's sentences and MACULA's differ (a word is the root in one and a conj or parataxis in the other).
The dictionaries
The code is in src/dict.rs.
macula dict <trees-dir> <BDB.jsonl> <LexicalIndex.xml> <dict.tsv> [<en-pool.tsv>] [--lang arc] [--jastrow <Jastrow.jsonl>]
macula targum <onkelos-dir> <Jastrow.jsonl> <trees-dir> <en-pool.tsv> <out.tsv> [<n>]
dict builds an English dictionary of the words in the trees: the Hebrew words, or with --lang arc the Aramaic ones (Lang=arc).
Entries. Each row of dict.tsv has the key, lemma, count, MACULA's commonest glosses, the short definition of the OpenScriptures lexical index (CC BY 4.0; its Hebrew or its Aramaic part), the Brown–Driver–Briggs entry of 1906 (public domain, via Sefaria; for Aramaic its Aramaic part) and why, which says how each entry was chosen. The BDB entry is given twice: its bold senses as a short meaning, and its whole text with the markup taken off. With --jastrow, three more columns give the entry of Jastrow's dictionary of 1903 (public domain, via Sefaria): headword, italic senses, whole text.
Keys. A Hebrew word's key is its Strong's number. MACULA's extended numbers carry a letter (2050b is the conjunction ו, not Strong's 2050), so for them the key is the lemma (lemma:וְ). An Aramaic word's key is its lemma.
Which entry. One Strong's number often covers several entries (BDB lists 2617 under both חֶסֶד «goodness» and חֶסֶד² «shame»), and the first version took the first entry whose headword was the lemma, or the first entry of the number. Now every entry that lists the word's number or has its consonants is a candidate, and they are ranked, in order, by:
- a part of speech that does not differ from the word's. BDB's bold abbreviations (
n.m.,vb.,prep.…) and Jastrow's gender and verb stems are read; only the open classes are compared (noun, adjective and number count as one, a name, a verb), since for the small words MACULA and the dictionaries part their classes differently; - a full entry over a bare cross-reference («v. אבה»);
- a headword that is the lemma, pointed or without dagesh;
- how many of the verses where the word is used the entry cites;
- how many words of its bold (BDB) or italic (Jastrow) senses are among MACULA's glosses;
- a headword with the same consonants, ו and י aside (בְּכֹר, BDB בְּכוֹר);
- an entry of the word's language (Jastrow marks the Aramaic ones «ch.»);
- an entry that lists the word's Strong's number (only the word's commonest number, and not a lettered one);
- the dictionary's order.
A candidate with another headword must list the number. One with the same consonants only must list it, cite one of the word's verses, or, for an Aramaic word, be an Aramaic entry that shares a word with the glosses. The OSHB definition is chosen the same way, by headword, part of speech, the words it shares with the BDB entry chosen (חֶסֶד «goodness», not «shame»), the words it shares with the glosses, the number, and the index's order.
Examples. With an English pool from school-sents usfm … --hebrew-verses, dict.tsv.examples gives each word examples in layers: the verse in Hebrew (or Aramaic), word for word (MACULA's glosses), the verse in JPS 1917, and an empty column for the idea, a commentary to come. The examples are the word's two shortest one-verse sentences, ties going to the earlier book. The pool must be cut with --hebrew-verses: eBible's JPS numbers its verses the English way and gives the Hebrew number where it differs (982 marks in the Psalms alone), and our trees use the Hebrew numbers.
Targum Onkelos. targum counts the written forms of Onkelos (Sefaria's text, public domain, …/Targum/Onkelos/Torah/Onkelos <Book>/Hebrew/Onkelos <Book>.json) and matches each to a Jastrow entry: the headword itself, the same without dagesh, the same after a prefix ו ד ל ב, or the same consonants. A match by consonants only must cite one of the verses where the form is. Among the candidates the one wins whose italic senses are among MACULA's glosses of the Hebrew verses the form translates in the most verses (בַּר «son», not «field»), then the one that cites the most of these verses, then an Aramaic entry. The forms of one entry make one word. <out.tsv> lists the n commonest words (300 by default) with their forms; .examples gives each its two shortest verses with Onkelos, the Hebrew it translates, word for word and JPS 1917.
Pages. The site writes the dictionaries' pages from these tables (papers mova-site --tanakh-dict … --aramaic-dict … --targum … --torah-dict …, module hebrew_dicts): a page per word, the letters a hundred words to a page, a front with the 200 commonest words, Targum Onkelos fifty words to a page; each word with the glosses, OSHB, BDB and Jastrow meanings (whole entries folded), why they were chosen, and its verses, each linked to its page in the corpora.
Run (2026-10-18)
L=$RESEARCH_RAW/lexres/dictionaries; D=$MOVA_DATA/corpora/judaism/dict
macula <WLC/lowfat> $D/wlc-trees
school-sents usfm <ebible/engjps> $D/tanakh-jps1917.tsv jps - --hebrew-verses
macula dict $D/wlc-trees $L/sefaria/BDB_Dictionary.jsonl $L/oshb-hebrewlexicon/LexicalIndex.xml $D/tanakh-en.tsv $D/tanakh-jps1917.tsv
macula dict <torah trees> $L/sefaria/BDB_Dictionary.jsonl $L/oshb-hebrewlexicon/LexicalIndex.xml $D/torah-en.tsv $D/tanakh-jps1917.tsv
macula dict $D/wlc-trees $L/sefaria/BDB_Aramaic_Dictionary.jsonl $L/oshb-hebrewlexicon/LexicalIndex.xml $D/aramaic-en.tsv $D/tanakh-jps1917.tsv --lang arc --jastrow $L/sefaria/Jastrow_Dictionary.jsonl
macula targum <Onkelos/Torah> $L/sefaria/Jastrow_Dictionary.jsonl $D/wlc-trees $D/tanakh-jps1917.tsv $D/targum-onkelos.tsv 300
All of it takes about 25 s.
Measured (2026-10-18)
- The English pool. JPS 1917, 39 books, 24 786 sentences; with the Hebrew numbers it covers 23 212 of the 23 213 verses of the trees. Missing: PSA.70.6, since eBible marks no Hebrew numbers in Psalm 70, so its five English verses sit one verse off the Hebrew; and NEH.7.73 is the English number with no Hebrew verse.
- The Tanakh (Hebrew words): 8 377 words; 8 272 with a BDB entry, 8 327 with an OSHB definition; 13 955 examples. 8 048 of the BDB entries chosen cite at least one verse where the word is used.
- The Torah: 3 486 words; 3 471 with a BDB entry (3 423 before), 3 477 with an OSHB definition (3 451 before); 5 816 examples.
- Biblical Aramaic: 698 lemmas; 643 with a BDB entry, 687 with an OSHB definition, 450 with a Jastrow entry; 1 141 examples.
- Targum Onkelos: 5 846 verses, 82 914 words, 17 325 written forms. 40 290 words (48.6%) meet a Jastrow entry, as 2 178 entries: the headword 19 406, without dagesh 4 009, after a prefix 7 120 and 2 948, by consonants with a cited verse 5 432 and 1 375. The 300 commonest are kept.
- What the ranking changed (against the first version, same trees and dictionaries): in the Torah the BDB entry changed for 647 of 3 486 words (48 of them had none), the OSHB definition for 259 (26 had none). In the whole Tanakh, 1 740 of 8 377 BDB entries changed (217 had none) and 632 OSHB definitions (127 had none). The cases named in the manual are right now: חֶסֶד goodness (OSHB had «shame»), בַּיִת house (OSHB had «between»), שֵׁשׁ byssus (BDB had «six», OSHB «alabaster»), מִן the preposition (BDB had the god מְנִי), אֵת 854 «with» (BDB had the object marker), כִּי the conjunction (BDB had «burning»), שָׁנָה year (BDB had «change»), אָב, עַם, אָח, כֹּל and others whose first entry was a cross-reference. Checked by eye: the 30 commonest changes and 20 spread over the rest were all better; of the 11 Torah changes where the new entry cites none of the word's verses, 5 are better, 4 worse (נֵץ «blossom» → «hawk», יָנַק, יָרֵא, מוֹרֶה) and 2 neither.
Limits.
- The suffix morphemes MACULA keeps as words have no entry of their own: the Aramaic article -א (
lemma:א, 799 times) meets Jastrow's letter א, and the Aramaiclemma:הnone; the Hebrew article and the preposition ב are now matched to BDB's article and preposition entries. - Jastrow has few proper names and is matched by consonants for many Aramaic words, so 248 Aramaic lemmas have no Jastrow entry, and some take a homonym (קִרְיָה II «townsman» for «city»).
- The Targum's words are written forms, not lemmas, gathered by their Jastrow entry. Forms with a pronoun suffix often meet the wrong entry (לְהוֹן «to them» → הוֹן II «wealth»), and half the Targum's words meet none.
Pragmatics
macula prag reads each Hebrew sentence into the columns of the parse database's prag.tsv: form, act, indirect, hedge, polarity, voice. It does this by rules on MACULA's words: the verb type in MISC Type= (wayyiqtol, imperative, jussive, cohortative, yiqtol, weqatal, …), person in FEATS, interrogatives, negatives and נָא. The code is in src/prag.rs.
macula prag <trees-dir> <out.tsv> [--with rule,…] [--without rule,…]
macula prag-compare <out.tsv> <trees-dir>/verses.tsv <en prag.tsv> <en pool.tsv.verses>
macula prag-quotes <en pool.tsv>
The rules are also a library call, macula::prag::read_sentence(rows, open_before, &Rules), which roundtrip mixed uses on the trees of the Hebrew parser.
prag adds four columns after teacher:
speech:-narration,quotea frame and its quote,framea frame whose quote is in the next sentence,continside a quote begun earlier,barespeech with no frame;marked: the sentence shows speech on its own, through a first or second person, a volitive, a question word or נָא;negation: there is a negative word anywhere in the sentence;frame: the frame's own reading,form/act/negation.
prag-quotes prints the JPS quote state of each English sentence, so the speech measure can be checked by eye.
How it works
- The sentence is cut into frame and quote.
- לֵאמֹר opens a quote whatever verb comes before it, and everything after it is the quote. If only its own words follow («לֵאמֹר לוֹ»), the quote is in the next sentence.
- Otherwise the
ccompour trees hang on a verb of saying (אמר, דבר, צוה, ענה, שאל, קרא) is the quote, together with the later clauses on that verb. - A narrator's wayyiqtol in the third person ends the quote: «וַיְהִי אוֹר», and there was light.
- קָרָא with שֵׁם as its object names something. It does not speak.
- In a multi-verb frame (וַיַּעַן … וַיֹּאמֶר) the later verb takes the quote.
- The quote is read as a character's speech, and the frame as narration. The row follows the English convention: a sentence that holds a quote takes the quote's form and act and voice «character». The frame's reading is kept in
frame. - Speech is carried from sentence to sentence within a book.
- A frame that ends a verse («And the LORD spoke unto Moses, saying:») and a quote that reaches the end of its verse both leave a quote open.
- The next sentence goes on in it (
cont) until a narrator takes the story up again. That is a wayyiqtol in the third person with no first or second person in its clause, or a qatal with no mark of speech in the sentence.
- The speech is read.
- An imperative, jussive or cohortative, or an infinitive absolute heading the clause, gives form
impand actrequest. - A yiqtol or weqatal in the second person («thou shalt (not) …») gives act
requestwithindirect1. - A question word (מִי, מָה, אֵיךְ, …) gives form
wh, and interrogative הֲ givesq. A question takes actaskunless its first clause is a volitive. - A yiqtol or weqatal in the first person gives
promise. - The form is the first clause's. The act is that of any clause.
- נָא gives hedge 1.
- Narration is
decl, with actnarratefor a wayyiqtol andassertotherwise.
- An imperative, jussive or cohortative, or an infinitive absolute heading the clause, gives form
- Polarity is left
none. The English scheme's polarity is the speaker's evaluation (Smart annotator — layers, context, memory), not negation. Negation has its own column.
What is measured, and what each number means
prag-compare lines up the 5 782 verses that are one Hebrew sentence with the English reading of the same verses, which a teacher gave JPS 1917 sentence by sentence in the parse database. It gives:
- Raw agreement with the teacher, field by field. The English values of a verse are taken as before: «request» if any of its sentences is, then «ask», else the first sentence's; voice «character» if any is; polarity «neg» if any is. This is agreement with a noisy teacher, not accuracy. The teacher is not consistent even on the plainest forms. Of 73 English sentences that open with «(And) thou shalt not …», it gives a directive act to 55 and polarity «neg» to 8.
- The constant answer. For every field this is the share of the commonest English value, the floor a rule has to beat.
- What both schemes can say. Acts are grouped by Searle's classes: directive (request, suggest, warn), question (ask), commissive (promise, offer), expressive, and statement (assert, narrate and the rest). The teacher splits narration between
narrateandassertalmost at random, which no rule can follow. Polarity is also given with «pos» read as «none». - Voice of the sentence read alone. Hebrew «character» only for speech the sentence shows itself: a frame with its quote, bare speech, or a carried sentence with a mark of speech. The teacher labels sentences one by one, and its «character» follows what a sentence shows: it misses most carried speech.
- Speech against the quotes of JPS 1917, an independent measure that needs no teacher. JPS marks direct speech with single quotes, and the tracker follows them from sentence to sentence (possessives are not quotes, and quotes are not nested). A verse is speech if any of it is inside a quote, and this is compared with the Hebrew voice. It holds for Genesis, Exodus and Numbers. JPS leaves the law of Leviticus and Moses' speech in Deuteronomy unquoted, so there a low precision means JPS gave no quotes, not that the Hebrew is wrong.
- Negation against the English negation words (not, no, nor, neither, never, nothing, none, nought, naught, cannot, nay). This compares a negative word anywhere in the Hebrew sentence with one anywhere in the English verse.
- Each field by what the Hebrew verse holds of speech (
-,quote,cont, …). This shows where the disagreements live.
Measured (2026-10-17)
The Torah, 5 782 verses that are one Hebrew sentence. Speech is given as agreement, and for Genesis also as precision / recall.
| form | act | act class | polarity | voice | voice alone | speech GEN | speech EXO | speech NUM | negation | |
|---|---|---|---|---|---|---|---|---|---|---|
| the constant answer | 87.0 | 48.4 | 74.3 | 85.0 | 68.0 | 68.0 | — | — | — | — |
| root-based version (before) | 89.4 | 47.1 | 78.1 | 81.6 | 65.8 | 68.0 | 63.6 (97.2 / 27.7) | 64.3 | 72.7 | — |
no rule (--without all) | 89.1 | 49.3 | 79.1 | 85.0 | 71.4 | 71.4 | 78.5 (97.8 / 58.2) | 72.9 | 77.8 | 97.8 |
| now | 91.8 | 54.7 | 81.9 | 85.0 | 65.3 | 74.4 | 95.7 (96.5 / 94.9) | 83.9 | 83.1 | 97.8 |
| the teacher's own voice | 86.4 (98.9 / 73.4) | 72.0 | 76.0 |
Reading the table:
- Speech is now found in 95.7% of Genesis verses as JPS marks it, against 63.6% before. The teacher's own voice agrees with the JPS quotes less (86.4%), because it misses carried speech.
- The act beats the constant answer by 6.3 points raw and 7.6 by class.
- Polarity equals the constant answer, because the rules no longer claim it (see below).
- Voice against the teacher stays below the constant answer, and this is a property of the teacher. The Hebrew follows the discourse, which JPS confirms, while the teacher marks only the speech a sentence shows on its own. Read alone, the Hebrew voice beats the constant answer by 6.4 points.
- Negation agrees with the English negation words in 97.8% of verses: precision 95.8, recall 93.6.
Two runs give the same files byte for byte, and a run takes 0.13 s.
Each rule, left out of the rules now in use, or put in when it is off. The figures are the change in points. The decisions were made on the Genesis speech measure and on act class. Exodus and Numbers were watched as a check, so they are not strictly held out.
| rule | what it does | effect | kept |
|---|---|---|---|
ccomp | the ccomp of a verb of saying is the quote | speech GEN +12.2, EXO +4.9, NUM +3.3; act +4.5, class +2.4, form +2.3 | yes |
carry | quotes go on into the next sentences | speech GEN +3.8, EXO +5.1, NUM +1.7; voice against the teacher −10.7 (it misses carried speech) | yes |
lemor | לֵאמֹר opens a quote after any verb | speech GEN +1.3, NUM +4.2 | yes |
close-qatal | a qatal with no mark of speech closes a quote | speech GEN +1.1, EXO +2.3, NUM +2.8 | yes |
promise | first-person yiqtol/weqatal in speech is a promise (commissive) | act +0.6, class +0.5 | yes |
first-form | the form is the first clause's | form +0.6 | yes |
infabs | an infinitive absolute heading a clause commands | form +0.2, act +0.3, class +0.3 | yes |
ask-first | a question asks even with a second-person verb | act +0.2, class +0.1 | yes |
amar | after a finite אמר, what follows its arguments is the quote, or the next sentence is | act −0.1, speech GEN ±0, NUM −0.3 | no |
inner-frame | a frame inside open speech, or in the 1st/2nd person, is the character's | act −0.9, speech GEN −0.2, NUM −1.2 | no |
propose | a plural cohortative, or a jussive with נָא, suggests | act −0.2 | no |
resolve | a singular cohortative is the speaker's resolve (promise) | act −0.1, class −0.1 | no |
rhetorical | הֲלֹא asserts | act −0.1 | no |
close-offline | any unmarked clause that is not yiqtol/weqatal/volitive closes a quote | speech GEN −1.5, EXO −3.1 (voice against the teacher +6.8) | no |
law3 | a third-person yiqtol/weqatal in carried law prescribes | act −4.1, class −8.7 | no |
neg-polarity | a negation makes polarity «neg» (the first versions) | polarity −4.6 | no |
evaluate | words that judge (טוב, ברך … / רע, ארר, חטא …) give polarity, negation flips it | polarity −5.4 | no |
A distinction between לֹא + yiqtol (a lasting prohibition) and אַל + jussive (a specific one) was also tried. It changed nothing: the first is already a second-person command and the second a volitive. It was left out.
Sources
These were read, from the Scientist's library, and this is what each gave.
- C. L. Miller-Naudé & J. A. Naudé (2015), The Translation of Quotative Frames in the Hebrew Bible, Folia Orientalia 52.
- In narrative the frame comes before the quote.
- וַיֹּאמֶר is the neutral frame.
- In multi-verb frames the general verb comes last.
- לֵאמֹר is a grammaticalized infinitive that always introduces the quote, even after verbs that are not of saying.
- These gave rules
lemor,ccompandamar, and the multi-verb frame.
- J. A. Cook (2008), The Vav-Prefixed Verb Forms in Elementary Hebrew Grammar, Journal of Hebrew Scriptures 8.
- Wayyiqtol is the past narrative form, and weqatal is modal.
- לֹא + yiqtol and אַל + jussive are the negated modal forms.
- These gave the narrator's wayyiqtol that closes a quote, and weqatal as a command.
- A. Andrason (2011), Biblical Hebrew Wayyiqtol: A Dynamic Definition, Journal of Hebrew Scriptures 11. Wayyiqtol is the foreground of narration (the discourse view it surveys), and it is never performative.
- E. T. Racher (2017), An interpersonal sketch of the biblical Hebrew clause, Functional Linguistics 4:9.
- Volitives: אַל + jussive is specific, and לֹא + yiqtol is general.
- The imperative is never negated.
- נָא after an imperative is polite, and after a cohortative or jussive it proposes (after Christiansen 2009).
- הִנֵּה draws attention.
- Unmarked questions are doubtful (after Meister 1996), so the rules mark no question without a question word.
- These gave the command rules,
propose, the hedge, and the prohibition test.
- B. Isaksson (2024), The Verb in Classical Hebrew: The Linguistic Reality behind the Consecutive Tenses, Open Book Publishers.
- Weqatal after an imperative goes on with the command.
- וְהִנֵּה after a verb of seeing is a perception, not speech, so הִנֵּה is no mark of speech here.
- A quote can open with כִּי, which is behind
amar.
- Jones (2024), Prayer and (Im)Politeness: Reading Psalm 7, Old Testament Essays 37/3. נָא and the long imperative mark deference, which is the hedge.
- A. Andrason (2012), Making It Sound: The Performative Qatal and Its Explanation, Journal of Hebrew Scriptures 12. A first-person qatal in speech can perform the act («I hereby give»). There is no rule yet, because the English scheme has no class for declarations.
- Benigni, The biblical Hebrew particle ky from a discourse analysis perspective, Zeitschrift für Althebraistik. It reads כִּי as a shift of textual level. It does not support a «recitative» כִּי, so no rule was made from it.
- J. R. Searle (1976), A classification of illocutionary acts, Language in Society 5. Its classes are used for the act measure.
Limits
- The teacher is the only gold for act and form, and it is noisy. Its narrate/assert split and its polarity cannot be followed by any rule.
- JPS quotes are a gold for speech only where JPS uses them. That is Genesis, Exodus and Numbers.
- Nothing here is strictly held out. Exodus and Numbers were watched while rules were decided on Genesis.
- Speech carrying fails in some places. It cannot see the end of a speech that ends without a narrator's wayyiqtol or qatal, nor a narrator's clause that opens with a subject and a participle, such as «וְרִבְקָה שֹׁמַעַת».
- The frame and quote follow our trees. A quote the trees do not hang as
ccomp, and that has no לֵאמֹר, is missed.amartried to catch these and did not pay. - The trees changed under the rules (2026-10-17). With PTNK's readings (לֵאמֹר headed by its ל, הָיָה a copula, marks of punctuation as tokens) the rules read words only (multiword tokens and PUNCT left out) and do not take לֵאמֹר for a quote of its verb. Against the English reading: form 91.8 → 92.0%, act 54.7 → 55.4%, voice 65.3 → 64.8%, voice of the sentence alone 74.4% both.
Limits
- The relations are ours. They are read off MACULA's groups by the rules above, not hand-annotated in UD. Against UD PTNK they reach UAS 96.5 / LAS 93.6 on test (above).
- The head rules are general. Over 600 group rules in the Torah share them, so special constructions (oaths, infinitive absolutes, casus pendens) get the generic reading.
This page in Markdown → https://md.mova.elamur.ai/free/en/docs/tools/macula/