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=6
'''
parashaResults = MT.search(parashaQuery)
0.01s 106 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}'
htmlStart='<html><body>'
htmlFooter=f'<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>`'
# 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
htmlContent = f'<h2>Differences between MT and SP for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})</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
# Save the content to an HTML file
fileName = f"differences_MT_SP({parashaNameEnglish.replace(' ','%20')}).html"
with open(fileName, "w", encoding="utf-8") as file:
file.write(htmlContent)
# Display the content in the notebook
display(HTML(htmlContent))
# wrap html header and footer and display a download button
htmlContentFull = f'{htmlStart}{htmlContent}{htmlFooter}'
downloadButton = f"""
<a download="{fileName}" href="data:text/html;charset=utf-8,{htmlContentFull.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')}" target="_blank">
<button>Download Differences 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: וילך עשׂו אל ישׁמעאל ויקח את מחלת׀ בת ישׁמעאל בן אברהם אחות נביות על נשׁיו לו לאשׁה
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 = 20
# Create an HTML string to store the output
htmlContent = f'<h2>Levenshtein distance >{threshold} between MT and SP for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})</h2>'
# Create header
MT.dm(f'### Levenshtein distance >{threshold} between MT and SP for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})')
# 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
MT.dm(formattedDiff)
htmlContent += formattedDiff # Append to the HTML content
# Save the content to an HTML file
fileName = f"levenshtein_differences_MT_SP({parashaNameEnglish.replace(' ','%20')}).html"
with open(fileName, "w", encoding="utf-8") as file:
file.write(htmlContent)
# wrap html header and footer and display a download button
htmlContentFull = f'{htmlStart}{htmlContent}{htmlFooter}'
downloadButton = f"""
<a download="{fileName}" href="data:text/html;charset=utf-8,{htmlContentFull.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')}" target="_blank">
<button>Download Differences as HTML</button>
</a>
"""
display(HTML(downloadButton))
SP: וילך עשו ויקח את מחלת בת ישמעאל בן אברהם אחות נבאות על נשיו לו לאשה
MT: וילך עשׂו אל ישׁמעאל ויקח את מחלת׀ בת ישׁמעאל בן אברהם אחות נביות על נשׁיו לו לאשׁה
Levenshtein Distance: 21
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
htmlContent = f'<h2>Spelling differences in proper nouns between SP and MT for parasha {parashaNameEnglish} ({parashaStart}-{parashaEnd})</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(' ','%20')}).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 = f'{htmlStart}{htmlContent}{htmlFooter}'
downloadButton = f"""
<a download="{fileName}" href="data:text/html;charset=utf-8,{htmlContentFull.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')}" target="_blank">
<button>Download Differences 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
Levenshtein
You can install any missing library from within Jupyter Notebook using eitherpip
or pip3
.