{ "cells": [ { "cell_type": "markdown", "id": "b412ef40-3d6a-422d-a658-0f7f9474e423", "metadata": {}, "source": [ "# Petucha and setuma in the Torah (BHSA)" ] }, { "cell_type": "markdown", "id": "8da22526-375c-406c-a63c-bc425007d7e3", "metadata": {}, "source": [ "## Table of content (TOC)\n", "\n", "* 1 - Introduction\n", "* 2 - Load Text-Fabric app and data\n", "* 3 - Performing the queries\n", " * 3.1 - Locate the parashot petuchot and setumot\n", " * 3.2 - Run some basic stats\n", " * 3.3 - Petucha length distribution over the books\n", " * 3.4 - Plotting Petucha length per books\n", " * 3.5 - Setuma length distribution over the books\n", " * 3.6 - Plotting setuma length per book\n", "* 4 - Attribution and footnotes\n", "* 5 - Required libraries\n", "* 6 - Notebook details" ] }, { "cell_type": "markdown", "id": "06785b1d-4bde-40bd-813d-9381f48e8aa4", "metadata": {}, "source": [ "# 1 - Introduction \n", "##### [Back to TOC](#TOC)" ] }, { "cell_type": "markdown", "id": "69c871f8-82b9-47b3-b3cd-95c9a3b7ed12", "metadata": {}, "source": [ "The surface text of the Torah is devided into *pisqot* (units that can be compared to paragrahps). This devision consist of two types of sections which are marked by th Hebrew letters פ (pe) and ס (samekh):\n", "\n", "- *Petucha* (Open Section): Marked by the letter **פ**, it usually starts a new paragraph or major section, often separated by a line break or significant spacing.\n", "- *Setuma* (Closed Section): Marked by the letter **ס**, it indicates a smaller division within the text, often separated by a smaller space.\n", "\n", "These markings help structure the text and convey interpretative cues within the Torah. In this notebook we will perform some statistic analysis on these surface text features.\n", "\n", "Detailed information regarding petuchot and setumot can be found in “The Text of the Tanak” by Russel Fuller.1\n" ] }, { "cell_type": "markdown", "id": "525e2cf9-08e0-4d20-a5f1-b7b7a15662fa", "metadata": {}, "source": [ "# 2 - Load Text-Fabric app and data \n", "##### [Back to TOC](#TOC)" ] }, { "cell_type": "markdown", "id": "1e3b8848-0ece-4ee1-98b7-bb47d34cb45a", "metadata": {}, "source": [ "This NoteBook uses the ETCBC BHSA as dataset representing the Hebrew text of the TeNaCh." ] }, { "cell_type": "code", "execution_count": 1, "id": "ef428d41-2caa-4522-95cf-ef39e4f0e8da", "metadata": { "tags": [] }, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "id": "77b1cb10-629c-4653-b4d0-afc1d13e9d7e", "metadata": {}, "outputs": [], "source": [ "# Loading the Text-Fabric code\n", "# Note: it is assumed Text-Fabric is installed in your environment.\n", "from tf.fabric import Fabric\n", "from tf.app import use" ] }, { "cell_type": "code", "execution_count": 3, "id": "e256d50f-a0d1-4c4c-819d-33bab7fb75c7", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/markdown": [ "**Locating corpus resources ...**" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "app: ~/text-fabric-data/github/etcbc/BHSA/app" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/text-fabric-data/github/etcbc/BHSA/tf/2021" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/text-fabric-data/github/etcbc/phono/tf/2021" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/text-fabric-data/github/etcbc/parallels/tf/2021" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " TF: TF API 12.6.1, etcbc/BHSA/app v3, Search Reference
\n", " Data: etcbc - BHSA 2021, Character table, Feature docs
\n", "
Node types\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "
Name# of nodes# slots / node% coverage
book3910938.21100
chapter929459.19100
lex923046.22100
verse2321318.38100
half_verse451799.44100
sentence637176.70100
sentence_atom645146.61100
clause881314.84100
clause_atom907044.70100
phrase2532031.68100
phrase_atom2675321.59100
subphrase1138501.4238
word4265901.00100
\n", " Sets: no custom sets
\n", " Features:
\n", "
Parallel Passages\n", "
\n", "\n", "
\n", "
\n", "crossref\n", "
\n", "
int
\n", "\n", " 🆗 links between similar passages\n", "\n", "
\n", "\n", "
\n", "
\n", "\n", "
BHSA = Biblia Hebraica Stuttgartensia Amstelodamensis\n", "
\n", "\n", "
\n", "
\n", "book\n", "
\n", "
str
\n", "\n", " ✅ book name in Latin (Genesis; Numeri; Reges1; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "book@ll\n", "
\n", "
str
\n", "\n", " ✅ book name in amharic (ኣማርኛ)\n", "\n", "
\n", "\n", "
\n", "
\n", "chapter\n", "
\n", "
int
\n", "\n", " ✅ chapter number (1; 2; 3; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "code\n", "
\n", "
int
\n", "\n", " ✅ identifier of a clause atom relationship (0; 74; 367; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "det\n", "
\n", "
str
\n", "\n", " ✅ determinedness of phrase(atom) (det; und; NA.)\n", "\n", "
\n", "\n", "
\n", "
\n", "domain\n", "
\n", "
str
\n", "\n", " ✅ text type of clause (? (Unknown); N (narrative); D (discursive); Q (Quotation).)\n", "\n", "
\n", "\n", "
\n", "
\n", "freq_lex\n", "
\n", "
int
\n", "\n", " ✅ frequency of lexemes\n", "\n", "
\n", "\n", "
\n", "
\n", "function\n", "
\n", "
str
\n", "\n", " ✅ syntactic function of phrase (Cmpl; Objc; Pred; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "g_cons\n", "
\n", "
str
\n", "\n", " ✅ word consonantal-transliterated (B R>CJT BR> >LHJM ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "g_cons_utf8\n", "
\n", "
str
\n", "\n", " ✅ word consonantal-Hebrew (ב ראשׁית ברא אלהים)\n", "\n", "
\n", "\n", "
\n", "
\n", "g_lex\n", "
\n", "
str
\n", "\n", " ✅ lexeme pointed-transliterated (B.:- R;>CIJT B.@R@> >:ELOH ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "g_lex_utf8\n", "
\n", "
str
\n", "\n", " ✅ lexeme pointed-Hebrew (בְּ רֵאשִׁית בָּרָא אֱלֹה)\n", "\n", "
\n", "\n", "
\n", "
\n", "g_word\n", "
\n", "
str
\n", "\n", " ✅ word pointed-transliterated (B.:- R;>CI73JT B.@R@74> >:ELOHI92JM)\n", "\n", "
\n", "\n", "
\n", "
\n", "g_word_utf8\n", "
\n", "
str
\n", "\n", " ✅ word pointed-Hebrew (בְּ רֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים)\n", "\n", "
\n", "\n", "
\n", "
\n", "gloss\n", "
\n", "
str
\n", "\n", " 🆗 english translation of lexeme (beginning create god(s))\n", "\n", "
\n", "\n", "
\n", "
\n", "gn\n", "
\n", "
str
\n", "\n", " ✅ grammatical gender (m; f; NA; unknown.)\n", "\n", "
\n", "\n", "
\n", "
\n", "label\n", "
\n", "
str
\n", "\n", " ✅ (half-)verse label (half verses: A; B; C; verses: GEN 01,02)\n", "\n", "
\n", "\n", "
\n", "
\n", "language\n", "
\n", "
str
\n", "\n", " ✅ of word or lexeme (Hebrew; Aramaic.)\n", "\n", "
\n", "\n", "
\n", "
\n", "lex\n", "
\n", "
str
\n", "\n", " ✅ lexeme consonantal-transliterated (B R>CJT/ BR>[ >LHJM/)\n", "\n", "
\n", "\n", "
\n", "
\n", "lex_utf8\n", "
\n", "
str
\n", "\n", " ✅ lexeme consonantal-Hebrew (ב ראשׁית֜ ברא אלהים֜)\n", "\n", "
\n", "\n", "
\n", "
\n", "ls\n", "
\n", "
str
\n", "\n", " ✅ lexical set, subclassification of part-of-speech (card; ques; mult)\n", "\n", "
\n", "\n", "
\n", "
\n", "nametype\n", "
\n", "
str
\n", "\n", " ⚠️ named entity type (pers; mens; gens; topo; ppde.)\n", "\n", "
\n", "\n", "
\n", "
\n", "nme\n", "
\n", "
str
\n", "\n", " ✅ nominal ending consonantal-transliterated (absent; n/a; JM, ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "nu\n", "
\n", "
str
\n", "\n", " ✅ grammatical number (sg; du; pl; NA; unknown.)\n", "\n", "
\n", "\n", "
\n", "
\n", "number\n", "
\n", "
int
\n", "\n", " ✅ sequence number of an object within its context\n", "\n", "
\n", "\n", "
\n", "
\n", "otype\n", "
\n", "
str
\n", "\n", " \n", "\n", "
\n", "\n", "
\n", "
\n", "pargr\n", "
\n", "
str
\n", "\n", " 🆗 hierarchical paragraph number (1; 1.2; 1.2.3.4; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "pdp\n", "
\n", "
str
\n", "\n", " ✅ phrase dependent part-of-speech (art; verb; subs; nmpr, ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "pfm\n", "
\n", "
str
\n", "\n", " ✅ preformative consonantal-transliterated (absent; n/a; J, ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "prs\n", "
\n", "
str
\n", "\n", " ✅ pronominal suffix consonantal-transliterated (absent; n/a; W; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "prs_gn\n", "
\n", "
str
\n", "\n", " ✅ pronominal suffix gender (m; f; NA; unknown.)\n", "\n", "
\n", "\n", "
\n", "
\n", "prs_nu\n", "
\n", "
str
\n", "\n", " ✅ pronominal suffix number (sg; du; pl; NA; unknown.)\n", "\n", "
\n", "\n", "
\n", "
\n", "prs_ps\n", "
\n", "
str
\n", "\n", " ✅ pronominal suffix person (p1; p2; p3; NA; unknown.)\n", "\n", "
\n", "\n", "
\n", "
\n", "ps\n", "
\n", "
str
\n", "\n", " ✅ grammatical person (p1; p2; p3; NA; unknown.)\n", "\n", "
\n", "\n", "
\n", "
\n", "qere\n", "
\n", "
str
\n", "\n", " ✅ word pointed-transliterated masoretic reading correction\n", "\n", "
\n", "\n", "
\n", "
\n", "qere_trailer\n", "
\n", "
str
\n", "\n", " ✅ interword material -pointed-transliterated (Masoretic correction)\n", "\n", "
\n", "\n", "
\n", "
\n", "qere_trailer_utf8\n", "
\n", "
str
\n", "\n", " ✅ interword material -pointed-transliterated (Masoretic correction)\n", "\n", "
\n", "\n", "
\n", "
\n", "qere_utf8\n", "
\n", "
str
\n", "\n", " ✅ word pointed-Hebrew masoretic reading correction\n", "\n", "
\n", "\n", "
\n", "
\n", "rank_lex\n", "
\n", "
int
\n", "\n", " ✅ ranking of lexemes based on freqnuecy\n", "\n", "
\n", "\n", "
\n", "
\n", "rela\n", "
\n", "
str
\n", "\n", " ✅ linguistic relation between clause/(sub)phrase(atom) (ADJ; MOD; ATR; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "sp\n", "
\n", "
str
\n", "\n", " ✅ part-of-speech (art; verb; subs; nmpr, ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "st\n", "
\n", "
str
\n", "\n", " ✅ state of a noun (a (absolute); c (construct); e (emphatic).)\n", "\n", "
\n", "\n", "
\n", "
\n", "tab\n", "
\n", "
int
\n", "\n", " ✅ clause atom: its level in the linguistic embedding\n", "\n", "
\n", "\n", "
\n", "
\n", "trailer\n", "
\n", "
str
\n", "\n", " ✅ interword material pointed-transliterated (& 00 05 00_P ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "trailer_utf8\n", "
\n", "
str
\n", "\n", " ✅ interword material pointed-Hebrew (־ ׃)\n", "\n", "
\n", "\n", "
\n", "
\n", "txt\n", "
\n", "
str
\n", "\n", " ✅ text type of clause and surrounding (repetion of ? N D Q as in feature domain)\n", "\n", "
\n", "\n", "
\n", "
\n", "typ\n", "
\n", "
str
\n", "\n", " ✅ clause/phrase(atom) type (VP; NP; Ellp; Ptcp; WayX)\n", "\n", "
\n", "\n", "
\n", "
\n", "uvf\n", "
\n", "
str
\n", "\n", " ✅ univalent final consonant consonantal-transliterated (absent; N; J; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "vbe\n", "
\n", "
str
\n", "\n", " ✅ verbal ending consonantal-transliterated (n/a; W; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "vbs\n", "
\n", "
str
\n", "\n", " ✅ root formation consonantal-transliterated (absent; n/a; H; ...)\n", "\n", "
\n", "\n", "
\n", "
\n", "verse\n", "
\n", "
int
\n", "\n", " ✅ verse number\n", "\n", "
\n", "\n", "
\n", "
\n", "voc_lex\n", "
\n", "
str
\n", "\n", " ✅ vocalized lexeme pointed-transliterated (B.: R;>CIJT BR> >:ELOHIJM)\n", "\n", "
\n", "\n", "
\n", "
\n", "voc_lex_utf8\n", "
\n", "
str
\n", "\n", " ✅ vocalized lexeme pointed-Hebrew (בְּ רֵאשִׁית ברא אֱלֹהִים)\n", "\n", "
\n", "\n", "
\n", "
\n", "vs\n", "
\n", "
str
\n", "\n", " ✅ verbal stem (qal; piel; hif; apel; pael)\n", "\n", "
\n", "\n", "
\n", "
\n", "vt\n", "
\n", "
str
\n", "\n", " ✅ verbal tense (perf; impv; wayq; infc)\n", "\n", "
\n", "\n", "
\n", "
\n", "mother\n", "
\n", "
none
\n", "\n", " ✅ linguistic dependency between textual objects\n", "\n", "
\n", "\n", "
\n", "
\n", "oslots\n", "
\n", "
none
\n", "\n", " \n", "\n", "
\n", "\n", "
\n", "
\n", "\n", "
Phonetic Transcriptions\n", "
\n", "\n", "
\n", "
\n", "phono\n", "
\n", "
str
\n", "\n", " 🆗 phonological transcription (bᵊ rēšˌîṯ bārˈā ʔᵉlōhˈîm)\n", "\n", "
\n", "\n", "
\n", "
\n", "phono_trailer\n", "
\n", "
str
\n", "\n", " 🆗 interword material in phonological transcription\n", "\n", "
\n", "\n", "
\n", "
\n", "\n", " Settings:
specified
  1. apiVersion: 3
  2. appName: etcbc/BHSA
  3. appPath: C:/Users/tonyj/text-fabric-data/github/etcbc/BHSA/app
  4. commit: gd905e3fb6e80d0fa537600337614adc2af157309
  5. css: ''
  6. dataDisplay:
    • exampleSectionHtml:<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>)
    • excludedFeatures:
      • 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
    • noneValues:
      • none
      • unknown
      • no value
      • NA
  7. docs:
    • docBase: {docRoot}/{repo}
    • docExt: ''
    • docPage: ''
    • docRoot: https://{org}.github.io
    • featurePage: 0_home
  8. interfaceDefaults: {}
  9. isCompatible: True
  10. local: local
  11. localDir: C:/Users/tonyj/text-fabric-data/github/etcbc/BHSA/_temp
  12. provenanceSpec:
    • corpus: BHSA = Biblia Hebraica Stuttgartensia Amstelodamensis
    • doi: 10.5281/zenodo.1007624
    • moduleSpecs:
      • :
        • backend: no value
        • corpus: Phonetic Transcriptions
        • docUrl:https://nbviewer.jupyter.org/github/etcbc/phono/blob/master/programs/phono.ipynb
        • doi: 10.5281/zenodo.1007636
        • org: etcbc
        • relative: /tf
        • repo: phono
      • :
        • backend: no value
        • corpus: Parallel Passages
        • docUrl:https://nbviewer.jupyter.org/github/etcbc/parallels/blob/master/programs/parallels.ipynb
        • doi: 10.5281/zenodo.1007642
        • org: etcbc
        • relative: /tf
        • repo: parallels
    • org: etcbc
    • relative: /tf
    • repo: BHSA
    • version: 2021
    • webBase: https://shebanq.ancient-data.org/hebrew
    • webHint: Show this on SHEBANQ
    • webLang: la
    • webLexId: True
    • webUrl:{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
    • webUrlLex: {webBase}/word?version={version}&id=<lid>
  13. release: v1.8
  14. typeDisplay:
    • clause:
      • label: {typ} {rela}
      • style: ''
    • clause_atom:
      • hidden: True
      • label: {code}
      • level: 1
      • style: ''
    • half_verse:
      • hidden: True
      • label: {label}
      • style: ''
      • verselike: True
    • lex:
      • featuresBare: gloss
      • label: {voc_lex_utf8}
      • lexOcc: word
      • style: orig
      • template: {voc_lex_utf8}
    • phrase:
      • label: {typ} {function}
      • style: ''
    • phrase_atom:
      • hidden: True
      • label: {typ} {rela}
      • level: 1
      • style: ''
    • sentence:
      • label: {number}
      • style: ''
    • sentence_atom:
      • hidden: True
      • label: {number}
      • level: 1
      • style: ''
    • subphrase:
      • hidden: True
      • label: {number}
      • style: ''
    • word:
      • features: pdp vs vt
      • featuresBare: lex:gloss
  15. writing: hbo
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
TF API: names N F E L T S C TF Fs Fall Es Eall Cs Call directly usable

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# load the BHSL app and data\n", "BHS = use (\"etcbc/BHSA\",hoist=globals())" ] }, { "cell_type": "markdown", "id": "d32502e9-c6ae-45d6-ac6f-e298b4315bde", "metadata": {}, "source": [ "Note: The Text-Fabric feature documentation can be found at [ETCBC GitHub](https://github.com/ETCBC/bhsa/blob/master/docs/features/0_home.md) " ] }, { "cell_type": "code", "execution_count": 4, "id": "20826b6e-5511-448d-a0da-8abdbd67eb77", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# The following will push the Text-Fabric stylesheet to this notebook (to facilitate proper display with notebook viewer)\n", "BHS.dh(BHS.getCss())" ] }, { "cell_type": "markdown", "id": "947d7fd8-20c9-4b82-8b37-45ca74d18ef4", "metadata": {}, "source": [ "# 3 - Performing the queries \n", "##### [Back to TOC](#TOC)" ] }, { "cell_type": "markdown", "id": "57699b9b-8c44-464f-a264-380ddbcf8c1e", "metadata": {}, "source": [ "## 3.1 - Locate the parashot petuchot and setumot " ] }, { "cell_type": "markdown", "id": "1ac06c2b-91bc-47a9-9ac8-1c574ce9473e", "metadata": {}, "source": [ "Occurrences of פ (pe) and ס (samekh), which function as section breakers in the BHSA Text-Fabric dataset, are available in the [trailer](https://github.com/ETCBC/bhsa/blob/master/docs/features/trailer.md) feature. \n", "\n", "To begin, we shall generate a frequency table for this feature, noting that it pertains to the full TeNaCh. As observed from the output, the Hebrew letters are displayed in their transliterated format, with trailing P and S representing pe and samekh, respectively. " ] }, { "cell_type": "code", "execution_count": 5, "id": "6abf80e8-c76b-47a4-9d2c-9457092042a9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((' ', 236930),\n", " ('', 121801),\n", " ('&', 42275),\n", " ('00 ', 20146),\n", " ('05 ', 2266),\n", " ('00_S ', 1892),\n", " ('00_P ', 1165),\n", " ('_S ', 76),\n", " (' 05 ', 17),\n", " ('_P ', 13),\n", " ('00_N ', 7),\n", " ('00_N_P ', 1),\n", " ('00_N_S ', 1))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F.trailer.freqList()" ] }, { "cell_type": "code", "execution_count": 6, "id": "c9d344a7-9bff-4cd9-aae6-5554b7240807", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.32s 294 results\n" ] } ], "source": [ "# find the parashots petuchot\n", "petuchaQuery = '''\n", "book book=Genesis|Exodus|Leviticus|Numeri|Deuteronomium\n", " word trailer~_P\n", "'''\n", "\n", "petuchaResults = BHS.search(petuchaQuery)" ] }, { "cell_type": "code", "execution_count": 7, "id": "ed28b711-d0aa-4e78-a0b5-c6a01ee4f6dd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.33s 392 results\n" ] } ], "source": [ "# find the parashot setumot\n", "setumaQuery = '''\n", "book book=Genesis|Exodus|Leviticus|Numeri|Deuteronomium\n", " word trailer~_S\n", "'''\n", "\n", "setumaResults = BHS.search(setumaQuery)" ] }, { "cell_type": "markdown", "id": "30adfe82-5d55-446b-9472-c0089c6b5541", "metadata": { "tags": [] }, "source": [ "## 3.2 - Run some basic stats " ] }, { "cell_type": "markdown", "id": "ccfe791a-c2d8-4166-851a-d1943bc8659d", "metadata": {}, "source": [ "These two scripts count the occurrences of petuchot and setumot per book. They generate formatted tables that summarize these counts." ] }, { "cell_type": "code", "execution_count": 8, "id": "02f3e3ef-d32e-4418-aa84-204d26c7b497", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Book Number of Petuchot\n", "-----------------------------------\n", "Genesis 42\n", "Exodus 70\n", "Leviticus 55\n", "Numeri 95\n", "Deuteronomium 32\n" ] } ], "source": [ "# Import necessary libraries\n", "from collections import defaultdict\n", "\n", "# Initialize a dictionary to store counts per book\n", "petuchaCounts = defaultdict(int)\n", "\n", "# Iterate over the results and count petuchot per book\n", "for book, petucha in petuchaResults:\n", " petuchaCounts[book] += 1\n", "\n", "# Sort the books alphabetically\n", "sortedBooks = sorted(petuchaCounts.keys())\n", "\n", "# Display the results in a formatted table\n", "print(f\"{'Book':<20}{'Number of Petuchot'}\")\n", "print('-' * 35)\n", "for book in sortedBooks:\n", " print(f\"{F.book.v(book):<20}{petuchaCounts[book]}\")\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "cc8d7f5b-74bd-476c-8cca-3643261bf71f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Book Number of Setumot\n", "-----------------------------------\n", "Genesis 50\n", "Exodus 94\n", "Leviticus 49\n", "Numeri 64\n", "Deuteronomium 135\n" ] } ], "source": [ "# Import necessary libraries\n", "from collections import defaultdict\n", "\n", "# Initialize a dictionary to store counts per book\n", "setumaCounts = defaultdict(int)\n", "\n", "# Iterate over the results and count setuma per book\n", "for book, setuma in setumaResults:\n", " setumaCounts[book] += 1\n", "\n", "# Sort the books alphabetically\n", "sortedBooks = sorted(setumaCounts.keys())\n", "\n", "# Display the results in a formatted table\n", "print(f\"{'Book':<20}{'Number of Setumot'}\")\n", "print('-' * 35)\n", "for book in sortedBooks:\n", " print(f\"{F.book.v(book):<20}{setumaCounts[book]}\")" ] }, { "cell_type": "markdown", "id": "abb63920-0000-4c22-af77-bb3e877962e9", "metadata": {}, "source": [ "## 3.3 - Petucha length distribution over the books" ] }, { "cell_type": "markdown", "id": "332861b4-531d-4daa-95a8-a638253ed19d", "metadata": {}, "source": [ "The following script creates a statistical overview of the petucha length per book.\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "b6b9c5f4-3430-4e8a-9a3e-76eda937a9fe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.46s 112927 results\n", "\n", "Statistical overview of petucha lengths per book:\n", " count mean std min 25% 50% 75% max\n", "Genesis 43 670.63 918.78 49 121.00 281.0 788.50 4775\n", "Exodus 70 342.16 283.41 35 130.25 266.5 454.25 1685\n", "Leviticus 55 309.85 309.83 49 116.00 189.0 377.00 1518\n", "Numeri 95 266.60 363.68 31 81.00 160.0 358.50 2646\n", "Deuteronomium 32 555.31 474.97 42 194.00 434.5 715.00 1703\n", "Total 295 428.91 470.13 31 128.45 266.2 538.65 4775\n" ] } ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", "from tf.app import use\n", "\n", "# Function to get reference string from verse nodes\n", "def getVerseReference(node):\n", " section = T.sectionFromNode(node)\n", " return f\"{section[0]} {section[1]}:{section[2]}\" if section else 'Unknown Reference'\n", "\n", "# Function to process each petucha and append to list\n", "def addPetuchaInfo(petuchaList, index, startWordNode, endWordNode, length, bookName):\n", " startVerseNodes = L.u(startWordNode, otype='verse')\n", " endVerseNodes = L.u(endWordNode, otype='verse')\n", " \n", " startRefStr = getVerseReference(startVerseNodes[0]) if startVerseNodes else 'Unknown Reference'\n", " endRefStr = getVerseReference(endVerseNodes[0]) if endVerseNodes else 'Unknown Reference'\n", " \n", " petuchaList.append({\n", " 'Index': index,\n", " 'StartRef': startRefStr,\n", " 'EndRef': endRefStr,\n", " 'Length': length,\n", " 'Book': bookName\n", " })\n", "\n", "# Initialize variables\n", "petuchaInfo = []\n", "currentPetuchaLength = 0\n", "currentPetuchaStartWord = None\n", "index = 1\n", "\n", "# Find all words in the Torah\n", "wordsInTorahQuery = '''\n", "book book=Genesis|Exodus|Leviticus|Numeri|Deuteronomium\n", " word\n", "'''\n", "wordsInTorah = BHS.search(wordsInTorahQuery)\n", "\n", "# Iterate over all words in the dataset\n", "for bookNode, wordNode in wordsInTorah:\n", " # Get the trailer feature of the word\n", " trailer = F.trailer.v(wordNode) or '' # prevent 'NoneType' errors\n", " \n", " # If starting a new petucha, record the start word\n", " if currentPetuchaStartWord is None:\n", " currentPetuchaStartWord = wordNode\n", " currentBookName = F.book.v(bookNode)\n", " \n", " # Increment the length counter\n", " currentPetuchaLength += 1\n", "\n", " # Check if the word ends with a petucha (represented by 'P' in the trailer)\n", " if 'P' in trailer:\n", " addPetuchaInfo(petuchaInfo, index, currentPetuchaStartWord, wordNode, currentPetuchaLength, currentBookName)\n", " \n", " # Reset the variables for the next petucha\n", " currentPetuchaLength = 0\n", " currentPetuchaStartWord = None\n", " index += 1\n", "\n", "# Handle any remaining words after the last petucha\n", "if currentPetuchaLength > 0 and currentPetuchaStartWord is not None:\n", " addPetuchaInfo(petuchaInfo, index, currentPetuchaStartWord, wordNode, currentPetuchaLength, currentBookName)\n", "\n", "# Convert the petuchaInfo list to a pandas DataFrame for analysis\n", "df = pd.DataFrame(petuchaInfo)\n", "\n", "# Define the desired book order\n", "orderedBooks = ['Genesis', 'Exodus', 'Leviticus', 'Numeri', 'Deuteronomium']\n", "\n", "# Display per-book statistics using a specified formatting\n", "print(\"\\nStatistical overview of petucha lengths per book:\")\n", "bookStats = df.groupby('Book')['Length'].describe().round(2)\n", "bookStats['count'] = bookStats['count'].astype(int)\n", "bookStats['min'] = bookStats['min'].astype(int)\n", "bookStats['max'] = bookStats['max'].astype(int)\n", "\n", "# Calculate total row across all books\n", "totalStats = pd.DataFrame({\n", " 'count': [int(bookStats['count'].sum())],\n", " 'mean': [round(bookStats['mean'].mean(), 2)],\n", " 'std': [round(bookStats['std'].mean(), 2)],\n", " 'min': [int(bookStats['min'].min())],\n", " '25%': [round(bookStats['25%'].mean(), 2)],\n", " '50%': [round(bookStats['50%'].mean(), 2)],\n", " '75%': [round(bookStats['75%'].mean(), 2)],\n", " 'max': [int(bookStats['max'].max())]\n", "}, index=['Total'])\n", "\n", "# Concatenate the total row with the book_stats DataFrame\n", "bookStats = pd.concat([bookStats, totalStats])\n", "\n", "# Reorder bookStats based on the original order of books in petuchaInfo\n", "bookStats = bookStats.reindex(orderedBooks + ['Total'])\n", "\n", "# Configure display options to show all data on a single line for each book\n", "pd.set_option('display.max_columns', None) # Show all columns\n", "pd.set_option('display.width', 1000) # Wide display to avoid line wrapping\n", "print(bookStats)" ] }, { "cell_type": "markdown", "id": "859ec72d-5180-4040-97f8-fdbeae0762bf", "metadata": {}, "source": [ "## 3.4 - Plotting petucha length per book\n", "\n", "The following script creates a scatter plot displaying the length distribution of each petucha sections.\n", "Hovering over the datapoints provids more details like word-count, and the start and end-verse. This script uses the data created by the previous script." ] }, { "cell_type": "code", "execution_count": 11, "id": "8579ba04-6d7e-4992-8ec8-994e34bfa7ef", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "'use strict';\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " function drop(id) {\n", " const view = Bokeh.index.get_by_id(id)\n", " if (view != null) {\n", " view.model.document.clear()\n", " Bokeh.index.delete(view)\n", " }\n", " }\n", "\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", "\n", " // Clean up Bokeh references\n", " if (id != null) {\n", " drop(id)\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim()\n", " drop(id)\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"
    \\n\"+\n", " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded(error = null) {\n", " const el = document.getElementById(\"a371c888-58bb-4086-8ed2-be12b1aada9b\");\n", " if (el != null) {\n", " const html = (() => {\n", " if (typeof root.Bokeh === \"undefined\") {\n", " if (error == null) {\n", " return \"BokehJS is loading ...\";\n", " } else {\n", " return \"BokehJS failed to load.\";\n", " }\n", " } else {\n", " const prefix = `BokehJS ${root.Bokeh.version}`;\n", " if (error == null) {\n", " return `${prefix} successfully loaded.`;\n", " } else {\n", " return `${prefix} encountered errors while loading and may not function as expected.`;\n", " }\n", " }\n", " })();\n", " el.innerHTML = html;\n", "\n", " if (error != null) {\n", " const wrapper = document.createElement(\"div\");\n", " wrapper.style.overflow = \"auto\";\n", " wrapper.style.height = \"5em\";\n", " wrapper.style.resize = \"vertical\";\n", " const content = document.createElement(\"div\");\n", " content.style.fontFamily = \"monospace\";\n", " content.style.whiteSpace = \"pre-wrap\";\n", " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", " content.textContent = error.stack ?? error.toString();\n", " wrapper.append(content);\n", " el.append(wrapper);\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(() => display_loaded(error), 100);\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.6.0.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " try {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "\n", " } catch (error) {display_loaded(error);throw error;\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " const cell = $(document.getElementById(\"a371c888-58bb-4086-8ed2-be12b1aada9b\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"a371c888-58bb-4086-8ed2-be12b1aada9b\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.6.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"a371c888-58bb-4086-8ed2-be12b1aada9b\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"68c3472e-c217-4958-90c0-1fce5f828f2a\":{\"version\":\"3.6.0\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1005\",\"attributes\":{\"width\":1000,\"height\":700,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1006\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1007\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1015\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1016\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1008\",\"attributes\":{\"text\":\"Petucha lengths in the Torah (in words)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1045\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1001\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1002\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1003\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAACYAAAAmQAAAJoAAACbAAAAnAAAAJ0AAACeAAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYAAACnAAAAqAAAAKkAAACqAAAAqwAAAKwAAACtAAAArgAAAK8AAACwAAAAsQAAALIAAACzAAAAtAAAALUAAAC2AAAAtwAAALgAAAC5AAAAugAAALsAAAC8AAAAvQAAAL4AAAC/AAAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAxgAAAMcAAADIAAAAyQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADXAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAN8AAADgAAAA4QAAAOIAAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPcAAAD4AAAA+QAAAPoAAAD7AAAA/AAAAP0AAAD+AAAA/wAAAAABAAABAQAAAgEAAAMBAAAEAQAABQEAAAYBAAAHAQAACAEAAAkBAAAKAQAACwEAAAwBAAANAQAADgEAAA8BAAAQAQAAEQEAABIBAAATAQAAFAEAABUBAAAWAQAAFwEAABgBAAAZAQAAGgEAABsBAAAcAQAAHQEAAB4BAAAfAQAAIAEAACEBAAAiAQAAIwEAACQBAAAlAQAAJgEAAA==\"},\"shape\":[295],\"dtype\":\"int32\",\"order\":\"little\"}],[\"Index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0AAACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAAALkAAAC6AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAAxAAAAMUAAADGAAAAxwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADPAAAA0AAAANEAAADSAAAA0wAAANQAAADVAAAA1gAAANcAAADYAAAA2QAAANoAAADbAAAA3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAAOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAAAPIAAADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAAD/AAAAAAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcBAAAIAQAACQEAAAoBAAALAQAADAEAAA0BAAAOAQAADwEAABABAAARAQAAEgEAABMBAAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwBAAAdAQAAHgEAAB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAAA==\"},\"shape\":[295],\"dtype\":\"int32\",\"order\":\"little\"}],[\"StartRef\",{\"type\":\"ndarray\",\"array\":[\"Genesis 1:1\",\"Genesis 1:6\",\"Genesis 1:9\",\"Genesis 1:14\",\"Genesis 1:20\",\"Genesis 1:24\",\"Genesis 2:1\",\"Genesis 2:4\",\"Genesis 3:22\",\"Genesis 5:1\",\"Genesis 5:21\",\"Genesis 5:25\",\"Genesis 5:28\",\"Genesis 6:5\",\"Genesis 6:9\",\"Genesis 9:18\",\"Genesis 10:1\",\"Genesis 11:1\",\"Genesis 11:10\",\"Genesis 12:10\",\"Genesis 14:1\",\"Genesis 18:1\",\"Genesis 21:22\",\"Genesis 22:1\",\"Genesis 22:20\",\"Genesis 25:1\",\"Genesis 25:19\",\"Genesis 32:4\",\"Genesis 35:1\",\"Genesis 35:9\",\"Genesis 35:22\",\"Genesis 36:1\",\"Genesis 36:31\",\"Genesis 37:1\",\"Genesis 38:1\",\"Genesis 41:1\",\"Genesis 44:18\",\"Genesis 46:28\",\"Genesis 48:1\",\"Genesis 49:1\",\"Genesis 49:5\",\"Genesis 49:13\",\"Genesis 49:27\",\"Exodus 1:8\",\"Exodus 2:23\",\"Exodus 4:18\",\"Exodus 4:27\",\"Exodus 6:10\",\"Exodus 6:13\",\"Exodus 6:29\",\"Exodus 7:1\",\"Exodus 7:8\",\"Exodus 7:14\",\"Exodus 7:26\",\"Exodus 9:1\",\"Exodus 9:8\",\"Exodus 9:22\",\"Exodus 10:1\",\"Exodus 10:12\",\"Exodus 10:21\",\"Exodus 11:1\",\"Exodus 12:1\",\"Exodus 12:21\",\"Exodus 12:37\",\"Exodus 12:43\",\"Exodus 13:1\",\"Exodus 14:1\",\"Exodus 14:15\",\"Exodus 14:26\",\"Exodus 15:1\",\"Exodus 15:20\",\"Exodus 16:11\",\"Exodus 17:1\",\"Exodus 17:8\",\"Exodus 17:14\",\"Exodus 18:1\",\"Exodus 19:1\",\"Exodus 20:8\",\"Exodus 20:18\",\"Exodus 20:22\",\"Exodus 21:1\",\"Exodus 21:28\",\"Exodus 22:13\",\"Exodus 22:24\",\"Exodus 24:1\",\"Exodus 25:1\",\"Exodus 25:23\",\"Exodus 25:31\",\"Exodus 26:7\",\"Exodus 26:15\",\"Exodus 28:6\",\"Exodus 30:1\",\"Exodus 30:11\",\"Exodus 30:17\",\"Exodus 30:22\",\"Exodus 31:12\",\"Exodus 32:7\",\"Exodus 32:15\",\"Exodus 33:17\",\"Exodus 34:27\",\"Exodus 35:4\",\"Exodus 35:30\",\"Exodus 37:1\",\"Exodus 37:10\",\"Exodus 37:17\",\"Exodus 37:25\",\"Exodus 38:1\",\"Exodus 39:2\",\"Exodus 39:8\",\"Exodus 39:33\",\"Exodus 40:1\",\"Exodus 40:28\",\"Exodus 40:34\",\"Leviticus 1:14\",\"Leviticus 3:1\",\"Leviticus 3:6\",\"Leviticus 3:12\",\"Leviticus 4:1\",\"Leviticus 4:13\",\"Leviticus 4:22\",\"Leviticus 4:27\",\"Leviticus 4:32\",\"Leviticus 5:1\",\"Leviticus 5:17\",\"Leviticus 5:20\",\"Leviticus 6:1\",\"Leviticus 6:12\",\"Leviticus 6:17\",\"Leviticus 7:1\",\"Leviticus 7:11\",\"Leviticus 7:22\",\"Leviticus 7:28\",\"Leviticus 8:1\",\"Leviticus 10:8\",\"Leviticus 10:12\",\"Leviticus 11:1\",\"Leviticus 12:1\",\"Leviticus 13:1\",\"Leviticus 13:9\",\"Leviticus 13:18\",\"Leviticus 13:29\",\"Leviticus 14:1\",\"Leviticus 14:33\",\"Leviticus 15:18\",\"Leviticus 15:25\",\"Leviticus 16:1\",\"Leviticus 17:1\",\"Leviticus 18:1\",\"Leviticus 19:1\",\"Leviticus 19:20\",\"Leviticus 19:23\",\"Leviticus 19:33\",\"Leviticus 20:1\",\"Leviticus 21:1\",\"Leviticus 21:16\",\"Leviticus 22:1\",\"Leviticus 22:17\",\"Leviticus 22:26\",\"Leviticus 23:1\",\"Leviticus 23:4\",\"Leviticus 23:9\",\"Leviticus 23:33\",\"Leviticus 24:1\",\"Leviticus 24:5\",\"Leviticus 24:13\",\"Leviticus 25:1\",\"Leviticus 26:14\",\"Leviticus 27:1\",\"Numbers 1:20\",\"Numbers 1:22\",\"Numbers 1:24\",\"Numbers 1:26\",\"Numbers 1:28\",\"Numbers 1:30\",\"Numbers 1:32\",\"Numbers 1:34\",\"Numbers 1:36\",\"Numbers 1:38\",\"Numbers 1:40\",\"Numbers 1:42\",\"Numbers 1:44\",\"Numbers 1:48\",\"Numbers 2:1\",\"Numbers 2:32\",\"Numbers 3:5\",\"Numbers 3:11\",\"Numbers 3:44\",\"Numbers 4:1\",\"Numbers 4:21\",\"Numbers 4:29\",\"Numbers 5:1\",\"Numbers 5:5\",\"Numbers 5:11\",\"Numbers 6:1\",\"Numbers 6:22\",\"Numbers 7:1\",\"Numbers 7:18\",\"Numbers 7:24\",\"Numbers 7:30\",\"Numbers 7:36\",\"Numbers 7:42\",\"Numbers 7:48\",\"Numbers 7:54\",\"Numbers 7:60\",\"Numbers 7:66\",\"Numbers 7:72\",\"Numbers 7:78\",\"Numbers 7:84\",\"Numbers 8:1\",\"Numbers 8:5\",\"Numbers 9:1\",\"Numbers 9:9\",\"Numbers 9:15\",\"Numbers 10:1\",\"Numbers 10:11\",\"Numbers 11:1\",\"Numbers 11:16\",\"Numbers 11:23\",\"Numbers 12:1\",\"Numbers 12:14\",\"Numbers 13:1\",\"Numbers 14:11\",\"Numbers 14:26\",\"Numbers 15:1\",\"Numbers 15:17\",\"Numbers 15:32\",\"Numbers 15:37\",\"Numbers 16:1\",\"Numbers 16:20\",\"Numbers 16:23\",\"Numbers 17:1\",\"Numbers 17:9\",\"Numbers 17:16\",\"Numbers 18:25\",\"Numbers 19:1\",\"Numbers 20:1\",\"Numbers 20:7\",\"Numbers 20:22\",\"Numbers 21:4\",\"Numbers 21:21\",\"Numbers 25:1\",\"Numbers 25:10\",\"Numbers 25:16\",\"Numbers 26:1\",\"Numbers 26:52\",\"Numbers 27:15\",\"Numbers 28:1\",\"Numbers 28:9\",\"Numbers 29:1\",\"Numbers 29:12\",\"Numbers 29:32\",\"Numbers 29:35\",\"Numbers 30:2\",\"Numbers 31:1\",\"Numbers 31:25\",\"Numbers 32:1\",\"Numbers 32:20\",\"Numbers 33:1\",\"Numbers 34:1\",\"Numbers 34:16\",\"Numbers 35:1\",\"Numbers 35:9\",\"Numbers 36:1\",\"Deuteronomy 4:1\",\"Deuteronomy 4:25\",\"Deuteronomy 4:41\",\"Deuteronomy 5:1\",\"Deuteronomy 6:4\",\"Deuteronomy 7:12\",\"Deuteronomy 8:1\",\"Deuteronomy 8:19\",\"Deuteronomy 9:1\",\"Deuteronomy 10:1\",\"Deuteronomy 10:12\",\"Deuteronomy 13:2\",\"Deuteronomy 14:22\",\"Deuteronomy 15:19\",\"Deuteronomy 16:1\",\"Deuteronomy 16:13\",\"Deuteronomy 17:8\",\"Deuteronomy 21:1\",\"Deuteronomy 22:6\",\"Deuteronomy 25:17\",\"Deuteronomy 26:1\",\"Deuteronomy 28:1\",\"Deuteronomy 29:1\",\"Deuteronomy 29:9\",\"Deuteronomy 30:11\",\"Deuteronomy 31:1\",\"Deuteronomy 31:7\",\"Deuteronomy 31:14\",\"Deuteronomy 32:1\",\"Deuteronomy 32:44\",\"Deuteronomy 32:48\",\"Deuteronomy 33:1\"],\"shape\":[295],\"dtype\":\"object\",\"order\":\"little\"}],[\"EndRef\",{\"type\":\"ndarray\",\"array\":[\"Genesis 1:5\",\"Genesis 1:8\",\"Genesis 1:13\",\"Genesis 1:19\",\"Genesis 1:23\",\"Genesis 1:31\",\"Genesis 2:3\",\"Genesis 3:21\",\"Genesis 4:26\",\"Genesis 5:20\",\"Genesis 5:24\",\"Genesis 5:27\",\"Genesis 6:4\",\"Genesis 6:8\",\"Genesis 9:17\",\"Genesis 9:29\",\"Genesis 10:32\",\"Genesis 11:9\",\"Genesis 12:9\",\"Genesis 13:18\",\"Genesis 17:27\",\"Genesis 21:21\",\"Genesis 21:34\",\"Genesis 22:19\",\"Genesis 24:67\",\"Genesis 25:18\",\"Genesis 32:3\",\"Genesis 34:31\",\"Genesis 35:8\",\"Genesis 35:22\",\"Genesis 35:29\",\"Genesis 36:30\",\"Genesis 36:43\",\"Genesis 37:36\",\"Genesis 40:23\",\"Genesis 44:17\",\"Genesis 46:27\",\"Genesis 47:31\",\"Genesis 48:22\",\"Genesis 49:4\",\"Genesis 49:12\",\"Genesis 49:26\",\"Exodus 1:7\",\"Exodus 2:22\",\"Exodus 4:17\",\"Exodus 4:26\",\"Exodus 6:9\",\"Exodus 6:12\",\"Exodus 6:28\",\"Exodus 6:30\",\"Exodus 7:7\",\"Exodus 7:13\",\"Exodus 7:25\",\"Exodus 8:28\",\"Exodus 9:7\",\"Exodus 9:21\",\"Exodus 9:35\",\"Exodus 10:11\",\"Exodus 10:20\",\"Exodus 10:29\",\"Exodus 11:10\",\"Exodus 12:20\",\"Exodus 12:36\",\"Exodus 12:42\",\"Exodus 12:51\",\"Exodus 13:22\",\"Exodus 14:14\",\"Exodus 14:25\",\"Exodus 14:31\",\"Exodus 15:19\",\"Exodus 16:10\",\"Exodus 16:36\",\"Exodus 17:7\",\"Exodus 17:13\",\"Exodus 17:16\",\"Exodus 18:27\",\"Exodus 20:7\",\"Exodus 20:17\",\"Exodus 20:21\",\"Exodus 20:26\",\"Exodus 21:27\",\"Exodus 22:12\",\"Exodus 22:23\",\"Exodus 23:33\",\"Exodus 24:18\",\"Exodus 25:22\",\"Exodus 25:30\",\"Exodus 26:6\",\"Exodus 26:14\",\"Exodus 28:5\",\"Exodus 29:46\",\"Exodus 30:10\",\"Exodus 30:16\",\"Exodus 30:21\",\"Exodus 31:11\",\"Exodus 32:6\",\"Exodus 32:14\",\"Exodus 33:16\",\"Exodus 34:26\",\"Exodus 35:3\",\"Exodus 35:29\",\"Exodus 36:38\",\"Exodus 37:9\",\"Exodus 37:16\",\"Exodus 37:24\",\"Exodus 37:29\",\"Exodus 39:1\",\"Exodus 39:7\",\"Exodus 39:32\",\"Exodus 39:43\",\"Exodus 40:27\",\"Exodus 40:33\",\"Leviticus 1:13\",\"Leviticus 2:16\",\"Leviticus 3:5\",\"Leviticus 3:11\",\"Leviticus 3:17\",\"Leviticus 4:12\",\"Leviticus 4:21\",\"Leviticus 4:26\",\"Leviticus 4:31\",\"Leviticus 4:35\",\"Leviticus 5:16\",\"Leviticus 5:19\",\"Leviticus 5:26\",\"Leviticus 6:11\",\"Leviticus 6:16\",\"Leviticus 6:23\",\"Leviticus 7:10\",\"Leviticus 7:21\",\"Leviticus 7:27\",\"Leviticus 7:38\",\"Leviticus 10:7\",\"Leviticus 10:11\",\"Leviticus 10:20\",\"Leviticus 11:47\",\"Leviticus 12:8\",\"Leviticus 13:8\",\"Leviticus 13:17\",\"Leviticus 13:28\",\"Leviticus 13:59\",\"Leviticus 14:32\",\"Leviticus 15:17\",\"Leviticus 15:24\",\"Leviticus 15:33\",\"Leviticus 16:34\",\"Leviticus 17:16\",\"Leviticus 18:30\",\"Leviticus 19:19\",\"Leviticus 19:22\",\"Leviticus 19:32\",\"Leviticus 19:37\",\"Leviticus 20:27\",\"Leviticus 21:15\",\"Leviticus 21:24\",\"Leviticus 22:16\",\"Leviticus 22:25\",\"Leviticus 22:33\",\"Leviticus 23:3\",\"Leviticus 23:8\",\"Leviticus 23:32\",\"Leviticus 23:44\",\"Leviticus 24:4\",\"Leviticus 24:12\",\"Leviticus 24:23\",\"Leviticus 26:13\",\"Leviticus 26:46\",\"Numbers 1:19\",\"Numbers 1:21\",\"Numbers 1:23\",\"Numbers 1:25\",\"Numbers 1:27\",\"Numbers 1:29\",\"Numbers 1:31\",\"Numbers 1:33\",\"Numbers 1:35\",\"Numbers 1:37\",\"Numbers 1:39\",\"Numbers 1:41\",\"Numbers 1:43\",\"Numbers 1:47\",\"Numbers 1:54\",\"Numbers 2:31\",\"Numbers 3:4\",\"Numbers 3:10\",\"Numbers 3:43\",\"Numbers 3:51\",\"Numbers 4:20\",\"Numbers 4:28\",\"Numbers 4:49\",\"Numbers 5:4\",\"Numbers 5:10\",\"Numbers 5:31\",\"Numbers 6:21\",\"Numbers 6:27\",\"Numbers 7:17\",\"Numbers 7:23\",\"Numbers 7:29\",\"Numbers 7:35\",\"Numbers 7:41\",\"Numbers 7:47\",\"Numbers 7:53\",\"Numbers 7:59\",\"Numbers 7:65\",\"Numbers 7:71\",\"Numbers 7:77\",\"Numbers 7:83\",\"Numbers 7:89\",\"Numbers 8:4\",\"Numbers 8:26\",\"Numbers 9:8\",\"Numbers 9:14\",\"Numbers 9:23\",\"Numbers 10:10\",\"Numbers 10:36\",\"Numbers 11:15\",\"Numbers 11:22\",\"Numbers 11:35\",\"Numbers 12:13\",\"Numbers 12:16\",\"Numbers 14:10\",\"Numbers 14:25\",\"Numbers 14:45\",\"Numbers 15:16\",\"Numbers 15:31\",\"Numbers 15:36\",\"Numbers 15:41\",\"Numbers 16:19\",\"Numbers 16:22\",\"Numbers 16:35\",\"Numbers 17:8\",\"Numbers 17:15\",\"Numbers 18:24\",\"Numbers 18:32\",\"Numbers 19:22\",\"Numbers 20:6\",\"Numbers 20:21\",\"Numbers 21:3\",\"Numbers 21:20\",\"Numbers 24:25\",\"Numbers 25:9\",\"Numbers 25:15\",\"Numbers 25:19\",\"Numbers 26:51\",\"Numbers 27:14\",\"Numbers 27:23\",\"Numbers 28:8\",\"Numbers 28:31\",\"Numbers 29:11\",\"Numbers 29:31\",\"Numbers 29:34\",\"Numbers 30:1\",\"Numbers 30:17\",\"Numbers 31:24\",\"Numbers 31:54\",\"Numbers 32:19\",\"Numbers 32:42\",\"Numbers 33:56\",\"Numbers 34:15\",\"Numbers 34:29\",\"Numbers 35:8\",\"Numbers 35:34\",\"Deuteronomy 3:29\",\"Deuteronomy 4:24\",\"Deuteronomy 4:40\",\"Deuteronomy 4:49\",\"Deuteronomy 6:3\",\"Deuteronomy 7:11\",\"Deuteronomy 7:26\",\"Deuteronomy 8:18\",\"Deuteronomy 8:20\",\"Deuteronomy 9:29\",\"Deuteronomy 10:11\",\"Deuteronomy 13:1\",\"Deuteronomy 14:21\",\"Deuteronomy 15:18\",\"Deuteronomy 15:23\",\"Deuteronomy 16:12\",\"Deuteronomy 17:7\",\"Deuteronomy 20:20\",\"Deuteronomy 22:5\",\"Deuteronomy 25:16\",\"Deuteronomy 25:19\",\"Deuteronomy 27:26\",\"Deuteronomy 28:69\",\"Deuteronomy 29:8\",\"Deuteronomy 30:10\",\"Deuteronomy 30:20\",\"Deuteronomy 31:6\",\"Deuteronomy 31:13\",\"Deuteronomy 31:30\",\"Deuteronomy 32:43\",\"Deuteronomy 32:47\",\"Deuteronomy 32:52\",\"Deuteronomy 34:12\"],\"shape\":[295],\"dtype\":\"object\",\"order\":\"little\"}],[\"Length\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"TgAAAD0AAABgAAAAfAAAAFYAAADkAAAANgAAAFwDAAAUAgAAJAEAADYAAAAxAAAAtQAAAEgAAABCBgAAqQAAAKsBAACrAAAAGAIAABsCAAA1BgAAnAgAANgAAACwAQAA7QYAABkBAACnEgAAHAYAALQAAADmAAAAYAAAAMEBAACkAAAAqQIAAOMFAAD0CgAA7wQAAG4DAADgAQAANwAAAHYAAACqAAAAzQIAANoCAADDAwAAuAAAAM8CAAAqAAAAEgEAACMAAAB6AAAAbgAAACgBAADFAgAAjQAAADoBAAA0AQAAFAEAAOIAAACiAAAA6wAAANABAABjAQAAewAAAIkAAADVAQAAHAEAAPcAAACYAAAAAwEAALEBAAAFAgAAugAAAHgAAAAyAAAAPgIAAJECAACAAAAAWwAAAFYAAACNAQAApwEAAHoAAACEAgAAdgEAAF0BAAB1AAAAMgEAALIAAACMAwAAlQYAALUAAAB+AAAAUwAAALsBAAAmAQAAuQAAADkDAACCAgAAAQEAAOkBAAB2AwAAogAAAHYAAACNAAAAWgAAAIwCAABzAAAAuAEAANcAAADKAQAAbgAAAGYBAAByAQAAdwAAAHwAAABvAAAAFQEAAMEAAABnAAAAcQAAAF0AAACLAQAAOwAAAJYAAADqAAAASwAAAHgAAACsAAAA7AAAAFYAAADcAAAA7gUAAD8AAADhAAAAXgMAAKQAAADUAAAAowAAAO4AAADWAgAA/gIAAGoDAACLAAAAvQAAAD8DAACAAQAArwEAABgBAABBAAAAjwAAAFMAAAA9AgAA9wAAAI4AAAAqAQAAtwAAAGkAAAAxAAAATwAAAMkBAAD4AAAAPgAAAJkAAACsAAAApgQAAGYCAABgAwAAJwAAACUAAAAiAAAAIAAAACAAAAAgAAAAIQAAAB8AAAAgAAAAIAAAACAAAAAfAAAAQgAAAIcAAAClAQAAiAAAAF8AAAAqAgAAigAAAKkBAACgAAAAbwEAAEgAAAByAAAA5wEAALcBAAAyAAAANwEAAFIAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAnAAAAEYAAAC0AQAArQAAAIsAAADLAAAAowAAAG4BAAA3AQAAuwAAACcBAADaAAAAOQAAAPQCAAA1AQAAhwEAABMBAAAdAQAAXgAAAFkAAAB8AQAALQAAAAEBAACtAAAAjQAAABoDAACaAAAAEwIAAIAAAAA3AQAA2QAAAEIBAAA5CAAAqwAAAGUAAAAwAAAAzAIAAAYCAACpAAAAhQAAAIcBAADDAAAAXwEAAC8AAABiAAAAPAEAAOYBAAAOAgAAcwEAAJwBAADZAgAAEwEAAIsAAADJAAAA8gEAAFYKAAAwAgAAnQEAALYAAADcAgAAdgIAAEIBAABnAQAAKgAAAM4CAAANAQAAdAYAAOwCAABTAgAAVwAAABABAAByAQAAjgYAAFsCAACnBgAAQwAAALIDAACVBQAApQAAAMoCAAD5AAAAgAAAAMYAAADIAQAAQAIAAF4AAABwAAAAvQIAAA==\"},\"shape\":[295],\"dtype\":\"int32\",\"order\":\"little\"}],[\"Book\",{\"type\":\"ndarray\",\"array\":[\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\"],\"shape\":[295],\"dtype\":\"object\",\"order\":\"little\"}],[\"petuchaIndex\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0AAACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAAALkAAAC6AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAAxAAAAMUAAADGAAAAxwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADPAAAA0AAAANEAAADSAAAA0wAAANQAAADVAAAA1gAAANcAAADYAAAA2QAAANoAAADbAAAA3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAAOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAAAPIAAADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAAD/AAAAAAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcBAAAIAQAACQEAAAoBAAALAQAADAEAAA0BAAAOAQAADwEAABABAAARAQAAEgEAABMBAAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwBAAAdAQAAHgEAAB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAAA==\"},\"shape\":[295],\"dtype\":\"int32\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1046\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1047\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1042\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"petuchaIndex\"},\"y\":{\"type\":\"field\",\"field\":\"Length\"},\"size\":{\"type\":\"value\",\"value\":8},\"fill_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"type\":\"object\",\"name\":\"CategoricalColorMapper\",\"id\":\"p1004\",\"attributes\":{\"palette\":[\"#1f77b4\",\"#ff7f0e\",\"#2ca02c\",\"#d62728\",\"#9467bd\"],\"factors\":{\"type\":\"ndarray\",\"array\":[\"Genesis\",\"Exodus\",\"Leviticus\",\"Numeri\",\"Deuteronomium\"],\"shape\":[5],\"dtype\":\"object\",\"order\":\"little\"}}}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.8},\"hatch_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1004\"}}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1043\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"petuchaIndex\"},\"y\":{\"type\":\"field\",\"field\":\"Length\"},\"size\":{\"type\":\"value\",\"value\":8},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1004\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1004\"}},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1044\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"petuchaIndex\"},\"y\":{\"type\":\"field\",\"field\":\"Length\"},\"size\":{\"type\":\"value\",\"value\":8},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1004\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1004\"}},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1014\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1027\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1028\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1029\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1030\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p1036\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p1035\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1037\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1038\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1050\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":[[\"Petucha index\",\"@Index\"],[\"Length\",\"@Length\"],[\"Start verse\",\"@StartRef\"],[\"End verse\",\"@EndRef\"],[\" \",\" \"]]}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1022\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1023\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1024\"},\"axis_label\":\"Length (in words)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1025\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1017\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1018\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1019\"},\"axis_label\":\"Petucha index\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1020\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1021\",\"attributes\":{\"axis\":{\"id\":\"p1017\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1026\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1022\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p1048\",\"attributes\":{\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1049\",\"attributes\":{\"label\":{\"type\":\"field\",\"field\":\"Book\"},\"renderers\":[{\"id\":\"p1045\"}]}}]}}]}}]}};\n", " const render_items = [{\"docid\":\"68c3472e-c217-4958-90c0-1fce5f828f2a\",\"roots\":{\"p1005\":\"de92bb04-d07f-4aa3-922c-7604e7367209\"},\"root_ids\":[\"p1005\"]}];\n", " void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1005" } }, "output_type": "display_data" } ], "source": [ "from bokeh.plotting import figure, show, output_notebook\n", "from bokeh.models import ColumnDataSource, HoverTool\n", "from bokeh.transform import factor_cmap\n", "from bokeh.palettes import Category10\n", "\n", "# Add a petucha index for plotting\n", "df['petuchaIndex'] = df.index + 1\n", "\n", "# Prepare data for Bokeh\n", "source = ColumnDataSource(df)\n", "\n", "# Define the color palette\n", "books = df['Book'].unique()\n", "palette = Category10[len(books)]\n", "color_map = factor_cmap('Book', palette=palette, factors=books)\n", "\n", "# Create the figure\n", "output_notebook() # To display the plot in a Jupyter notebook\n", "\n", "p = figure(\n", " width=1000,\n", " height=700,\n", " title='Petucha lengths in the Torah (in words)',\n", " x_axis_label='Petucha index',\n", " y_axis_label='Length (in words)',\n", " tools=\"pan,wheel_zoom,box_zoom,reset,save\"\n", ")\n", "\n", "# Add the scatter plot using scatter()\n", "p.scatter(\n", " x='petuchaIndex',\n", " y='Length',\n", " source=source,\n", " size=8,\n", " color=color_map,\n", " legend_field='Book',\n", " marker='circle',\n", " line_color='black',\n", " fill_alpha=0.8\n", ")\n", "\n", "# Add hover tool\n", "hover = HoverTool()\n", "hover.tooltips = [\n", " ('Petucha index', '@Index'),\n", " ('Length', '@Length'),\n", " ('Start verse', '@StartRef'),\n", " ('End verse', '@EndRef'),\n", " (' ', ' ') # to get a blank line when multiple datapoint are grouped when hovering \n", "]\n", "p.add_tools(hover)\n", "\n", "# Customize legend\n", "p.legend.location = 'top_right'\n", "p.legend.click_policy = 'hide'\n", "\n", "# Show the plot\n", "show(p)" ] }, { "cell_type": "markdown", "id": "49d775b8-24b3-4a0c-84bf-cecf68cfda9e", "metadata": {}, "source": [ "## 3.5 - Setuma length distribution over the books" ] }, { "cell_type": "markdown", "id": "2b76fa06-191c-4e58-90d0-7a5ffa95b594", "metadata": {}, "source": [ "The following script creates a statistical overview of the setuma length per book." ] }, { "cell_type": "code", "execution_count": 12, "id": "1c88d177-0fc4-45a6-8362-3a9d2b80996d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.49s 112927 results\n", "\n", "Statistical overview of setuma lengths per book:\n", " count mean std min 25% 50% 75% max\n", "Genesis 51 570.84 867.37 7 37.00 239.0 720.50 4209\n", "Exodus 94 250.84 345.09 2 29.75 102.5 305.50 1650\n", "Leviticus 49 363.63 470.58 8 23.00 172.0 494.00 1848\n", "Numeri 64 363.44 556.47 4 47.75 115.5 384.25 2522\n", "Deuteronomium 135 141.90 268.65 2 18.00 59.0 138.00 2000\n", "Total 393 338.13 501.63 2 31.10 137.6 408.45 4209\n" ] } ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", "from tf.app import use\n", "\n", "# Function to get reference string from verse nodes\n", "def getVerseReference(node):\n", " section = T.sectionFromNode(node)\n", " return f\"{section[0]} {section[1]}:{section[2]}\" if section else 'Unknown Reference'\n", "\n", "# Function to process each setuma and append to list\n", "def addSetumaInfo(setumaList, index, startWordNode, endWordNode, length, bookName):\n", " startVerseNodes = L.u(startWordNode, otype='verse')\n", " endVerseNodes = L.u(endWordNode, otype='verse')\n", " \n", " startRefStr = getVerseReference(startVerseNodes[0]) if startVerseNodes else 'Unknown Reference'\n", " endRefStr = getVerseReference(endVerseNodes[0]) if endVerseNodes else 'Unknown Reference'\n", " \n", " setumaList.append({\n", " 'Index': index,\n", " 'StartRef': startRefStr,\n", " 'EndRef': endRefStr,\n", " 'Length': length,\n", " 'Book': bookName\n", " })\n", "\n", "# Initialize variables\n", "setumaInfo = []\n", "currentSetumaLength = 0\n", "currentSetumaStartWord = None\n", "index = 1\n", "\n", "# Find all words in the Torah\n", "wordsInTorahQuery = '''\n", "book book=Genesis|Exodus|Leviticus|Numeri|Deuteronomium\n", " word\n", "'''\n", "wordsInTorah = BHS.search(wordsInTorahQuery)\n", "\n", "# Iterate over all words in the dataset\n", "for bookNode, wordNode in wordsInTorah:\n", " # Get the trailer feature of the word\n", " trailer = F.trailer.v(wordNode) or '' # prevent 'NoneType' errors\n", " \n", " # If starting a new setuma, record the start word\n", " if currentSetumaStartWord is None:\n", " currentSetumaStartWord = wordNode\n", " currentBookName = F.book.v(bookNode)\n", " \n", " # Increment the length counter\n", " currentSetumaLength += 1\n", "\n", " # Check if the word ends with a Setuma (represented by 'S' in the trailer)\n", " if 'S' in trailer:\n", " addSetumaInfo(setumaInfo, index, currentSetumaStartWord, wordNode, currentSetumaLength, currentBookName)\n", " \n", " # Reset the variables for the next setuma\n", " currentSetumaLength = 0\n", " currentSetumaStartWord = None\n", " index += 1\n", "\n", "# Handle any remaining words after the last setuma\n", "if currentSetumaLength > 0 and currentSetumaStartWord is not None:\n", " addSetumaInfo(setumaInfo, index, currentSetumaStartWord, wordNode, currentSetumaLength, currentBookName)\n", "\n", "# Convert the setumaInfo list to a pandas DataFrame for analysis\n", "df = pd.DataFrame(setumaInfo)\n", "\n", "# Define the desired book order\n", "orderedBooks = ['Genesis', 'Exodus', 'Leviticus', 'Numeri', 'Deuteronomium']\n", "\n", "# Display per-book statistics using a specified formatting\n", "print(\"\\nStatistical overview of setuma lengths per book:\")\n", "bookStats = df.groupby('Book')['Length'].describe().round(2)\n", "bookStats['count'] = bookStats['count'].astype(int)\n", "bookStats['min'] = bookStats['min'].astype(int)\n", "bookStats['max'] = bookStats['max'].astype(int)\n", "\n", "# Calculate total row across all books\n", "totalStats = pd.DataFrame({\n", " 'count': [int(bookStats['count'].sum())],\n", " 'mean': [round(bookStats['mean'].mean(), 2)],\n", " 'std': [round(bookStats['std'].mean(), 2)],\n", " 'min': [int(bookStats['min'].min())],\n", " '25%': [round(bookStats['25%'].mean(), 2)],\n", " '50%': [round(bookStats['50%'].mean(), 2)],\n", " '75%': [round(bookStats['75%'].mean(), 2)],\n", " 'max': [int(bookStats['max'].max())]\n", "}, index=['Total'])\n", "\n", "# Concatenate the total row with the book_stats DataFrame\n", "bookStats = pd.concat([bookStats, totalStats])\n", "\n", "# Reorder bookStats based on the original order of books in setumaInfo\n", "bookStats = bookStats.reindex(orderedBooks + ['Total'])\n", "\n", "# Configure display options to show all data on a single line for each book\n", "pd.set_option('display.max_columns', None) # Show all columns\n", "pd.set_option('display.width', 1000) # Wide display to avoid line wrapping\n", "print(bookStats)" ] }, { "cell_type": "markdown", "id": "c7cd1029-2b15-41f5-8a7a-41f5801d6383", "metadata": {}, "source": [ "## 3.6 - Plotting setuma length per book\n", "\n", "The following script creates a scatter plot displaying the length distribution of each setuma sections.\n", "Hovering over the datapoints provids more details like word-count, and the start and end-verse. This script uses the data created by the previous script." ] }, { "cell_type": "code", "execution_count": 13, "id": "281c204e-24ce-409d-992a-3c41c4ff08ae", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "'use strict';\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " function drop(id) {\n", " const view = Bokeh.index.get_by_id(id)\n", " if (view != null) {\n", " view.model.document.clear()\n", " Bokeh.index.delete(view)\n", " }\n", " }\n", "\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", "\n", " // Clean up Bokeh references\n", " if (id != null) {\n", " drop(id)\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim()\n", " drop(id)\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"
    \\n\"+\n", " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded(error = null) {\n", " const el = document.getElementById(\"dc29c3db-9f32-411f-8555-41ffe56e243a\");\n", " if (el != null) {\n", " const html = (() => {\n", " if (typeof root.Bokeh === \"undefined\") {\n", " if (error == null) {\n", " return \"BokehJS is loading ...\";\n", " } else {\n", " return \"BokehJS failed to load.\";\n", " }\n", " } else {\n", " const prefix = `BokehJS ${root.Bokeh.version}`;\n", " if (error == null) {\n", " return `${prefix} successfully loaded.`;\n", " } else {\n", " return `${prefix} encountered errors while loading and may not function as expected.`;\n", " }\n", " }\n", " })();\n", " el.innerHTML = html;\n", "\n", " if (error != null) {\n", " const wrapper = document.createElement(\"div\");\n", " wrapper.style.overflow = \"auto\";\n", " wrapper.style.height = \"5em\";\n", " wrapper.style.resize = \"vertical\";\n", " const content = document.createElement(\"div\");\n", " content.style.fontFamily = \"monospace\";\n", " content.style.whiteSpace = \"pre-wrap\";\n", " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", " content.textContent = error.stack ?? error.toString();\n", " wrapper.append(content);\n", " el.append(wrapper);\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(() => display_loaded(error), 100);\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.6.0.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " try {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "\n", " } catch (error) {display_loaded(error);throw error;\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " const cell = $(document.getElementById(\"dc29c3db-9f32-411f-8555-41ffe56e243a\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"dc29c3db-9f32-411f-8555-41ffe56e243a\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.6.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.6.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"dc29c3db-9f32-411f-8555-41ffe56e243a\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"aab1d0e9-cd22-43d4-bcf3-5ab83a1da515\":{\"version\":\"3.6.0\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1059\",\"attributes\":{\"width\":1000,\"height\":700,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1060\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1061\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1069\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1070\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1062\",\"attributes\":{\"text\":\"Setuma lengths in the Torah (in words)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1099\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1055\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1056\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1057\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[393],\"dtype\":\"int32\",\"order\":\"little\"}],[\"Index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[393],\"dtype\":\"int32\",\"order\":\"little\"}],[\"StartRef\",{\"type\":\"ndarray\",\"array\":[\"Genesis 1:1\",\"Genesis 3:16\",\"Genesis 3:17\",\"Genesis 4:1\",\"Genesis 5:3\",\"Genesis 5:6\",\"Genesis 5:9\",\"Genesis 5:12\",\"Genesis 5:15\",\"Genesis 5:18\",\"Genesis 5:32\",\"Genesis 6:13\",\"Genesis 7:1\",\"Genesis 8:15\",\"Genesis 9:8\",\"Genesis 10:15\",\"Genesis 10:21\",\"Genesis 11:12\",\"Genesis 11:14\",\"Genesis 11:16\",\"Genesis 11:18\",\"Genesis 11:20\",\"Genesis 11:22\",\"Genesis 11:24\",\"Genesis 11:26\",\"Genesis 12:1\",\"Genesis 15:1\",\"Genesis 16:1\",\"Genesis 17:1\",\"Genesis 17:15\",\"Genesis 20:1\",\"Genesis 21:1\",\"Genesis 23:1\",\"Genesis 24:1\",\"Genesis 25:12\",\"Genesis 26:1\",\"Genesis 26:34\",\"Genesis 27:1\",\"Genesis 28:10\",\"Genesis 33:18\",\"Genesis 34:1\",\"Genesis 36:20\",\"Genesis 39:1\",\"Genesis 40:1\",\"Genesis 46:8\",\"Genesis 49:8\",\"Genesis 49:14\",\"Genesis 49:16\",\"Genesis 49:20\",\"Genesis 49:21\",\"Genesis 49:22\",\"Exodus 2:1\",\"Exodus 3:1\",\"Exodus 6:2\",\"Exodus 6:14\",\"Exodus 7:19\",\"Exodus 8:12\",\"Exodus 8:16\",\"Exodus 9:13\",\"Exodus 11:4\",\"Exodus 11:9\",\"Exodus 12:29\",\"Exodus 12:51\",\"Exodus 13:11\",\"Exodus 13:17\",\"Exodus 15:22\",\"Exodus 15:27\",\"Exodus 16:4\",\"Exodus 16:6\",\"Exodus 16:28\",\"Exodus 20:1\",\"Exodus 20:2\",\"Exodus 20:7\",\"Exodus 20:12\",\"Exodus 20:13\",\"Exodus 20:14\",\"Exodus 20:15\",\"Exodus 20:16\",\"Exodus 20:17\",\"Exodus 21:7\",\"Exodus 21:12\",\"Exodus 21:14\",\"Exodus 21:15\",\"Exodus 21:17\",\"Exodus 21:18\",\"Exodus 21:20\",\"Exodus 21:22\",\"Exodus 21:26\",\"Exodus 21:27\",\"Exodus 21:33\",\"Exodus 21:35\",\"Exodus 21:37\",\"Exodus 22:4\",\"Exodus 22:5\",\"Exodus 22:6\",\"Exodus 22:9\",\"Exodus 22:15\",\"Exodus 22:17\",\"Exodus 22:18\",\"Exodus 22:19\",\"Exodus 22:27\",\"Exodus 23:1\",\"Exodus 23:2\",\"Exodus 23:4\",\"Exodus 23:5\",\"Exodus 23:6\",\"Exodus 23:20\",\"Exodus 24:12\",\"Exodus 25:10\",\"Exodus 26:1\",\"Exodus 26:31\",\"Exodus 27:1\",\"Exodus 27:9\",\"Exodus 27:20\",\"Exodus 28:1\",\"Exodus 28:13\",\"Exodus 28:15\",\"Exodus 28:31\",\"Exodus 28:36\",\"Exodus 29:1\",\"Exodus 29:38\",\"Exodus 30:34\",\"Exodus 31:1\",\"Exodus 31:18\",\"Exodus 33:1\",\"Exodus 33:12\",\"Exodus 34:1\",\"Exodus 35:1\",\"Exodus 36:8\",\"Exodus 36:14\",\"Exodus 36:20\",\"Exodus 38:8\",\"Exodus 38:9\",\"Exodus 38:21\",\"Exodus 38:24\",\"Exodus 39:27\",\"Exodus 39:30\",\"Exodus 39:32\",\"Exodus 40:17\",\"Exodus 40:20\",\"Exodus 40:22\",\"Exodus 40:24\",\"Exodus 40:26\",\"Exodus 40:30\",\"Exodus 40:33\",\"Leviticus 1:10\",\"Leviticus 2:1\",\"Leviticus 2:4\",\"Leviticus 2:5\",\"Leviticus 2:7\",\"Leviticus 2:14\",\"Leviticus 5:11\",\"Leviticus 5:14\",\"Leviticus 6:7\",\"Leviticus 9:1\",\"Leviticus 11:21\",\"Leviticus 11:29\",\"Leviticus 11:39\",\"Leviticus 13:24\",\"Leviticus 13:38\",\"Leviticus 13:40\",\"Leviticus 13:47\",\"Leviticus 14:21\",\"Leviticus 15:1\",\"Leviticus 15:16\",\"Leviticus 17:13\",\"Leviticus 18:6\",\"Leviticus 18:7\",\"Leviticus 18:8\",\"Leviticus 18:9\",\"Leviticus 18:10\",\"Leviticus 18:11\",\"Leviticus 18:12\",\"Leviticus 18:13\",\"Leviticus 18:14\",\"Leviticus 18:15\",\"Leviticus 18:16\",\"Leviticus 18:17\",\"Leviticus 21:10\",\"Leviticus 22:14\",\"Leviticus 23:15\",\"Leviticus 23:23\",\"Leviticus 23:26\",\"Leviticus 24:10\",\"Leviticus 25:8\",\"Leviticus 25:25\",\"Leviticus 25:35\",\"Leviticus 25:39\",\"Leviticus 25:47\",\"Leviticus 26:3\",\"Leviticus 26:18\",\"Leviticus 26:27\",\"Leviticus 27:9\",\"Leviticus 27:26\",\"Numbers 2:7\",\"Numbers 2:10\",\"Numbers 2:17\",\"Numbers 2:18\",\"Numbers 2:25\",\"Numbers 3:14\",\"Numbers 3:40\",\"Numbers 4:17\",\"Numbers 4:38\",\"Numbers 6:24\",\"Numbers 6:25\",\"Numbers 6:26\",\"Numbers 6:27\",\"Numbers 7:12\",\"Numbers 8:23\",\"Numbers 10:18\",\"Numbers 10:22\",\"Numbers 10:25\",\"Numbers 10:29\",\"Numbers 10:35\",\"Numbers 12:4\",\"Numbers 15:22\",\"Numbers 15:27\",\"Numbers 15:35\",\"Numbers 17:25\",\"Numbers 17:27\",\"Numbers 18:1\",\"Numbers 18:8\",\"Numbers 18:21\",\"Numbers 20:12\",\"Numbers 20:14\",\"Numbers 21:1\",\"Numbers 21:17\",\"Numbers 22:2\",\"Numbers 26:12\",\"Numbers 26:15\",\"Numbers 26:19\",\"Numbers 26:23\",\"Numbers 26:26\",\"Numbers 26:28\",\"Numbers 26:35\",\"Numbers 26:38\",\"Numbers 26:42\",\"Numbers 26:44\",\"Numbers 26:48\",\"Numbers 26:57\",\"Numbers 27:1\",\"Numbers 27:6\",\"Numbers 27:12\",\"Numbers 28:11\",\"Numbers 28:16\",\"Numbers 28:26\",\"Numbers 29:7\",\"Numbers 29:17\",\"Numbers 29:20\",\"Numbers 29:23\",\"Numbers 29:26\",\"Numbers 29:29\",\"Numbers 31:13\",\"Numbers 31:21\",\"Numbers 32:5\",\"Numbers 32:16\",\"Numbers 33:40\",\"Numbers 33:50\",\"Deuteronomy 2:2\",\"Deuteronomy 2:8\",\"Deuteronomy 2:17\",\"Deuteronomy 2:31\",\"Deuteronomy 3:23\",\"Deuteronomy 5:6\",\"Deuteronomy 5:12\",\"Deuteronomy 5:16\",\"Deuteronomy 5:17\",\"Deuteronomy 5:18\",\"Deuteronomy 5:19\",\"Deuteronomy 5:20\",\"Deuteronomy 5:21\",\"Deuteronomy 5:21\",\"Deuteronomy 5:22\",\"Deuteronomy 6:10\",\"Deuteronomy 6:16\",\"Deuteronomy 6:20\",\"Deuteronomy 7:1\",\"Deuteronomy 7:7\",\"Deuteronomy 7:17\",\"Deuteronomy 11:10\",\"Deuteronomy 11:13\",\"Deuteronomy 11:22\",\"Deuteronomy 11:26\",\"Deuteronomy 11:29\",\"Deuteronomy 12:20\",\"Deuteronomy 12:29\",\"Deuteronomy 13:13\",\"Deuteronomy 14:1\",\"Deuteronomy 14:3\",\"Deuteronomy 14:9\",\"Deuteronomy 14:11\",\"Deuteronomy 14:28\",\"Deuteronomy 15:1\",\"Deuteronomy 15:7\",\"Deuteronomy 15:12\",\"Deuteronomy 16:9\",\"Deuteronomy 16:18\",\"Deuteronomy 16:21\",\"Deuteronomy 16:22\",\"Deuteronomy 17:1\",\"Deuteronomy 17:2\",\"Deuteronomy 17:14\",\"Deuteronomy 18:1\",\"Deuteronomy 18:3\",\"Deuteronomy 18:6\",\"Deuteronomy 18:9\",\"Deuteronomy 18:14\",\"Deuteronomy 19:1\",\"Deuteronomy 19:8\",\"Deuteronomy 19:11\",\"Deuteronomy 19:14\",\"Deuteronomy 19:15\",\"Deuteronomy 20:1\",\"Deuteronomy 20:10\",\"Deuteronomy 20:19\",\"Deuteronomy 21:10\",\"Deuteronomy 21:15\",\"Deuteronomy 21:18\",\"Deuteronomy 21:22\",\"Deuteronomy 22:1\",\"Deuteronomy 22:4\",\"Deuteronomy 22:5\",\"Deuteronomy 22:8\",\"Deuteronomy 22:9\",\"Deuteronomy 22:10\",\"Deuteronomy 22:11\",\"Deuteronomy 22:12\",\"Deuteronomy 22:13\",\"Deuteronomy 22:20\",\"Deuteronomy 22:22\",\"Deuteronomy 22:23\",\"Deuteronomy 22:25\",\"Deuteronomy 22:28\",\"Deuteronomy 23:1\",\"Deuteronomy 23:2\",\"Deuteronomy 23:3\",\"Deuteronomy 23:4\",\"Deuteronomy 23:8\",\"Deuteronomy 23:8\",\"Deuteronomy 23:10\",\"Deuteronomy 23:16\",\"Deuteronomy 23:18\",\"Deuteronomy 23:22\",\"Deuteronomy 23:25\",\"Deuteronomy 23:26\",\"Deuteronomy 24:1\",\"Deuteronomy 24:5\",\"Deuteronomy 24:6\",\"Deuteronomy 24:7\",\"Deuteronomy 24:9\",\"Deuteronomy 24:10\",\"Deuteronomy 24:14\",\"Deuteronomy 24:16\",\"Deuteronomy 24:17\",\"Deuteronomy 24:19\",\"Deuteronomy 24:21\",\"Deuteronomy 25:1\",\"Deuteronomy 25:4\",\"Deuteronomy 25:5\",\"Deuteronomy 25:11\",\"Deuteronomy 25:13\",\"Deuteronomy 25:14\",\"Deuteronomy 26:12\",\"Deuteronomy 26:16\",\"Deuteronomy 27:1\",\"Deuteronomy 27:9\",\"Deuteronomy 27:11\",\"Deuteronomy 27:15\",\"Deuteronomy 27:16\",\"Deuteronomy 27:17\",\"Deuteronomy 27:18\",\"Deuteronomy 27:19\",\"Deuteronomy 27:20\",\"Deuteronomy 27:21\",\"Deuteronomy 27:22\",\"Deuteronomy 27:23\",\"Deuteronomy 27:24\",\"Deuteronomy 27:25\",\"Deuteronomy 27:26\",\"Deuteronomy 28:15\",\"Deuteronomy 28:69\",\"Deuteronomy 30:1\",\"Deuteronomy 30:15\",\"Deuteronomy 31:16\",\"Deuteronomy 33:7\",\"Deuteronomy 33:8\",\"Deuteronomy 33:12\",\"Deuteronomy 33:13\",\"Deuteronomy 33:18\",\"Deuteronomy 33:20\",\"Deuteronomy 33:22\",\"Deuteronomy 33:24\",\"Deuteronomy 34:1\"],\"shape\":[393],\"dtype\":\"object\",\"order\":\"little\"}],[\"EndRef\",{\"type\":\"ndarray\",\"array\":[\"Genesis 3:15\",\"Genesis 3:16\",\"Genesis 3:24\",\"Genesis 5:2\",\"Genesis 5:5\",\"Genesis 5:8\",\"Genesis 5:11\",\"Genesis 5:14\",\"Genesis 5:17\",\"Genesis 5:31\",\"Genesis 6:12\",\"Genesis 6:22\",\"Genesis 8:14\",\"Genesis 9:7\",\"Genesis 10:14\",\"Genesis 10:20\",\"Genesis 11:11\",\"Genesis 11:13\",\"Genesis 11:15\",\"Genesis 11:17\",\"Genesis 11:19\",\"Genesis 11:21\",\"Genesis 11:23\",\"Genesis 11:25\",\"Genesis 11:32\",\"Genesis 14:24\",\"Genesis 15:21\",\"Genesis 16:16\",\"Genesis 17:14\",\"Genesis 19:38\",\"Genesis 20:18\",\"Genesis 22:24\",\"Genesis 23:20\",\"Genesis 25:11\",\"Genesis 25:34\",\"Genesis 26:33\",\"Genesis 26:35\",\"Genesis 28:9\",\"Genesis 33:17\",\"Genesis 33:20\",\"Genesis 36:19\",\"Genesis 38:30\",\"Genesis 39:23\",\"Genesis 46:7\",\"Genesis 49:7\",\"Genesis 49:13\",\"Genesis 49:15\",\"Genesis 49:19\",\"Genesis 49:20\",\"Genesis 49:21\",\"Exodus 1:22\",\"Exodus 2:25\",\"Exodus 6:1\",\"Exodus 6:13\",\"Exodus 7:18\",\"Exodus 8:11\",\"Exodus 8:15\",\"Exodus 9:12\",\"Exodus 11:3\",\"Exodus 11:8\",\"Exodus 12:28\",\"Exodus 12:50\",\"Exodus 13:10\",\"Exodus 13:16\",\"Exodus 15:21\",\"Exodus 15:26\",\"Exodus 16:3\",\"Exodus 16:5\",\"Exodus 16:27\",\"Exodus 19:25\",\"Exodus 20:1\",\"Exodus 20:6\",\"Exodus 20:11\",\"Exodus 20:12\",\"Exodus 20:13\",\"Exodus 20:14\",\"Exodus 20:15\",\"Exodus 20:16\",\"Exodus 21:6\",\"Exodus 21:11\",\"Exodus 21:13\",\"Exodus 21:14\",\"Exodus 21:16\",\"Exodus 21:17\",\"Exodus 21:19\",\"Exodus 21:21\",\"Exodus 21:25\",\"Exodus 21:26\",\"Exodus 21:32\",\"Exodus 21:34\",\"Exodus 21:36\",\"Exodus 22:3\",\"Exodus 22:4\",\"Exodus 22:5\",\"Exodus 22:8\",\"Exodus 22:14\",\"Exodus 22:16\",\"Exodus 22:17\",\"Exodus 22:18\",\"Exodus 22:26\",\"Exodus 22:30\",\"Exodus 23:1\",\"Exodus 23:3\",\"Exodus 23:4\",\"Exodus 23:5\",\"Exodus 23:19\",\"Exodus 24:11\",\"Exodus 25:9\",\"Exodus 25:40\",\"Exodus 26:30\",\"Exodus 26:37\",\"Exodus 27:8\",\"Exodus 27:19\",\"Exodus 27:21\",\"Exodus 28:12\",\"Exodus 28:14\",\"Exodus 28:30\",\"Exodus 28:35\",\"Exodus 28:43\",\"Exodus 29:37\",\"Exodus 30:33\",\"Exodus 30:38\",\"Exodus 31:17\",\"Exodus 32:35\",\"Exodus 33:11\",\"Exodus 33:23\",\"Exodus 34:35\",\"Exodus 36:7\",\"Exodus 36:13\",\"Exodus 36:19\",\"Exodus 38:7\",\"Exodus 38:8\",\"Exodus 38:20\",\"Exodus 38:23\",\"Exodus 39:26\",\"Exodus 39:29\",\"Exodus 39:31\",\"Exodus 40:16\",\"Exodus 40:19\",\"Exodus 40:21\",\"Exodus 40:23\",\"Exodus 40:25\",\"Exodus 40:29\",\"Exodus 40:32\",\"Leviticus 1:9\",\"Leviticus 1:17\",\"Leviticus 2:3\",\"Leviticus 2:4\",\"Leviticus 2:6\",\"Leviticus 2:13\",\"Leviticus 5:10\",\"Leviticus 5:13\",\"Leviticus 6:6\",\"Leviticus 8:36\",\"Leviticus 11:20\",\"Leviticus 11:28\",\"Leviticus 11:38\",\"Leviticus 13:23\",\"Leviticus 13:37\",\"Leviticus 13:39\",\"Leviticus 13:46\",\"Leviticus 14:20\",\"Leviticus 14:57\",\"Leviticus 15:15\",\"Leviticus 17:12\",\"Leviticus 18:5\",\"Leviticus 18:6\",\"Leviticus 18:7\",\"Leviticus 18:8\",\"Leviticus 18:9\",\"Leviticus 18:10\",\"Leviticus 18:11\",\"Leviticus 18:12\",\"Leviticus 18:13\",\"Leviticus 18:14\",\"Leviticus 18:15\",\"Leviticus 18:16\",\"Leviticus 21:9\",\"Leviticus 22:13\",\"Leviticus 23:14\",\"Leviticus 23:22\",\"Leviticus 23:25\",\"Leviticus 24:9\",\"Leviticus 25:7\",\"Leviticus 25:24\",\"Leviticus 25:34\",\"Leviticus 25:38\",\"Leviticus 25:46\",\"Leviticus 26:2\",\"Leviticus 26:17\",\"Leviticus 26:26\",\"Leviticus 27:8\",\"Leviticus 27:25\",\"Numbers 2:6\",\"Numbers 2:9\",\"Numbers 2:16\",\"Numbers 2:17\",\"Numbers 2:24\",\"Numbers 3:13\",\"Numbers 3:39\",\"Numbers 4:16\",\"Numbers 4:37\",\"Numbers 6:23\",\"Numbers 6:24\",\"Numbers 6:25\",\"Numbers 6:26\",\"Numbers 7:11\",\"Numbers 8:22\",\"Numbers 10:17\",\"Numbers 10:21\",\"Numbers 10:24\",\"Numbers 10:28\",\"Numbers 10:34\",\"Numbers 12:3\",\"Numbers 15:21\",\"Numbers 15:26\",\"Numbers 15:34\",\"Numbers 17:24\",\"Numbers 17:26\",\"Numbers 17:28\",\"Numbers 18:7\",\"Numbers 18:20\",\"Numbers 20:11\",\"Numbers 20:13\",\"Numbers 20:29\",\"Numbers 21:16\",\"Numbers 22:1\",\"Numbers 26:11\",\"Numbers 26:14\",\"Numbers 26:18\",\"Numbers 26:22\",\"Numbers 26:25\",\"Numbers 26:27\",\"Numbers 26:34\",\"Numbers 26:37\",\"Numbers 26:41\",\"Numbers 26:43\",\"Numbers 26:47\",\"Numbers 26:56\",\"Numbers 26:65\",\"Numbers 27:5\",\"Numbers 27:11\",\"Numbers 28:10\",\"Numbers 28:15\",\"Numbers 28:25\",\"Numbers 29:6\",\"Numbers 29:16\",\"Numbers 29:19\",\"Numbers 29:22\",\"Numbers 29:25\",\"Numbers 29:28\",\"Numbers 31:12\",\"Numbers 31:20\",\"Numbers 32:4\",\"Numbers 32:15\",\"Numbers 33:39\",\"Numbers 33:49\",\"Deuteronomy 2:1\",\"Deuteronomy 2:8\",\"Deuteronomy 2:16\",\"Deuteronomy 2:30\",\"Deuteronomy 3:22\",\"Deuteronomy 5:5\",\"Deuteronomy 5:11\",\"Deuteronomy 5:15\",\"Deuteronomy 5:16\",\"Deuteronomy 5:17\",\"Deuteronomy 5:18\",\"Deuteronomy 5:19\",\"Deuteronomy 5:20\",\"Deuteronomy 5:21\",\"Deuteronomy 5:21\",\"Deuteronomy 6:9\",\"Deuteronomy 6:15\",\"Deuteronomy 6:19\",\"Deuteronomy 6:25\",\"Deuteronomy 7:6\",\"Deuteronomy 7:16\",\"Deuteronomy 11:9\",\"Deuteronomy 11:12\",\"Deuteronomy 11:21\",\"Deuteronomy 11:25\",\"Deuteronomy 11:28\",\"Deuteronomy 12:19\",\"Deuteronomy 12:28\",\"Deuteronomy 13:12\",\"Deuteronomy 13:19\",\"Deuteronomy 14:2\",\"Deuteronomy 14:8\",\"Deuteronomy 14:10\",\"Deuteronomy 14:27\",\"Deuteronomy 14:29\",\"Deuteronomy 15:6\",\"Deuteronomy 15:11\",\"Deuteronomy 16:8\",\"Deuteronomy 16:17\",\"Deuteronomy 16:20\",\"Deuteronomy 16:21\",\"Deuteronomy 16:22\",\"Deuteronomy 17:1\",\"Deuteronomy 17:13\",\"Deuteronomy 17:20\",\"Deuteronomy 18:2\",\"Deuteronomy 18:5\",\"Deuteronomy 18:8\",\"Deuteronomy 18:13\",\"Deuteronomy 18:22\",\"Deuteronomy 19:7\",\"Deuteronomy 19:10\",\"Deuteronomy 19:13\",\"Deuteronomy 19:14\",\"Deuteronomy 19:21\",\"Deuteronomy 20:9\",\"Deuteronomy 20:18\",\"Deuteronomy 21:9\",\"Deuteronomy 21:14\",\"Deuteronomy 21:17\",\"Deuteronomy 21:21\",\"Deuteronomy 21:23\",\"Deuteronomy 22:3\",\"Deuteronomy 22:4\",\"Deuteronomy 22:7\",\"Deuteronomy 22:8\",\"Deuteronomy 22:9\",\"Deuteronomy 22:10\",\"Deuteronomy 22:11\",\"Deuteronomy 22:12\",\"Deuteronomy 22:19\",\"Deuteronomy 22:21\",\"Deuteronomy 22:22\",\"Deuteronomy 22:24\",\"Deuteronomy 22:27\",\"Deuteronomy 22:29\",\"Deuteronomy 23:1\",\"Deuteronomy 23:2\",\"Deuteronomy 23:3\",\"Deuteronomy 23:7\",\"Deuteronomy 23:8\",\"Deuteronomy 23:9\",\"Deuteronomy 23:15\",\"Deuteronomy 23:17\",\"Deuteronomy 23:21\",\"Deuteronomy 23:24\",\"Deuteronomy 23:25\",\"Deuteronomy 23:26\",\"Deuteronomy 24:4\",\"Deuteronomy 24:5\",\"Deuteronomy 24:6\",\"Deuteronomy 24:8\",\"Deuteronomy 24:9\",\"Deuteronomy 24:13\",\"Deuteronomy 24:15\",\"Deuteronomy 24:16\",\"Deuteronomy 24:18\",\"Deuteronomy 24:20\",\"Deuteronomy 24:22\",\"Deuteronomy 25:3\",\"Deuteronomy 25:4\",\"Deuteronomy 25:10\",\"Deuteronomy 25:12\",\"Deuteronomy 25:13\",\"Deuteronomy 26:11\",\"Deuteronomy 26:15\",\"Deuteronomy 26:19\",\"Deuteronomy 27:8\",\"Deuteronomy 27:10\",\"Deuteronomy 27:14\",\"Deuteronomy 27:15\",\"Deuteronomy 27:16\",\"Deuteronomy 27:17\",\"Deuteronomy 27:18\",\"Deuteronomy 27:19\",\"Deuteronomy 27:20\",\"Deuteronomy 27:21\",\"Deuteronomy 27:22\",\"Deuteronomy 27:23\",\"Deuteronomy 27:24\",\"Deuteronomy 27:25\",\"Deuteronomy 28:14\",\"Deuteronomy 28:68\",\"Deuteronomy 29:28\",\"Deuteronomy 30:14\",\"Deuteronomy 31:15\",\"Deuteronomy 33:6\",\"Deuteronomy 33:7\",\"Deuteronomy 33:11\",\"Deuteronomy 33:12\",\"Deuteronomy 33:17\",\"Deuteronomy 33:19\",\"Deuteronomy 33:21\",\"Deuteronomy 33:23\",\"Deuteronomy 33:29\",\"Deuteronomy 34:12\"],\"shape\":[393],\"dtype\":\"object\",\"order\":\"little\"}],[\"Length\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[393],\"dtype\":\"int32\",\"order\":\"little\"}],[\"Book\",{\"type\":\"ndarray\",\"array\":[\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Genesis\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Exodus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Leviticus\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Numeri\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\",\"Deuteronomium\"],\"shape\":[393],\"dtype\":\"object\",\"order\":\"little\"}],[\"setumaIndex\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[393],\"dtype\":\"int32\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1100\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1101\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1096\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"setumaIndex\"},\"y\":{\"type\":\"field\",\"field\":\"Length\"},\"size\":{\"type\":\"value\",\"value\":8},\"fill_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"type\":\"object\",\"name\":\"CategoricalColorMapper\",\"id\":\"p1058\",\"attributes\":{\"palette\":[\"#1f77b4\",\"#ff7f0e\",\"#2ca02c\",\"#d62728\",\"#9467bd\"],\"factors\":{\"type\":\"ndarray\",\"array\":[\"Genesis\",\"Exodus\",\"Leviticus\",\"Numeri\",\"Deuteronomium\"],\"shape\":[5],\"dtype\":\"object\",\"order\":\"little\"}}}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.8},\"hatch_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1058\"}}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1097\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"setumaIndex\"},\"y\":{\"type\":\"field\",\"field\":\"Length\"},\"size\":{\"type\":\"value\",\"value\":8},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1058\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1058\"}},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1098\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"setumaIndex\"},\"y\":{\"type\":\"field\",\"field\":\"Length\"},\"size\":{\"type\":\"value\",\"value\":8},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1058\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"field\",\"field\":\"Book\",\"transform\":{\"id\":\"p1058\"}},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1068\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1081\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1082\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1083\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1084\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p1090\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p1089\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1091\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1092\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1104\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":[[\"Setuma index\",\"@Index\"],[\"Length\",\"@Length\"],[\"Start verse\",\"@StartRef\"],[\"End verse\",\"@EndRef\"],[\" \",\" \"]]}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1076\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1077\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1078\"},\"axis_label\":\"Length (in words)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1079\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1071\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1072\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1073\"},\"axis_label\":\"Setuma index\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1074\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1075\",\"attributes\":{\"axis\":{\"id\":\"p1071\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1080\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1076\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p1102\",\"attributes\":{\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1103\",\"attributes\":{\"label\":{\"type\":\"field\",\"field\":\"Book\"},\"renderers\":[{\"id\":\"p1099\"}]}}]}}]}}]}};\n", " const render_items = [{\"docid\":\"aab1d0e9-cd22-43d4-bcf3-5ab83a1da515\",\"roots\":{\"p1059\":\"aff57316-848f-4563-a745-e2a003401880\"},\"root_ids\":[\"p1059\"]}];\n", " void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1059" } }, "output_type": "display_data" } ], "source": [ "from bokeh.plotting import figure, show, output_notebook\n", "from bokeh.models import ColumnDataSource, HoverTool\n", "from bokeh.transform import factor_cmap\n", "from bokeh.palettes import Category10\n", "\n", "# Add a setuma index for plotting\n", "df['setumaIndex'] = df.index + 1\n", "\n", "# Prepare data for Bokeh\n", "source = ColumnDataSource(df)\n", "\n", "# Define the color palette\n", "books = df['Book'].unique()\n", "palette = Category10[len(books)]\n", "color_map = factor_cmap('Book', palette=palette, factors=books)\n", "\n", "# Create the figure\n", "output_notebook() # To display the plot in a Jupyter notebook\n", "\n", "p = figure(\n", " width=1000,\n", " height=700,\n", " title='Setuma lengths in the Torah (in words)',\n", " x_axis_label='Setuma index',\n", " y_axis_label='Length (in words)',\n", " tools=\"pan,wheel_zoom,box_zoom,reset,save\"\n", ")\n", "\n", "# Add the scatter plot using scatter()\n", "p.scatter(\n", " x='setumaIndex',\n", " y='Length',\n", " source=source,\n", " size=8,\n", " color=color_map,\n", " legend_field='Book',\n", " marker='circle',\n", " line_color='black',\n", " fill_alpha=0.8\n", ")\n", "\n", "# Add hover tool\n", "hover = HoverTool()\n", "hover.tooltips = [\n", " ('Setuma index', '@Index'),\n", " ('Length', '@Length'),\n", " ('Start verse', '@StartRef'),\n", " ('End verse', '@EndRef'),\n", " (' ', ' ') # to get a blank line when multiple datapoint are grouped when hovering \n", "]\n", "p.add_tools(hover)\n", "\n", "# Customize legend\n", "p.legend.location = 'top_right'\n", "p.legend.click_policy = 'hide'\n", "\n", "# Show the plot\n", "show(p)" ] }, { "cell_type": "markdown", "id": "a2a735c7-0f66-4167-87d9-0c1d2c21a760", "metadata": {}, "source": [ "# 4 - Attribution and footnotes\n", "##### [Back to TOC](#TOC)\n", "\n", "#### Footnotes:\n", "\n", "1 Russell Fuller, “The Text of the Tanak,” in A History of Biblical Interpretation: The Medieval through the Reformation Periods, ed. Alan J. Hauser, Duane F. Watson, and Schuyler Kaufman (Grand Rapids, MI; Cambridge, U.K.: William B. Eerdmans Publishing Company, 2009), 206." ] }, { "cell_type": "markdown", "id": "f48474f6-85a7-412f-910e-bfa3d70d8055", "metadata": { "tags": [] }, "source": [ "# 5 - Required libraries\n", "##### [Back to TOC](#TOC)\n", "\n", "The scripts in this notebook require (beside `text-fabric`) the following Python libraries to be installed in the environment:\n", "\n", " collections\n", " pandas\n", " bokeh\n", " IPython\n", "\n", "You can install any missing library from within Jupyter Notebook using either`pip` or `pip3`." ] }, { "cell_type": "markdown", "id": "ccfdf8cd-b736-476e-98c6-f2f14f6dcec2", "metadata": {}, "source": [ "# 6 - Notebook details\n", "##### [Back to TOC](#TOC)\n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AuthorTony Jurg
Version1.0
Date4 Novermber 2024
\n", "
" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.7" } }, "nbformat": 4, "nbformat_minor": 5 }