The Samaritan Pentateuch (SP) is a version of the Torah preserved by the Samaritan community, differing from the Masoretic Text (MT) in several aspects, including language, orthography, and occasionally theological emphasis. This notebook compares the text of the Masoretic Text, based on the BHSA dataset in Text-Fabric, with the Samaritan Pentateuch, also available as a Text-Fabric dataset.1
In this analysis, we focus on comparing the text of the verses in a specific parasha, highlighting differences in wording and orthography. Additionally, special attention is given to spelling variations of proper nouns between the two traditions. This notebook draws inspiration from the notebook provided by Martijn Naaijer2 and aims to explore the textual nuances between these two important versions of the Torah.
The following code will load the Text-Fabric version of the Samaritan Pentatuch, the Biblia Hebraica Stuttgartensia (Amstelodamensis) together with the additonal parasha related features from tonyjurg/BHSaddons.
from tf.app import use
# Load the SP data, and rename the node features class F,
# the locality class L and the text class T,
# then they cannot be overwritten while loading the MT.
SP = use('DT-UCPH/sp', version='3.4')
Fsp, Lsp, Tsp = SP.api.F, SP.api.L, SP.api.T
# Do the same for the MT dataset (BHSA) together with BHSaddons
MT = use('etcbc/bhsa', version='2021',mod="tonyjurg/BHSaddons/tf/")
Fmt, Lmt, Tmt = MT.api.F, MT.api.L, MT.api.T
Locating corpus resources ...
Name | # of nodes | # slots / node | % coverage |
---|---|---|---|
book | 5 | 79878.40 | 100 |
chapter | 187 | 2135.79 | 100 |
verse | 5841 | 68.38 | 100 |
word | 114890 | 3.48 | 100 |
sign | 399392 | 1.00 | 100 |
3
DT-UCPH/sp
C:/Users/tonyj/text-fabric-data/github/DT-UCPH/sp/app
g0c9b2fff6448228af93ed6c466ba95e6c0bb3547
''
layoutRich
orig
{docRoot}/bhsa
''
''
https://etcbc.github.io
0_home
{}
True
local
C:/Users/tonyj/text-fabric-data/github/DT-UCPH/sp/_temp
The Samaritan Pentateuch
DT-UCPH
/tf
sp
3.4
v3.4
{verse}
{verse}
True
lex
}hbo
Locating corpus resources ...
Name | # of nodes | # slots / node | % coverage |
---|---|---|---|
book | 39 | 10938.21 | 100 |
chapter | 929 | 459.19 | 100 |
lex | 9230 | 46.22 | 100 |
verse | 23213 | 18.38 | 100 |
half_verse | 45179 | 9.44 | 100 |
sentence | 63717 | 6.70 | 100 |
sentence_atom | 64514 | 6.61 | 100 |
clause | 88131 | 4.84 | 100 |
clause_atom | 90704 | 4.70 | 100 |
phrase | 253203 | 1.68 | 100 |
phrase_atom | 267532 | 1.59 | 100 |
subphrase | 113850 | 1.42 | 38 |
word | 426590 | 1.00 | 100 |
3
etcbc/bhsa
C:/Users/tonyj/text-fabric-data/github/etcbc/bhsa/app
gd905e3fb6e80d0fa537600337614adc2af157309
''
<code>Genesis 1:1</code> (use <a href="https://github.com/{org}/{repo}/blob/master/tf/{version}/book%40en.tf" target="_blank">English book names</a>)
g_uvf_utf8
g_vbs
kq_hybrid
languageISO
g_nme
lex0
is_root
g_vbs_utf8
g_uvf
dist
root
suffix_person
g_vbe
dist_unit
suffix_number
distributional_parent
kq_hybrid_utf8
crossrefSET
instruction
g_prs
lexeme_count
rank_occ
g_pfm_utf8
freq_occ
crossrefLCS
functional_parent
g_pfm
g_nme_utf8
g_vbe_utf8
kind
g_prs_utf8
suffix_gender
mother_object_type
none
unknown
NA
{docRoot}/{repo}
''
''
https://{org}.github.io
0_home
{}
True
local
C:/Users/tonyj/text-fabric-data/github/etcbc/bhsa/_temp
BHSA = Biblia Hebraica Stuttgartensia Amstelodamensis
10.5281/zenodo.1007624
Phonetic Transcriptions
https://nbviewer.jupyter.org/github/etcbc/phono/blob/master/programs/phono.ipynb
10.5281/zenodo.1007636
etcbc
/tf
phono
Parallel Passages
https://nbviewer.jupyter.org/github/etcbc/parallels/blob/master/programs/parallels.ipynb
10.5281/zenodo.1007642
etcbc
/tf
parallels
etcbc
/tf
bhsa
2021
https://shebanq.ancient-data.org/hebrew
Show this on SHEBANQ
la
True
{webBase}/text?book=<1>&chapter=<2>&verse=<3>&version={version}&mr=m&qw=q&tp=txt_p&tr=hb&wget=v&qget=v&nget=vt
{webBase}/word?version={version}&id=<lid>
v1.8
{typ} {rela}
''
True
{code}
1
''
True
{label}
''
True
gloss
{voc_lex_utf8}
word
orig
{voc_lex_utf8}
{typ} {function}
''
True
{typ} {rela}
1
''
{number}
''
True
{number}
1
''
True
{number}
''
pdp vs vt
lex:gloss
hbo
In this section, we compare the surface texts of the Samaritan Pentateuch (SP) and the Masoretic Text (MT) at the verse level. By analyzing the wording and structure of these texts, we aim to identify variations.
# find all word nodes for this parasha (we can either use the transliterated name or the sequence number)
parashaQuery = '''
verse parashanum=5
'''
parashaResults = MT.search(parashaQuery)
0.01s 105 results
# Extract book, chapter, and verse information
bookChapterVerseList = [
Tmt.sectionFromNode(verse[0]) for verse in parashaResults
]
# Store parashname, start and end verse for future use
startNode=parashaResults[0][0]
endNode=parashaResults[-1][0]
parashaNameHebrew=Fmt.parashahebr.v(startNode)
parashaNameEnglish=Fmt.parashatrans.v(startNode)
bookStart,chapterStart,startVerse=Tmt.sectionFromNode(startNode)
parashaStart=f'{bookStart} {chapterStart}:{startVerse}'
bookEnd,chapterEnd,startEnd=Tmt.sectionFromNode(endNode)
parashaEnd=f'{chapterEnd}:{startEnd}'
def wrapHTML(body, title):
output = (
f'<html><head><title>{title.replace(">",">")}</title></head>'
f'<body>{body}<p>Data generated by `delta_mt_and_sp.ipynb` at '
'`<a href="https://github.com/tonyjurg/Parashot" target="_blank">'
'github.com/tonyjurg/Parashot</a>`</p></body></html>'
)
return output
# Function to reconstruct verses
def reconstructVerses(F, L, T, textFeature, inputList):
"""Reconstruct text for each verse."""
verseTexts = {}
for verseName in inputList:
verseText = ''
verseNode = T.nodeFromSection(verseName)
wordNodes = L.d(verseNode, 'word')
for wordNode in wordNodes:
wordText = eval(f'F.{textFeature}.v(wordNode)')
trailer = F.trailer.v(wordNode)
if wordText:
verseText += wordText + (trailer if trailer else ' ')
verseTexts[verseName] = verseText.strip()
return verseTexts
SPverses = reconstructVerses(Fsp, Lsp, Tsp, 'g_cons', bookChapterVerseList)
MTverses = reconstructVerses(Fmt, Lmt, Tmt, 'g_cons', bookChapterVerseList)
from difflib import SequenceMatcher
from IPython.display import HTML, display
def highlightMatches(baseText, comparisonText):
matcher = SequenceMatcher(None, baseText, comparisonText)
highlightedComparisonText = ""
for tag, i1, i2, j1, j2 in matcher.get_opcodes():
if tag == "equal": # Identical parts
highlightedComparisonText += comparisonText[j1:j2]
else: # Non-matching parts
highlightedComparisonText += f'<mark>{comparisonText[j1:j2]}</mark>'
return highlightedComparisonText
def cleanText(text):
replacements = [
# for the transcoded strings
('00_P', ''), # Remove '00_P'
('00_S', ''), # Remove '00_S'
('00', ''), # Remove '00'
('&', ' '), # Replace '&' with a space
# for the Hebrew strings
('ס ', ''), # Final Samekh
('פ ', ''), # Final Pe
('׃', ''), # End of verse
('־',' ') # maqaf
]
# Apply each replacement
for old, new in replacements:
text = text.replace(old, new)
return text
# Function to format and highlight verse differences between MT and SP
def formatAndHighlight(label, MTverseText, SPverseText):
book, chapter, verse = label
MTverseNode = Tmt.nodeFromSection(label)
MTtext = cleanText(Tmt.text(MTverseNode, "text-orig-plain"))
SPverseNode = Tsp.nodeFromSection(label)
SPtext = Tsp.text(SPverseNode)
SPmarkedText = highlightMatches(MTtext, SPtext)
MTmarkedText = highlightMatches(SPtext, MTtext)
formattedDiff = (
f'<h4><a href=\"https://www.stepbible.org/?q=version=NASB2020&reference='
f'{book}.{chapter}:{verse}&options=HNVUG\" target=\"_blank\">{book} {chapter}:{verse}</a></h4>'
f'<p><b>SP:</b> {SPmarkedText}<br><b>MT:</b> {MTmarkedText}</p>'
)
return formattedDiff
# Gather differences into an HTML string
reportTitle=f'Differences between MT and SP for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})'
htmlContent = f'<h2>{reportTitle}</h2>'
for label, MTverseText in MTverses.items():
SPverseText = SPverses.get(label, '')
MTverseText = cleanText(MTverseText)
if MTverseText != SPverseText: # Check for differences
difference = formatAndHighlight(label, MTverseText, SPverseText)
htmlContent += difference
# Display the HTML content in the notebook
display(HTML(htmlContent))
# Define the HTML filename and store to file
fileName = f"differences_MT_SP({parashaNameEnglish.replace(' ','_')}).html"
htmlContentFull = wrapHTML(htmlContent,reportTitle)
with open(fileName, "w", encoding="utf-8") as file:
file.write(htmlContentFull)
# display download button
downloadButton = f"""
<a download="{fileName}" href="data:text/html;charset=utf-8,{htmlContentFull.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')}" target="_blank">
<button>Download as HTML</button>
</a>
"""
display(HTML(downloadButton))
SP: ויהיו חיי שרה מאת שנה ועשרים שנה ושבע שנים שני חיי שרה
MT: ויהיו חיי שׂרה מאה שׁנה ועשׂרים שׁנה ושׁבע שׁנים שׁני חיי שׂרה
SP: ותמת שרה בקרית הארבע אל עמק היא חברון בארץ כנען ויבא אברהם לספד לשרה ולבכותה
MT: ותמת שׂרה בקרית ארבע הוא חברון בארץ כנען ויבא אברהם לספד לשׂרה ולבכתה
SP: ויקם אברהם מעל פני מיתו וידבר אל בני חת לאמר
MT: ויקם אברהם מעל פני מתו וידבר אל בני חת לאמר
SP: גר ותושב אנכי עמכם תנו לי אחזת קבר עמכם ואקברה את מיתי מלפני
MT: גר ותושׁב אנכי עמכם תנו לי אחזת קבר עמכם ואקברה מתי מלפני
SP: ויענו בני חת את אברהם לאמר לא
MT: ויענו בני חת את אברהם לאמר לו
SP: שמענו אדני נשיא אלהים אתה בתוכנו במבחר קברינו קבר את מיתך איש ממנו את קברו לא יכלה ממך מקבר מיתך
MT: שׁמענו׀ אדני נשׂיא אלהים אתה בתוכנו במבחר קברינו קבר את מתך אישׁ ממנו את קברו לא יכלה ממך מקבר מתך
SP: ויקם אברהם וישתחוי לעם הארץ לבני חת
MT: ויקם אברהם וישׁתחו לעם הארץ לבני חת
SP: וידבר אתם לאמר אם ישת נפשכם לקבר את מיתי מלפני שמעוני ופגעו לי בעפרון בן צהר החתי
MT: וידבר אתם לאמר אם ישׁ את נפשׁכם לקבר את מתי מלפני שׁמעוני ופגעו לי בעפרון בן צחר
SP: לא אדני שמעני השדה נתתי לך והמערה אשר בו לך נתתיה לעיני בני עמי נתתיה לך קבר מיתך
MT: לא אדני שׁמעני השׂדה נתתי לך והמערה אשׁר בו לך נתתיה לעיני בני עמי נתתיה לך קבר מתך
SP: וישתחוי אברהם לפני עם הארץ
MT: וישׁתחו אברהם לפני עם הארץ
SP: וידבר אל עפרון באזני עם הארץ לאמר אך אם אתה לי שמעני נתתי כסף השדה קח ממני ואקברה את מיתי שם
MT: וידבר אל עפרון באזני עם הארץ לאמר אך אם אתה לו שׁמעני נתתי כסף השׂדה קח ממני ואקברה את מתי שׁמה
SP: ויען עפרון את אברהם לאמר לא
MT: ויען עפרון את אברהם לאמר לו
SP: אדני שמעני ארץ ארבע מאות שקל כסף ביני ובינך מה הוא ואת מיתך קבר
MT: אדני שׁמעני ארץ ארבע מאת שׁקל כסף ביני ובינך מה הוא ואת מתך קבר
SP: וישמע אברהם אל עפרון וישקל אברהם לעפרון את הכסף אשר דבר באזני בני חת ארבע מאות שקל כסף עבר לסחר
MT: וישׁמע אברהם אל עפרון וישׁקל אברהם לעפרן את הכסף אשׁר דבר באזני בני חת ארבע מאות שׁקל כסף עבר לסחר
SP: ויקם שדה עפרון אשר במכפלה אשר על פני ממרא השדה והמערה אשר בו וכל העץ אשר בשדה אשר בכל גבולו סביב
MT: ויקם׀ שׂדה עפרון אשׁר במכפלה אשׁר לפני ממרא השׂדה והמערה אשׁר בו וכל העץ אשׁר בשׂדה אשׁר בכל גבלו סביב
SP: ואחרי כן קבר אברהם את שרה אשתו אל מערת שדה המכפלה על פני ממרא היא חברון בארץ כנען
MT: ואחרי כן קבר אברהם את שׂרה אשׁתו אל מערת שׂדה המכפלה על פני ממרא הוא חברון בארץ כנען
SP: ואשביעך ביהוה אלהי השמים ואלהי הארץ אשר לא תקח אשה לבני מבנות הכנעני אשר אנכי ישב בקרבו
MT: ואשׁביעך ביהוה אלהי השׁמים ואלהי הארץ אשׁר לא תקח אשׁה לבני מבנות הכנעני אשׁר אנכי יושׁב בקרבו
SP: כי אם אל ארצי ואל מולדתי תלך ולקחת אשה לבני ליצחק
MT: כי אל ארצי ואל מולדתי תלך ולקחת אשׁה לבני ליצחק
SP: יהוה אלהי השמים אשר לקחני מבית אבי ומארץ מולדתי ואשר דבר לי ואשר נשבע לי לאמר לזרעך אתן את הארץ הזאת הוא ישלח מלאכו לפניך ולקחת אשה לבני משם
MT: יהוה׀ אלהי השׁמים אשׁר לקחני מבית אבי ומארץ מולדתי ואשׁר דבר לי ואשׁר נשׁבע לי לאמר לזרעך אתן את הארץ הזאת הוא ישׁלח מלאכו לפניך ולקחת אשׁה לבני משׁם
SP: ואם לא תאבה האשה ללכת אחריך ונקית משבועתי זאת רק את בני לא תשיב שמה
MT: ואם לא תאבה האשׁה ללכת אחריך ונקית משׁבעתי זאת רק את בני לא תשׁב שׁמה
SP: ויברך הגמלים מחוץ לעיר על באר המים לעת ערב לעת צאת השאבות
MT: ויברך הגמלים מחוץ לעיר אל באר המים לעת ערב לעת צאת השׁאבת
SP: ויאמר יהוה אלהי אדני אברהם הקרא נא לפני היום ועשה חסד עם אדני אברהם
MT: ויאמר׀ יהוה אלהי אדני אברהם הקרה נא לפני היום ועשׂה חסד עם אדני אברהם
SP: והיה הנערה אשר אמר אליה הטני כדך ואשתה ואמרה שתה וגם גמליך אשקה אתה הוכחת לעבדך ליצחק ובה אדע כי עשית חסד עם אדני אברהם
MT: והיה הנער אשׁר אמר אליה הטי נא כדך ואשׁתה ואמרה שׁתה וגם גמליך אשׁקה אתה הכחת לעבדך ליצחק ובה אדע כי עשׂית חסד עם אדני
SP: ויהי הוא טרם כלה לדבר אל לבו והנה רבקה יצאת אשר ילדה לבתואל בן מלכה אשת נחור אחי אברהם וכדה על שכמה
MT: ויהי הוא טרם כלה לדבר והנה רבקה יצאת אשׁר ילדה לבתואל בן מלכה אשׁת נחור אחי אברהם וכדה על שׁכמה
SP: והנערה טובת מראה מאד בתולה ואיש לא ידעה ותרד העין ותמלא כדה ותעל
MT: והנער טבת מראה מאד בתולה ואישׁ לא ידעה ותרד העינה ותמלא כדה ותעל
SP: וירץ העבד לקראתה ויאמר הגמיני נא מעט מים מכדך
MT: וירץ העבד לקראתה ויאמר הגמיאיני נא מעט מים מכדך
SP: ותאמר שתה אדני ותמהר ותורד כדה על ידה ותשקהו
MT: ותאמר שׁתה אדני ותמהר ותרד כדה על ידה ותשׁקהו
SP: ותכל להשקותו ותאמר גם לגמליך אשאב עד אם כלו לשתות
MT: ותכל להשׁקתו ותאמר גם לגמליך אשׁאב עד אם כלו לשׁתת
SP: ותמהר ותורד כדה על השקות ותרץ עוד אל הבאר לשאב ותשאב לכל גמליו
MT: ותמהר ותער כדה אל השׁקת ותרץ עוד אל הבאר לשׁאב ותשׁאב לכל גמליו
SP: והאיש משתה לה ומחריש לדעת הצליח יהוה דרכו אם לא
MT: והאישׁ משׁתאה לה מחרישׁ לדעת ההצליח יהוה דרכו אם לא
SP: ויהי כאשר כלו הגמלים לשתות ויקח האיש נזם זהב בקע משקלו וישם על אפה ושני צמידים על ידיה עשרה זהב משקלם
MT: ויהי כאשׁר כלו הגמלים לשׁתות ויקח האישׁ נזם זהב בקע משׁקלו ושׁני צמידים על ידיה עשׂרה זהב משׁקלם
SP: ויאמר בת מי אתי הגידי נא לי היש בבית אביך מקום לנו ללין
MT: ויאמר בת מי את הגידי נא לי הישׁ בית אביך מקום לנו ללין
SP: ותאמר אליו גם תבן גם מספה רב עמנו וגם מקום ללין
MT: ותאמר אליו גם תבן גם מספוא רב עמנו גם מקום ללון
SP: ויקד האיש וישתחוי ליהוה
MT: ויקד האישׁ וישׁתחו ליהוה
SP: ויאמר ברוך יהוה אלהי אדני אברהם אשר לא עזב חסדו ואמתו מעם אדני אברהם אנכי בדרך נחני יהוה בית אחי אדני
MT: ויאמר ברוך יהוה אלהי אדני אברהם אשׁר לא עזב חסדו ואמתו מעם אדני אנכי בדרך נחני יהוה בית אחי אדני
SP: ותרץ הנערה ותגד לבית אמה כדברים האלה
MT: ותרץ הנער ותגד לבית אמה כדברים האלה
SP: ויהי כראותו את הנזם ואת הצמידים על ידי אחותו וכשמעו את דברי רבקה אחותו לאמר כה דבר אלי האיש ויבא אל האיש והנה עמד על הגמלים על העין
MT: ויהי׀ כראת את הנזם ואת הצמדים על ידי אחתו וכשׁמעו את דברי רבקה אחתו לאמר כה דבר אלי האישׁ ויבא אל האישׁ והנה עמד על הגמלים על העין
SP: ויאמר בא ברוך יהוה למה תעמד בחוץ ואנכי פניתי הבית ומקום לגמלים
MT: ויאמר בוא ברוך יהוה למה תעמד בחוץ ואנכי פניתי הבית ומקום לגמלים
SP: ויבא האיש הביתה ויפתח הגמלים ויתן תבן ומספה לגמלים ומים לרחץ רגליו ורגלי האנשים אשר אתו
MT: ויבא האישׁ הביתה ויפתח הגמלים ויתן תבן ומספוא לגמלים ומים לרחץ רגליו ורגלי האנשׁים אשׁר אתו
SP: ויושם לפניו לאכל ויאמר לא אכל עד אם דברתי דברי ויאמרו דבר
MT: ויישׂם לפניו לאכל ויאמר לא אכל עד אם דברתי דברי ויאמר דבר
SP: ויהוה ברך את אדני מאד ויגדל ויתן לו צאן ובקר כסף וזהב עבדים ושפחות וגמלים וחמרים
MT: ויהוה ברך את אדני מאד ויגדל ויתן לו צאן ובקר וכסף וזהב ועבדם ושׁפחת וגמלים וחמרים
SP: ותלד שרה אשת אדני בן לאדני אחרי זקנתו ויתן לו את כל אשר לו
MT: ותלד שׂרה אשׁת אדני בן לאדני אחרי זקנתה ויתן לו את כל אשׁר לו
SP: כי אם אל בית אבי תלך ואל משפחתי ולקחת אשה לבני
MT: אם לא אל בית אבי תלך ואל משׁפחתי ולקחת אשׁה לבני
SP: ואמר אל אדני אולי לא תלך האשה אחרי
MT: ואמר אל אדני אלי לא תלך האשׁה אחרי
SP: אז תנקיא מאלתי כי תבוא אל משפחתי ואם לא יתנו לך והיית נקיא מאלתי
MT: אז תנקה מאלתי כי תבוא אל משׁפחתי ואם לא יתנו לך והיית נקי מאלתי
SP: ואבוא היום אל העין ואמר יהוה אלהי אדני אברהם אם ישך נא מצליח דרכי אשר אני הלך עליה
MT: ואבא היום אל העין ואמר יהוה אלהי אדני אברהם אם ישׁך נא מצליח דרכי אשׁר אנכי הלך עליה
SP: ואמרה אלי גם אתה שתה וגם לגמליך אשאב היא האשה אשר הוכיח יהוה לבן אדני
MT: ואמרה אלי גם אתה שׁתה וגם לגמליך אשׁאב הוא האשׁה אשׁר הכיח יהוה לבן אדני
SP: אני טרם אכלה לדבר אל לבי והנה רבקה יצאת וכדה על שכמה ותרד העין ותשאב ואמר אליה השקיני נא מעט מים מכדך
MT: אני טרם אכלה לדבר אל לבי והנה רבקה יצאת וכדה על שׁכמה ותרד העינה ותשׁאב ואמר אליה השׁקיני נא
SP: ותמהר ותורד כדה מעליה ותאמר שתה וגם גמליך אשקה ואשתה וגם הגמלים השקתה
MT: ותמהר ותורד כדה מעליה ותאמר שׁתה וגם גמליך אשׁקה ואשׁת וגם הגמלים השׁקתה
SP: ואשאל אתה ואמר בת מי אתי ותאמר בת בתואל בן נחור אשר ילדה לו מלכה ואשים הנזם על אפה והצמידים על ידיה
MT: ואשׁאל אתה ואמר בת מי את ותאמר בת בתואל בן נחור אשׁר ילדה לו מלכה ואשׂם הנזם על אפה והצמידים על ידיה
SP: ואקד ואשתחוי ליהוה ואברך את יהוה אלהי אדני אברהם אשר הנחני בדרך אמת לקחת את בת אחי אדני לבנו
MT: ואקד ואשׁתחוה ליהוה ואברך את יהוה אלהי אדני אברהם אשׁר הנחני בדרך אמת לקחת את בת אחי אדני לבנו
SP: ועתה אם ישכם עשים חסד ואמת את אדני הגידו לי ואם לא הגידו לי ואפנה על הימין או על השמאל
MT: ועתה אם ישׁכם עשׂים חסד ואמת את אדני הגידו לי ואם לא הגידו לי ואפנה על ימין או על שׂמאל
SP: ויען לבן ובתואל ויאמרו מיהוה יצא הדבר לא נוכל דבר אליך רע וטוב
MT: ויען לבן ובתואל ויאמרו מיהוה יצא הדבר לא נוכל דבר אליך רע או טוב
SP: ויהי כאשר שמע עבד אברהם את דבריהם וישתחוי ארצה ליהוה
MT: ויהי כאשׁר שׁמע עבד אברהם את דבריהם וישׁתחו ארצה ליהוה
SP: ויוצא העבד כלי כסף וכלי זהב ובגדים ויתן לרבקה ומגדנות נתן לאחיה ולאמה
MT: ויוצא העבד כלי כסף וכלי זהב ובגדים ויתן לרבקה ומגדנת נתן לאחיה ולאמה
SP: ויאכלו וישתו הוא והאנשים אשר עמו וילינו ויקמו בבקר ויאמר שלחוני לאדני
MT: ויאכלו וישׁתו הוא והאנשׁים אשׁר עמו וילינו ויקומו בבקר ויאמר שׁלחני לאדני
SP: ויאמרו אחיה ואמה תשב הנערה אתנו ימים או חדש ואחר תלך
MT: ויאמר אחיה ואמה תשׁב הנער אתנו ימים או עשׂור אחר תלך
SP: ויאמר אליהם אל תאחרו אתי ויהוה הצליח את דרכי שלחוני ואלכה אל אדני
MT: ויאמר אלהם אל תאחרו אתי ויהוה הצליח דרכי שׁלחוני ואלכה לאדני
SP: ויאמרו נקרא לנערה ונשאל את פיה
MT: ויאמרו נקרא לנער ונשׁאלה את פיה
SP: ויקראו לרבקה ויאמרו לה התלכי עם האיש הזה ותאמר אלך
MT: ויקראו לרבקה ויאמרו אליה התלכי עם האישׁ הזה ותאמר אלך
SP: וישלחו את רבקה אחותם ואת מינקתה ואת עבד אברהם ואת אנשיו
MT: וישׁלחו את רבקה אחתם ואת מנקתה ואת עבד אברהם ואת אנשׁיו
SP: ויברכו את רבקה ויאמרו לה אחותנו אתי הוי לאלפי רבבה ויירש זרעיך את שער איביו
MT: ויברכו את רבקה ויאמרו לה אחתנו את היי לאלפי רבבה ויירשׁ זרעך את שׁער שׂנאיו
SP: ויצחק בא במדבר באר לחי ראה והוא ישב בארץ הנגב
MT: ויצחק בא מבוא באר לחי ראי והוא יושׁב בארץ הנגב
SP: ויצא יצחק לשוח בשדה לפנות ערב וישא עיניו וירא והנה הגמלים באים
MT: ויצא יצחק לשׂוח בשׂדה לפנות ערב וישׂא עיניו וירא והנה גמלים באים
SP: ותאמר אל העבד מי האיש הלז ההלך בשדה לקראתנו ויאמר העבד הוא אדני ותקח הצעיף ותתכס
MT: ותאמר אל העבד מי האישׁ הלזה ההלך בשׂדה לקראתנו ויאמר העבד הוא אדני ותקח הצעיף ותתכס
SP: ויביאה יצחק האהלה שרה אמו ויקח את רבקה ותהי לו לאשה ויאהבה וינחם יצחק אחרי אמו
MT: ויבאה יצחק האהלה שׂרה אמו ויקח את רבקה ותהי לו לאשׁה ויאהבה וינחם יצחק אחרי אמו
SP: ותלד לו את זמרון ואת יקשן ואת מדן ואת מדין ואת ישבק ואת שוח
MT: ותלד לו את זמרן ואת יקשׁן ואת מדן ואת מדין ואת ישׁבק ואת שׁוח
SP: ויקשן ילד את שבא ואת דדן ובני דדן היו אשורים ולטשים ולאמים
MT: ויקשׁן ילד את שׁבא ואת דדן ובני דדן היו אשׁורם ולטושׁים ולאמים
SP: ובני מדין עיפה ואפר חנוך ואבידע ואלדעה כל אלה בני קטורה
MT: ובני מדין עיפה ועפר וחנך ואבידע ואלדעה כל אלה בני קטורה
SP: ויתן אברהם את כל אשר לו ליצחק בנו
MT: ויתן אברהם את כל אשׁר לו ליצחק
SP: ולבני הפילגשים אשר לאברהם נתן אברהם מתנות וישלחם מעל יצחק בנו בעודנו חי קדמה אל ארץ קדמה
MT: ולבני הפילגשׁים אשׁר לאברהם נתן אברהם מתנת וישׁלחם מעל יצחק בנו בעודנו חי קדמה אל ארץ קדם
SP: ואלה ימי שני חיי אברהם אשר חי מאת שנה ושבעים שנה וחמש שנים
MT: ואלה ימי שׁני חיי אברהם אשׁר חי מאת שׁנה ושׁבעים שׁנה וחמשׁ שׁנים
SP: ויגוע וימת אברהם בשיבה טובה זקן ושבע ימים ויאסף אל עמו
MT: ויגוע וימת אברהם בשׂיבה טובה זקן ושׂבע ויאסף אל עמיו
SP: ויקברו אתו יצחק וישמעאל בניו אל מערת המכפלה אל שדה עפרון בן צהר החתי אשר על פני ממרא
MT: ויקברו אתו יצחק וישׁמעאל בניו אל מערת המכפלה אל שׂדה עפרן בן צחר החתי אשׁר על פני ממרא
SP: השדה אשר קנה אברהם מאת בני חת שם קבור אברהם ושרה אשתו
MT: השׂדה אשׁר קנה אברהם מאת בני חת שׁמה קבר אברהם ושׂרה אשׁתו
SP: ואלה תולדת ישמעאל בן אברהם אשר ילדה הגר המצרית שפחת שרה לאברהם
MT: ואלה תלדת ישׁמעאל בן אברהם אשׁר ילדה הגר המצרית שׁפחת שׂרה לאברהם
SP: ואלה שמות בני ישמעאל בשמותם לתולדתם בכור ישמעאל נבאות וקדד ואדבל ומבשם
MT: ואלה שׁמות בני ישׁמעאל בשׁמתם לתולדתם בכר ישׁמעאל נבית וקדר ואדבאל ומבשׂם
SP: הדד ותימה יטור נפיש וקדמה
MT: חדד ותימא יטור נפישׁ וקדמה
SP: אלה הם בני ישמעאל ואלה שמותם בחצרותם ובטירתם שנים עשר נשיאים לאמתם
MT: אלה הם בני ישׁמעאל ואלה שׁמתם בחצריהם ובטירתם שׁנים עשׂר נשׂיאם לאמתם
SP: ואלה שני חיי ישמעאל מאת שנה ושלשים שנה ושבע שנים ויגוע וימת ויאסף אל עמו
MT: ואלה שׁני חיי ישׁמעאל מאת שׁנה ושׁלשׁים שׁנה ושׁבע שׁנים ויגוע וימת ויאסף אל עמיו
The Levenshtein distance measures the minimum number of single-character edits (insertions, deletions, or substitutions) needed to transform one text into another, providing a quantitative way to compare textual differences. For comparing the Masoretic Text and Samaritan Pentateuch, it highlights variations in spelling, word order, or minor textual changes.
In the context of the Levenshtein distance (in the script below threshold
), a higher number indicates greater dissimilarity between two texts, meaning more edits (insertions, deletions, or substitutions) are needed to transform one text into the other.
from Levenshtein import distance
from IPython.display import HTML, display
threshold = 10
# Create an HTML string to store the output
reportTitle=f'Levenshtein distance >{threshold} between MT and SP for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})'
htmlContent = f'<h2>{reportTitle}</h2>'
# Generate the HTML content
for label, MTverseText in MTverses.items():
SPverseText = SPverses.get(label, '')
levDistance = distance(MTverseText, SPverseText) # Calculate the distance
if levDistance > threshold:
formattedDiff = formatAndHighlight(label, MTverseText, SPverseText)
formattedDiff += f'<p>Levenshtein Distance: {levDistance}</p>' # Add the distance
htmlContent += formattedDiff # Append to the HTML content
# Display the HTML content in the notebook
display(HTML(htmlContent))
# Define the HTML filename and store
fileName = f"levenshtein_differences_MT_SP({parashaNameEnglish.replace(' ','_')}).html"
htmlContentFull = wrapHTML(htmlContent,reportTitle)
with open(fileName, "w", encoding="utf-8") as file:
file.write(htmlContentFull)
# display download button
downloadButton = f"""
<a download="{fileName}" href="data:text/html;charset=utf-8,{htmlContentFull.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')}" target="_blank">
<button>Download as HTML</button>
</a>
"""
display(HTML(downloadButton))
SP: ותמת שרה בקרית הארבע אל עמק היא חברון בארץ כנען ויבא אברהם לספד לשרה ולבכותה
MT: ותמת שׂרה בקרית ארבע הוא חברון בארץ כנען ויבא אברהם לספד לשׂרה ולבכתה
Levenshtein Distance: 12
SP: וידבר אתם לאמר אם ישת נפשכם לקבר את מיתי מלפני שמעוני ופגעו לי בעפרון בן צהר החתי
MT: וידבר אתם לאמר אם ישׁ את נפשׁכם לקבר את מתי מלפני שׁמעוני ופגעו לי בעפרון בן צחר
Levenshtein Distance: 15
SP: והיה הנערה אשר אמר אליה הטני כדך ואשתה ואמרה שתה וגם גמליך אשקה אתה הוכחת לעבדך ליצחק ובה אדע כי עשית חסד עם אדני אברהם
MT: והיה הנער אשׁר אמר אליה הטי נא כדך ואשׁתה ואמרה שׁתה וגם גמליך אשׁקה אתה הכחת לעבדך ליצחק ובה אדע כי עשׂית חסד עם אדני
Levenshtein Distance: 14
SP: ויהי הוא טרם כלה לדבר אל לבו והנה רבקה יצאת אשר ילדה לבתואל בן מלכה אשת נחור אחי אברהם וכדה על שכמה
MT: ויהי הוא טרם כלה לדבר והנה רבקה יצאת אשׁר ילדה לבתואל בן מלכה אשׁת נחור אחי אברהם וכדה על שׁכמה
Levenshtein Distance: 12
SP: ויהי כאשר כלו הגמלים לשתות ויקח האיש נזם זהב בקע משקלו וישם על אפה ושני צמידים על ידיה עשרה זהב משקלם
MT: ויהי כאשׁר כלו הגמלים לשׁתות ויקח האישׁ נזם זהב בקע משׁקלו ושׁני צמידים על ידיה עשׂרה זהב משׁקלם
Levenshtein Distance: 16
SP: ויהי כראותו את הנזם ואת הצמידים על ידי אחותו וכשמעו את דברי רבקה אחותו לאמר כה דבר אלי האיש ויבא אל האיש והנה עמד על הגמלים על העין
MT: ויהי׀ כראת את הנזם ואת הצמדים על ידי אחתו וכשׁמעו את דברי רבקה אחתו לאמר כה דבר אלי האישׁ ויבא אל האישׁ והנה עמד על הגמלים על העין
Levenshtein Distance: 17
SP: אני טרם אכלה לדבר אל לבי והנה רבקה יצאת וכדה על שכמה ותרד העין ותשאב ואמר אליה השקיני נא מעט מים מכדך
MT: אני טרם אכלה לדבר אל לבי והנה רבקה יצאת וכדה על שׁכמה ותרד העינה ותשׁאב ואמר אליה השׁקיני נא
Levenshtein Distance: 17
SP: ואשאל אתה ואמר בת מי אתי ותאמר בת בתואל בן נחור אשר ילדה לו מלכה ואשים הנזם על אפה והצמידים על ידיה
MT: ואשׁאל אתה ואמר בת מי את ותאמר בת בתואל בן נחור אשׁר ילדה לו מלכה ואשׂם הנזם על אפה והצמידים על ידיה
Levenshtein Distance: 11
SP: ועתה אם ישכם עשים חסד ואמת את אדני הגידו לי ואם לא הגידו לי ואפנה על הימין או על השמאל
MT: ועתה אם ישׁכם עשׂים חסד ואמת את אדני הגידו לי ואם לא הגידו לי ואפנה על ימין או על שׂמאל
Levenshtein Distance: 11
This section focuses on comparing the spelling of proper nouns between the Samaritan Pentateuch (SP) and the Masoretic Text (MT). Proper nouns, including names of people, places, and unique terms, often exhibit variations in spelling
import collections
def collectProperNounSpellings(F, L, T, inputList):
"""
Collect proper noun spellings and their associated word node numbers.
Ensures only one tuple is stored for each lexeme-to-spelling mapping.
"""
properNounsSpellings = {}
for bookChapterVerse in inputList:
verseNode = T.nodeFromSection(bookChapterVerse)
wordNodes = L.d(verseNode, 'word')
for wordNode in wordNodes:
if F.sp.v(wordNode) == 'nmpr': # Check if the word is a proper noun
lex = F.lex.v(wordNode) # Lexical form
spelling = F.g_cons.v(wordNode) # Spelling
# Store only the first occurrence for each lex-to-cons mapping
if lex not in properNounsSpellings or spelling not in {item[0] for item in properNounsSpellings[lex]}:
properNounsSpellings.setdefault(lex, []).append((spelling, wordNode))
return properNounsSpellings
SPspellingDict = collectProperNounSpellings(Fsp, Lsp, Tsp, bookChapterVerseList)
MTspellingDict = collectProperNounSpellings(Fmt, Lmt, Tmt, bookChapterVerseList)
from IPython.display import HTML, display
# Initialize HTML content
reportTitle=f'Spelling differences in proper nouns between SP and MT for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})'
htmlContent = f'<h2>{reportTitle}</h2>'
# Generate the HTML output
for lex, MTspellings in MTspellingDict.items():
# Retrieve SP spellings, defaulting to an empty set if lex is not found
SPspellings = SPspellingDict.get(lex, set())
# Extract only the spellings (ignoring node numbers) for comparison
MTspellingSet = {spelling for spelling, _ in MTspellings}
SPspellingSet = {spelling for spelling, _ in SPspellings}
# Compare the sets of spellings
if MTspellingSet != SPspellingSet:
# Print MT spelling with reference
MTnode = list(MTspellings)[0][1] # Get first tuple's node number
book, chapter, verse = Tmt.sectionFromNode(MTnode)
MTgloss = Fmt.gloss.v(MTnode)
MTspelling = Fmt.g_cons_utf8.v(MTnode)
# Build HTML output
output = (
f'<h4>Word: <b>{MTgloss}</b> '
f'<a href="https://www.stepbible.org/?q=version=NASB2020&reference={book}.{chapter}:{verse}&options=HNVUG" target="_blank">'
f'{book} {chapter}:{verse}</a></h4>'
f'<ul><li><b>MT Spelling:</b> {MTspelling}</li>'
)
# Print SP spellings with reference
if SPspellings:
SPnode = list(SPspellings)[0][1] # Get first tuple's node number
SPspelling = Fsp.g_cons_utf8.v(SPnode)
output += f'<li><b>SP Spelling:</b> {SPspelling}</li></ul>'
else:
output += '<li><b>SP Spelling:</b> None</li></ul>'
# Append the output to the HTML content
htmlContent += output
# Save the HTML content to a file
fileName = f"spelling_differences_SP_MT({parashaNameEnglish.replace(' ','_')}).html"
with open(fileName, "w", encoding="utf-8") as file:
file.write(htmlContent)
# Display the HTML content in the notebook
display(HTML(htmlContent))
# wrap html header and footer and display a download button
htmlContentFull = wrapHTML(htmlContent,reportTitle)
downloadButton = f"""
<a download="{fileName}" href="data:text/html;charset=utf-8,{htmlContentFull.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')}" target="_blank">
<button>Download as HTML</button>
</a>
"""
display(HTML(downloadButton))
1 Christian Canu Højgaard, Martijn Naaijer, & Stefan Schorch. (2023). Text-Fabric Dataset of the Samaritan Pentateuch. Zenodo. https://doi.org/10.5281/zenodo.7734632
The scripts in this notebook require (beside text-fabric
) the following Python libraries to be installed in the environment:
collections
difflib
IPython
Levenshtein
You can install any missing library from within Jupyter Notebook using eitherpip
or pip3
.