{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Getting started\n", "\n", "It is assumed that you have read\n", "[start](start.ipynb)\n", "and followed the installation instructions there." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Corpus\n", "\n", "This is:\n", "\n", "* `dss` Dead Sea Scrolls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# First acquaintance\n", "\n", "We just want to grasp what the corpus is about and how we can find our way in the data.\n", "\n", "Open a terminal or command prompt and say one of the following\n", "\n", "```text-fabric dss```\n", "\n", "Wait and see a lot happening before your browser starts up and shows you an interface on the corpus:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Text-Fabric needs an app to deal with the corpus-specific things.\n", "It downloads/finds/caches the latest version of the **app**:\n", "\n", "```\n", "Using TF-app in /Users/dirk/text-fabric-data/annotation/app-dss/code:\n", "\trv0.6=#304d66fd7eab50bbe4de8505c24d8b3eca30b1f1 (latest release)\n", "```\n", "\n", "It downloads/finds/caches the latest version of the **data**:\n", "\n", "```\n", "Using data in /Users/dirk/text-fabric-data/etcbc/dss/tf/0.6:\n", "\trv0.6=#9b52e40a8a36391b60807357fa94343c510bdee0 (latest release)\n", "```\n", "\n", "The data is preprocessed in order to speed up typical Text-Fabric operations.\n", "The result is cached on your computer.\n", "Preprocessing costs time. Next time you use this corpus on this machine, the startup time is much quicker.\n", "\n", "```\n", "TF setup done.\n", "```\n", "\n", "Then the app goes on to act as a local webserver serving the corpus that has just been downloaded\n", "and it will open your browser for you and load the corpus page\n", "\n", "```\n", " * Running on http://localhost:8107/ (Press CTRL+C to quit)\n", "Opening dss in browser\n", "Listening at port 18987\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Help!\n", "\n", "Indeed, that is what you need. Click the vertical `Help` tab.\n", "\n", "From there, click around a little bit. Don't read closely, just note the kinds of information that is presented to you.\n", "\n", "Later on, it will make more sense!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Browsing\n", "\n", "First we browse our data. Click the browse button.\n", "\n", "\n", "\n", "and then, in the table of *documents* (scrolls), click on a fragment of scroll `1QSb`: \n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now you're looking at a fragment of a scroll: the writing in Hebrew characters without vowel signs.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now click the *Options* tab and select the `layout-orig-unicode` format to see the same fragment in a layout that indicates the status\n", "of the pieces of writing.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can click a triangle to see how a line is broken down:\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Searching\n", "\n", "In this corpus there is a lot of attention for the uncertainty of signs and whether they have been corrected, either in antiquity or\n", "in more modern times.\n", "\n", "Also, the corpus is marked up with part-of-speech for each word.\n", "\n", "So we can, for example, search for *verbs* that have an uncertain or corrected or removed consonant in them.\n", "\n", "```\n", "word sp=verb\n", " sign type=cons\n", " /with/\n", " .. unc=1|2|3|4\n", " /or/\n", " .. cor=1|2|3\n", " /or/\n", " .. rem=1|2\n", " /or/\n", " .. rec=1\n", " /-/\n", "```\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In English:\n", "\n", "search all `word`s that contain a `sign` with feature `type`\n", "having value `cons` (consonant) where at least one of the following holds for\n", "that sign:\n", "\n", "* the feature `unc` has value `1` or `2` or `3` or `4`\n", "* the feature `cor` has value `1` or `2` or `3`\n", "* the feature `rem` has value `1` or `2`\n", "* the feature `rec` has value `1`\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Words with multiple uncertain signs correspond with multiple results. We can condense the results in such a way that all results for the same word are shown as one result.\n", "\n", "Click the options tab, check *condense results*, and check *word* as the container into you want to condense.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can expand results by clicking the triangle. \n", "\n", "You can see the result in context by clicking the browse icon.\n", "\n", "You can go back to the result list by clicking the results icon.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Computing\n", "\n", "This triggers other questions.\n", "\n", "For example: how many verbs are there, if there are already 37344 with uncertain signs?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How is uncertainty distributed over the verbs?\n", "I.e. how many verbs have how many uncertain/corrected/removed signs?\n", "\n", "*This is a typical question where you want to leave the search mode and enter computing mode*.\n", "\n", "Let's find out.\n", "\n", "Extra information:\n", "\n", "* the features `unc`, `cor`, `rem` have values 1, 2, 3, 4 that indicate the kind of uncertainty, correction, removal.\n", " We just use those values as the seriousness of the uncertainty.\n", " Essentially, we just sum up all values of these features for each sign.\n", "* the feature `rec` means, if that the sign is reconstructed. We consider it to be severely uncertain, and add the penalty 10 for\n", " such signs.\n", "\n", "Open your terminal and say\n", "\n", "``` sh\n", "jupyter notebook\n", "```\n", "\n", "Your browser starts up and presents you a local computing environment where you can run Python programs.\n", "\n", "You see cells like the one below, where you can type programming statements and execute them by pressing `Shift Enter`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we load the Text-Fabric module, as follows:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from tf.app import use" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we load the TF-app for the corpus `dss` and that app loads the corpus data.\n", "\n", "We give a name to the result of all that loading: `A`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "**Locating corpus resources ...**" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "app: ~/text-fabric-data/github/ETCBC/dss/app" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/text-fabric-data/github/ETCBC/dss/tf/1.9" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/text-fabric-data/github/ETCBC/dss/parallels/tf/1.9" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " TF: TF API 12.5.4, ETCBC/dss/app v3, Search Reference
\n", " Data: ETCBC - dss 1.9, 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", "
Name# of nodes# slots / node% coverage
scroll10011428.81100
lex10450129.1494
fragment11182127.91100
line5289527.04100
clause12512.850
cluster1010996.6847
phrase3155.100
word5009952.8199
sign14302411.00100
\n", " Sets: no custom sets
\n", " Features:
\n", "
ETCBC/dss/parallels/tf\n", "
\n", "\n", "
\n", "
\n", "sim\n", "
\n", "
int
\n", "\n", " similarity between lines, as a percentage of the common material wrt the combined material\n", "\n", "
\n", "\n", "
\n", "
\n", "\n", "
Dead Sea Scrolls\n", "
\n", "\n", "
\n", "
\n", "after\n", "
\n", "
str
\n", "\n", " space behind the word, if any\n", "\n", "
\n", "\n", "
\n", "
\n", "alt\n", "
\n", "
int
\n", "\n", " alternative reading\n", "\n", "
\n", "\n", "
\n", "
\n", "biblical\n", "
\n", "
int
\n", "\n", " whether we are in biblical material or not\n", "\n", "
\n", "\n", "
\n", "
\n", "book\n", "
\n", "
str
\n", "\n", " acronym of the book in which the word occurs\n", "\n", "
\n", "\n", "
\n", "
\n", "book_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA\n", "\n", "
\n", "\n", "
\n", "
\n", "chapter\n", "
\n", "
str
\n", "\n", " label of the chapter in which the word occurs\n", "\n", "
\n", "\n", "
\n", "
\n", "cl\n", "
\n", "
str
\n", "\n", " class (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "cl2\n", "
\n", "
str
\n", "\n", " class (for part 2) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "cor\n", "
\n", "
int
\n", "\n", " correction made by an ancient or modern editor\n", "\n", "
\n", "\n", "
\n", "
\n", "fragment\n", "
\n", "
str
\n", "\n", " label of a fragment of a scroll\n", "\n", "
\n", "\n", "
\n", "
\n", "full\n", "
\n", "
str
\n", "\n", " full transcription (Unicode) of a word including flags and brackets\n", "\n", "
\n", "\n", "
\n", "
\n", "fulle\n", "
\n", "
str
\n", "\n", " full transcription (ETCBC transliteration) of a word including flags and brackets\n", "\n", "
\n", "\n", "
\n", "
\n", "fullo\n", "
\n", "
str
\n", "\n", " full transcription (original source) of a word including flags and brackets\n", "\n", "
\n", "\n", "
\n", "
\n", "g_cons\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "g_nme_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "g_prs_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "glex\n", "
\n", "
str
\n", "\n", " representation (Unicode) of a lexeme leaving out non-letters\n", "\n", "
\n", "\n", "
\n", "
\n", "glexe\n", "
\n", "
str
\n", "\n", " representation (ETCBC transliteration) of a lexeme leaving out non-letters\n", "\n", "
\n", "\n", "
\n", "
\n", "glexo\n", "
\n", "
str
\n", "\n", " representation (original source) of a lexeme leaving out non-letters\n", "\n", "
\n", "\n", "
\n", "
\n", "glyph\n", "
\n", "
str
\n", "\n", " representation (Unicode) of a word or sign\n", "\n", "
\n", "\n", "
\n", "
\n", "glyphe\n", "
\n", "
str
\n", "\n", " representation (ETCBC transliteration) of a word or sign\n", "\n", "
\n", "\n", "
\n", "
\n", "glypho\n", "
\n", "
str
\n", "\n", " representation (original source) of a word or sign\n", "\n", "
\n", "\n", "
\n", "
\n", "gn\n", "
\n", "
str
\n", "\n", " gender (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "gn2\n", "
\n", "
str
\n", "\n", " gender (for part 2) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "gn3\n", "
\n", "
str
\n", "\n", " gender (for part 3) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "gn_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "halfverse\n", "
\n", "
str
\n", "\n", " label of the half-verse in which the word occurs\n", "\n", "
\n", "\n", "
\n", "
\n", "intl\n", "
\n", "
int
\n", "\n", " interlinear material, the value indicates the sequence number of the interlinear line\n", "\n", "
\n", "\n", "
\n", "
\n", "lang\n", "
\n", "
str
\n", "\n", " language of a word or sign, only if it is not Hebrew\n", "\n", "
\n", "\n", "
\n", "
\n", "lang_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA\n", "\n", "
\n", "\n", "
\n", "
\n", "lex\n", "
\n", "
str
\n", "\n", " representation (Unicode) of a lexeme\n", "\n", "
\n", "\n", "
\n", "
\n", "lex_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "lexe\n", "
\n", "
str
\n", "\n", " representation (ETCBC transliteration) of a lexeme\n", "\n", "
\n", "\n", "
\n", "
\n", "lexo\n", "
\n", "
str
\n", "\n", " representation (original source) of a lexeme\n", "\n", "
\n", "\n", "
\n", "
\n", "line\n", "
\n", "
str
\n", "\n", " label of a line of a fragment of a scroll\n", "\n", "
\n", "\n", "
\n", "
\n", "md\n", "
\n", "
str
\n", "\n", " mood (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "merr\n", "
\n", "
str
\n", "\n", " errors in parsing the morphology tag\n", "\n", "
\n", "\n", "
\n", "
\n", "morpho\n", "
\n", "
str
\n", "\n", " morphological tag (by Abegg)\n", "\n", "
\n", "\n", "
\n", "
\n", "nr\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "nu\n", "
\n", "
str
\n", "\n", " number (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "nu2\n", "
\n", "
str
\n", "\n", " number (for part 2) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "nu3\n", "
\n", "
str
\n", "\n", " number (for part 3) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "nu_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "otype\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: biblical and non-biblical scrolls\n", "\n", "
\n", "\n", "
\n", "
\n", "ps\n", "
\n", "
str
\n", "\n", " person (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "ps2\n", "
\n", "
str
\n", "\n", " person (for part 2) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "ps3\n", "
\n", "
str
\n", "\n", " person (for part 3) (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "ps_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "punc\n", "
\n", "
str
\n", "\n", " trailing punctuation (Unicode) of a word\n", "\n", "
\n", "\n", "
\n", "
\n", "punce\n", "
\n", "
str
\n", "\n", " trailing punctuation (ETCBC transliteration) of a word\n", "\n", "
\n", "\n", "
\n", "
\n", "punco\n", "
\n", "
str
\n", "\n", " trailing punctuation (original source) of a word\n", "\n", "
\n", "\n", "
\n", "
\n", "rec\n", "
\n", "
int
\n", "\n", " reconstructed by a modern editor\n", "\n", "
\n", "\n", "
\n", "
\n", "rem\n", "
\n", "
int
\n", "\n", " removed by an ancient or modern editor\n", "\n", "
\n", "\n", "
\n", "
\n", "script\n", "
\n", "
str
\n", "\n", " script in which the word or sign is written if it is not Hebrew\n", "\n", "
\n", "\n", "
\n", "
\n", "scroll\n", "
\n", "
str
\n", "\n", " acronym of a scroll\n", "\n", "
\n", "\n", "
\n", "
\n", "sp\n", "
\n", "
str
\n", "\n", " part of speech (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "sp_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "srcLn\n", "
\n", "
int
\n", "\n", " the line number of the word in the source data file\n", "\n", "
\n", "\n", "
\n", "
\n", "st\n", "
\n", "
str
\n", "\n", " state (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "type\n", "
\n", "
str
\n", "\n", " type of sign or cluster\n", "\n", "
\n", "\n", "
\n", "
\n", "unc\n", "
\n", "
int
\n", "\n", " uncertain material in various degrees: higher degree is less certain\n", "\n", "
\n", "\n", "
\n", "
\n", "uvf_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "vac\n", "
\n", "
int
\n", "\n", " empty, unwritten space\n", "\n", "
\n", "\n", "
\n", "
\n", "verse\n", "
\n", "
str
\n", "\n", " label of the verse in which the word occurs\n", "\n", "
\n", "\n", "
\n", "
\n", "vs\n", "
\n", "
str
\n", "\n", " verbal stem (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "vs_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "vt\n", "
\n", "
str
\n", "\n", " verbal tense/aspect (morphology tag)\n", "\n", "
\n", "\n", "
\n", "
\n", "vt_etcbc\n", "
\n", "
str
\n", "\n", " Dead Sea Scrolls: additions based on BHSA and machine learning\n", "\n", "
\n", "\n", "
\n", "
\n", "occ\n", "
\n", "
none
\n", "\n", " edge feature from a lexeme to its occurrences\n", "\n", "
\n", "\n", "
\n", "
\n", "oslots\n", "
\n", "
none
\n", "\n", " Dead Sea Scrolls: biblical and non-biblical scrolls\n", "\n", "
\n", "\n", "
\n", "
\n", "\n", " Settings:
specified
  1. apiVersion: 3
  2. appName: ETCBC/dss
  3. appPath: /Users/me/text-fabric-data/github/ETCBC/dss/app
  4. commit: gd796845ffd026d7896a29d71f730d471cba06631
  5. css:.full,.glyph,.punc {
    font-family: \"Ezra SIL\", \"SBL Hebrew\", sans-serif;
    }
    .scriptpaleohebrew {
    border: 1px dashed navy;
    }
    .scriptgreekcapital {
    border: 1px dashed brown;
    }
    .langa {
    text-decoration: underline;
    }
    .intl1 {
    vertical-align: -0.25em;
    }
    .intl2 {
    vertical-align: -0.5em;
    }
    .langg {
    font-family: serif;
    text-decoration: underline;
    }
    .vac1 {
    background-color: #aaaaaa;
    border 2pt solid #dd3333;
    border-radius: 4pt;
    }
    .rem1 {
    font-weight: bold;
    color: red;
    text-decoration: line-through;
    }
    .rem2 {
    font-weight: bold;
    color: maroon;
    text-decoration: line-through;
    }
    .rec1 {
    color: teal;
    font-size: 80%;
    }
    .cor1 {
    font-weight: bold;
    color: dodgerblue;
    text-decoration: overline;
    }
    .cor2 {
    font-weight: bold;
    color: navy;
    text-decoration: overline;
    }
    .cor3 {
    font-weight: bold;
    color: navy;
    text-decoration: overline;
    vertical-align: super;
    }
    .alt1 {
    text-decoration: overline;
    }

    /* UNSURE: italic*/

    .unc1 {
    font-weight: bold;
    color: #888888;
    }
    .unc2 {
    font-weight: bold;
    color: #bbbbbb;
    }
    .unc3 {
    font-weight: bold;
    color: #bbbbbb;
    text-shadow: #cccccc 1px 1px;
    }
    .unc4 {
    font-weight: bold;
    color: #dddddd;
    text-shadow: #eeeeee 2px 2px;
    }

    .empty {
    color: #ff0000;
    }

  6. dataDisplay:
    • noneValues:
      • unknown
      • no value
    • showVerseInTuple: True
    • textFormats:
      • layout-orig-full: {method: layoutOrig}
      • layout-source-full: {method: layoutSource}
      • layout-trans-full: {method: layoutTrans}
  7. docs:
    • docPage: about
    • featureBase: {docBase}/transcription.md
    • featurePage: transcription
  8. interfaceDefaults: {lineNumbers: 0}
  9. isCompatible: True
  10. local: local
  11. localDir: /Users/me/text-fabric-data/github/ETCBC/dss/_temp
  12. provenanceSpec:
    • corpus: Dead Sea Scrolls
    • doi: 10.5281/zenodo.2652849
    • moduleSpecs:
    • \n", " :\n", "
      • backend: no value
      • corpus: Parallel Passages
      • docUrl:https://nbviewer.jupyter.org/github/etcbc/dss/blob/master/programs/parallels.ipynb
      • doi: 10.5281/zenodo.2652849
      • org: ETCBC
      • relative: parallels/tf
      • repo: dss
      \n", "
    • org: ETCBC
    • relative: /tf
    • repo: dss
    • version: 1.9
    • webBase: https://www.deadseascrolls.org.il/explore-the-archive
    • webHint: Show this scroll in the Leon Levy library
    • webUrl: {webBase}/search#q='<1>'
  13. release: v1.9
  14. typeDisplay:
    • clause: {label: {nr}}
    • cluster:
      • label: {type}
      • stretch: 0
    • fragment: {features: biblical}
    • lex:
      • features: lex lexe
      • featuresBare: lexo
      • label: True
      • lexOcc: word
      • template: True
    • line: {features: biblical}
    • phrase: {label: {nr}}
    • scroll: {features: biblical}
    • sign: {exclude: {type: term}}
    • word:
      • base: True
      • features: lang lex cl ps gn nu st vs vt md
      • featuresBare: sp
      • label: True
      • lineNumber: srcLn
      • wrap: 0
  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": [ "A = use('ETCBC/dss', hoist=globals())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some bits are familiar from above, when you ran the `text-fabric` command in the terminal.\n", "\n", "Other bits are links to the documentation, they point to the same places as the links on the Text-Fabric browser.\n", "\n", "You see a list of all the data features that have been loaded.\n", "\n", "And a list of references to the API documentation, which tells you how you can use this data in your program statements." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Searching (revisited)\n", "\n", "We do the same search again, but now inside our program.\n", "\n", "That means that we can capture the results in a list for further processing. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1.70s 125111 results\n" ] } ], "source": [ "template = '''\n", "word sp=verb\n", " sign type=cons\n", " /with/\n", " .. unc=1|2|3|4\n", " /or/\n", " .. cor=1|2|3\n", " /or/\n", " .. rem=1|2\n", " /or/\n", " .. rec=1\n", " /-/\n", "'''\n", "results = A.search(template)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a few seconds, we have all the results!\n", "\n", "Let's look at the first one:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1607456, 1742)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each result is a list of numbers: for a \n", "\n", "1. word\n", "1. sign" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is the second one:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1607456, 1743)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here the last one:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2107836, 1430165)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are only interested in the words that we have encountered.\n", "We collect them in a set:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "37344" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "verbs = sorted({result[0] for result in results})\n", "len(verbs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This corresponds exactly to the number of condensed results!\n", "\n", "Now we get the number of verbs:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "58873" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(F.sp.s('verb'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In English: take feature `sp` (part-of-speech), and collect all nodes that have value `verb` for this feature.\n", "Then take the length of this list." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we want to find out something for each result verb: what is the accumulated uncertainty of that verb?\n", "Some verbs have more consonants than others, so we divide by the number of consonants.\n", "\n", "We define a function that collects the uncertainty of a single sign:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def getUncertainty(sign):\n", " return sum((\n", " F.unc.v(sign) or 0,\n", " F.cor.v(sign) or 0,\n", " F.rem.v(sign) or 0,\n", " 10 if F.rec.v(sign) else 0\n", " ))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see what this gives for the first sign in the 1000th result:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
י
type=cons
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sign = results[999][1]\n", "A.pretty(sign)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n" ] } ], "source": [ "unc = getUncertainty(sign)\n", "print(unc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An other one:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ו
type=cons
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "sign = results[12][1]\n", "A.pretty(sign)\n", "print(getUncertainty(sign))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we define a function that gives us the uncertainty of a word.\n", "We collect the consonants of the word.\n", "We sum the uncertainty of them and divide it by the number of consonants in the word." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def uncertainty(word):\n", " signs = L.d(word, otype='sign') # go a Level down to signs and collect them in a list\n", " return sum(getUncertainty(sign) for sign in signs) / len(signs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We compute the uncertainty of some verbs." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "verb = verbs[999]\n", "A.pretty(verb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the computation:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.0\n" ] } ], "source": [ "unc = uncertainty(verb)\n", "print(unc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An other one:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1.25\n" ] } ], "source": [ "verb = verbs[12]\n", "A.pretty(verb)\n", "print(uncertainty(verb))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We compute all word uncertainties and store them in a dictionary:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "37344" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "verbUncertainty = {verb: uncertainty(verb) for verb in verbs}\n", "len(verbUncertainty)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the minimum and the maximum uncertainty?" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max(verbUncertainty.values())" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.14285714285714285" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "min(verbUncertainty.values())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to visualize how many how uncertain verbs there are, we make a scatterplot,\n", "using the *seaborn* library." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(You might need to install the python package `seaborn`)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: seaborn in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (0.13.2)\n", "Requirement already satisfied: numpy!=1.24.0,>=1.20 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from seaborn) (1.26.4)\n", "Requirement already satisfied: pandas>=1.2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from seaborn) (2.2.2)\n", "Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from seaborn) (3.9.2)\n", "Requirement already satisfied: contourpy>=1.0.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.0)\n", "Requirement already satisfied: cycler>=0.10 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.54.1)\n", "Requirement already satisfied: kiwisolver>=1.3.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.7)\n", "Requirement already satisfied: packaging>=20.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (24.1)\n", "Requirement already satisfied: pillow>=8 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (10.4.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.1.4)\n", "Requirement already satisfied: python-dateutil>=2.7 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas>=1.2->seaborn) (2024.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas>=1.2->seaborn) (2024.1)\n", "Requirement already satisfied: six>=1.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.16.0)\n" ] } ], "source": [ "!pip install seaborn" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/nb/_qgnfkns75bcn_p_msyjl81m0000gn/T/ipykernel_55730/2177275149.py:2: UserWarning: \n", "\n", "`distplot` is a deprecated function and will be removed in seaborn v0.14.0.\n", "\n", "Please adapt your code to use either `displot` (a figure-level function with\n", "similar flexibility) or `histplot` (an axes-level function for histograms).\n", "\n", "For a guide to updating your code to use the new functions, please see\n", "https://gist.github.com/mwaskom/de44147ed2974457ad6372750bbe5751\n", "\n", " sns.distplot(list(verbUncertainty.values()), axlabel=\"uncertainty\")\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAG1CAYAAAD6GvACAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABaZUlEQVR4nO3deXwUVaI24Leql3RnaZJANohsgSRsAWMSZAQERHRUBkRGRUFWceR+MKKyZMZBxREUUBxBULyIiqBzVVbFkcF9gUDAcVAg7GHNAlk6Se9d9f3R6Zams5GtO6n3+dk2qTpVfepQCW/OOVUlyLIsg4iIiEihRH9XgIiIiMifGIaIiIhI0RiGiIiISNEYhoiIiEjRGIaIiIhI0RiGiIiISNEYhoiIiEjRGIaIiIhI0RiGiIiISNHU/q5ASUkJXn75ZXz99dcoLy9HUlISnnjiCaSlpVVZ/ty5c3juueewb98+BAcHY+zYsZg5cyZUKpWnzIYNG/DWW2+hsLAQvXv3xlNPPYWePXs2qJ6yLEOSWt/NukVRaJXHVV9sD19sE29sD19sE19sE2/+ag9RFCAIQq3l/B6GHn/8cRQWFuLll19G27ZtsX79ekydOhWbN29G165dvcra7XZMnToVnTt3xgcffIAzZ87gr3/9K0RRxKxZswAAmzdvxpIlS/Dcc8+hZ8+eWLNmDSZPnozPPvsMkZGR9a6nJMkoKqpo0LEGGrVaRERECIxGExwOyd/V8Tu2hy+2iTe2hy+2iS+2iTd/tkdkZAhUqtrDkF+HyXJzc/HDDz/gmWeeQVpaGrp06YK//e1viI6Oxvbt233Kf/7557hw4QKWLFmCxMREDB8+HI8//jjeeecd2Gw2AMDrr7+O8ePH4w9/+AO6deuGRYsWQa/X48MPP2zuwyMiIqIWwK9hKCIiAmvWrEGfPn08ywTB1aVlNBp9ymdnZ6NXr15o06aNZ9mNN96I8vJyHD58GJcvX8bp06cxYMAAz3q1Wo20tDTs27evaQ+GiIiIWiS/DpMZDAbcfPPNXss+//xz5Obm4i9/+YtP+by8PMTGxnoti46OBgBcvHgRarXrcOLi4nzKHDlypMH1Vatb13xzlUr0elc6tocvtok3tocvtokvtom3ltAefp8zdKUDBw4gMzMTI0aMwJAhQ3zWWywWGAwGr2VBQUEAAKvVCrPZDADQarU+ZaxWa4PqJooCIiJCGrSPQGUw6P1dhYDC9vDFNvHG9vDFNvHFNvEWyO0RMGFo165dePLJJ5Gamoply5ZVWUan03nmBrm5Q05wcDB0Oh0AVFlGr2/YX4IkyTAaTQ3aR6BRqUQYDHoYjWY4nZzkx/bwxTbxxvbwxTbxxTbx5s/2MBj0deqRCogw9N577+H555/H7bffjhdffNGnZ8ctNjYWR48e9VpWUFAAAIiJifEMjxUUFCAhIcGrTExMTIPr2VqvCnA6pVZ7bPXB9vDFNvHG9vDFNvHFNvEWyO3h9wG8jRs34rnnnsODDz6Il19+udogBADp6ek4dOgQysvLPcv27NmDkJAQJCcno23btujSpQuysrI86x0OB7Kzs5Gent6kx0FEREQtk1/D0KlTp7Bo0SLceuuteOSRR3Dp0iUUFhaisLAQZWVlsNlsKCws9Ax7DR8+HFFRUXjsscdw5MgR7Nq1Cy+//DKmTJniCVFTpkzBunXrsHnzZhw/fhx/+ctfYLFYMHbsWH8eKhEREQUovw6Tff7557Db7fj3v/+Nf//7317r7r77btx999146KGH8O6776J///4ICgrC//7v/+LZZ5/FvffeizZt2uCBBx7AjBkzPNvde++9KCsrwyuvvIKSkhL07t0b69ata9ANF4mIiKj1EmRZ5v3C68DplFrtHaiLiysCdhy3ObE9fLFNvLE9fLFNfLFNvPmzPVx3oK59EMzvc4aIiIiI/IlhiIiIiBSNYYiIiIgUjWGIiIiIFC0gbrpIREQthyAIV/z5t3f3cl6XQy0NwxAREdWZE4DFYvd8LYgCbJIJZosdsuQKQbogNVR+qh9RfTAMERFRnQiCAIvFjkOni2CvvERaJQrQ67Uwm21wSjI0ahE9O0ciVKdhDxG1GAxDRER0TewOCTa7E4ArDKk1rq+dEsMPtUycQE1ERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREiqb2dwWu9MYbb+D777/H+vXrq1y/YsUKrFy5ssp1Y8aMweLFiwEAkydPxo8//ui1PiMjo9r9EhERkXIFTBjasGEDXnnlFaSlpVVbZsqUKbj//vu9lq1btw7vv/8+Jk2a5FmWk5ODZ555BsOHD/cs02g0jV5nIiIiavn8Hoby8/Px9NNPIysrC507d66xbEhICEJCQjxfHzp0CO+++y6ee+45JCUlAQAuX76My5cvo2/fvoiKimrKqhMREVEr4Pc5Q7/++is0Gg22bduGvn37XtO2CxcuRFpaGu6++27PspycHAiCgC5dujR2VYmIiKgV8nvP0LBhwzBs2LBr3u6rr77CTz/9hC1btngtP3r0KMLCwrBw4UL88MMPCA4Oxu23344ZM2ZAq9U2qK5qtd+zY6NSqUSvd6Vje/him3hTensIAiCIAlSVLwAQRfGKdwkqUYAgClCrBciy4Mfa+o/Sz5OrtYT28HsYqq9169Zh6NCh6NGjh9fyo0ePwmq1IiUlBZMnT8bhw4exZMkSXLhwAUuWLKn354migIiIkNoLtkAGg97fVQgobA9fbBNvSm4Pm2SCXq+FWiN5LdfpXPMyNWoRep0W4eHB/qheQFHyeVKVQG6PFhmGLly4gKysLKxZs8Zn3cKFCzFv3jy0adMGAJCYmAiNRoPZs2dj7ty5aNeuXb0+U5JkGI2mBtU70KhUIgwGPYxGM5xOqfYNWjm2hy+2iTelt4cgAGaLHWazDTa7E4CrR0in08BisUOSJGg1KpgtNpSUyJBlP1fYT5R+nlzNn+1hMOjr1CPVIsPQrl27EBkZiZtuuslnnVqt9gQht+7duwMA8vLy6h2GAMDhaJ0ntdMptdpjqw+2hy+2iTeltocgCJAlGc7Kl4urHSRJ8iyXJRkOhwxZqWmoklLPk+oEcnsE7gBeDbKzs5GRkQG12jfLTZgwAZmZmV7LDh48CI1GU+vVakRERKQ8AR2GnE4nCgsLYbFYvJYfOnQIycnJVW5z2223YevWrXj//fdx9uxZ7NixA0uWLMHUqVMRGhraHNUmIiKiFiSgh8kuXryIW265BYsXL8aYMWM8ywsLCxEeHl7lNuPHj4cgCFi/fj0WLVqEqKgoTJo0CdOnT2+mWhMREVFLIshKH9StI6dTQlFRhb+r0ajUahERESEoLq4I2HHc5sT28MU28ab09hAEAeUWO34+fskzgVolCggODoLJZIVTkqHVqNC3WzuE6jSKnTOk9PPkav5sj8jIkDpNoA7oYTIiIiKipsYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKFlBh6I033sCECRNqLLNt2zYkJSX5vM6dO+cp89lnn+GOO+5ASkoKRo8ejd27dzd11YmIiKiFCpgwtGHDBrzyyiu1lsvJyUFGRga+//57r1dcXBwAYM+ePZgzZw7uv/9+bN68GQMGDMD06dNx4sSJJj4CIiIiaonU/q5Afn4+nn76aWRlZaFz5861lj969CiSkpIQFRVV5fo333wTw4cPx0MPPQQAmDdvHn766Se88847WLhwYWNWnYiIiFoBv/cM/frrr9BoNNi2bRv69u1ba/mcnBwkJCRUuU6SJBw4cAADBgzwWt6/f3/s27evUepLRERErYvfe4aGDRuGYcOG1alsaWkp8vPzkZ2djY0bN6K4uBgpKSmYM2cOunTpAqPRCJPJhNjYWK/toqOjkZeX1+C6qtV+z46NSqUSvd6Vju3hi23iTentIQiAIApQVb4AQBTFK94lqEQBgihArRYgy4Ifa+s/Sj9PrtYS2sPvYehaHDt2DAAgyzIWL14Mi8WC1atX44EHHsD27dvhcDgAAFqt1mu7oKAgWK3WBn22KAqIiAhp0D4ClcGg93cVAgrbwxfbxJuS28MmmaDXa6HWSF7LdToNAECjFqHXaREeHuyP6gUUJZ8nVQnk9mhRYSgtLQ27d+9GREQEBMH1G8fKlSsxZMgQbNq0CX/84x8BADabzWs7q9UKvb5hfwmSJMNoNDVoH4FGpRJhMOhhNJrhdEq1b9DKsT18sU28Kb09BAEwW+wwm22w2Z0AXD1COp0GFosdkiRBq1HBbLGhpESGLPu5wn6i9PPkav5sD4NBX6ceqRYVhgAgMjLS62u9Xo/4+Hjk5+cjPDwcwcHBKCgo8CpTUFCAmJiYBn+2w9E6T2qnU2q1x1YfbA9fbBNvSm0PQRAgSzKclS8XVztIkuRZLksyHA4ZslLTUCWlnifVCeT2CNwBvCr885//RP/+/WEy/dZDU15ejtOnT6Nbt24QBAGpqanYu3ev13ZZWVlIS0tr7uoSERFRCxDQYcjpdKKwsBAWiwUAMHjwYEiShLlz5+LYsWM4ePAgZs6cicjISIwZMwYAMHnyZHz66adYt24dTpw4gSVLluDw4cOYOHGiPw+FiIiIAlRAh6GLFy9i4MCB2LFjBwAgLi4Ob7/9NkwmE8aNG4dJkyYhLCwM7777LoKCggAAAwcOxKJFi/D+++/j7rvvxp49e/D6669Xezk+ERERKZsgK31Qt46cTglFRRX+rkajUqtFRESEoLi4ImDHcZsT28MX28Sb0ttDEASUW+z4+fglzwRqlSggODgIJpMVTkmGVqNC327tEKrTKHbOkNLPk6v5sz0iI0PqNIE6oHuGiIiIiJoawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESlawIWhN954AxMmTKixzLFjxzB9+nT0798fAwYMwKxZs3DhwgXPeqfTiZSUFCQlJXm9VqxY0dTVJyIiohZG7e8KXGnDhg145ZVXkJaWVm2Z4uJiTJ48GampqVi/fj1sNhteeOEFTJs2DZs3b0ZQUBBOnz4Nq9WKrVu3om3btp5tg4ODm+MwiIiIqAUJiDCUn5+Pp59+GllZWejcuXONZXft2gWTyYQlS5ZAp9MBAJYuXYohQ4bgwIEDGDBgAHJychAaGork5ORmqD0RERG1ZAExTPbrr79Co9Fg27Zt6Nu3b41lBwwYgFWrVnmCEACIouswjEYjACAnJwcJCQlNV2EiIiJqNQKiZ2jYsGEYNmxYncrGx8cjPj7ea9maNWug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b0dmZqZnm4EDB2LRokVYtWoVli9fjm7duuH111/3uhyfiIiIyK1eYSg2Nrbej9yoyQsvvOD1dXx8PHJycryWtW3bFq+++mqN+xk9enSTXM1GRERErU+9wtDixYsbux5EREREflHvmy4CrqvKfvjhBxQUFGDChAk4e/YskpOTERoa2lj1IyIiImpS9QpDkiRhwYIF+PjjjyHLMgRBwO9//3usWrUKZ86cwXvvvdckw2hEREREja1eV5OtWrUK27dvx9///nf88MMPnntJzJkzB5IkYfny5Y1aSSIiIqKmUq8w9PHHH2PWrFm45557EB4e7lneo0cPzJo1Cz/88ENj1Y+IiIioSdUrDF26dAk9evSocl1MTAyMRmODKkVERETUXOoVhjp16oRvvvmmynV79+5Fp06dGlQpIiIiouZSrwnUEydOxIIFC2C32zF06FAIgoDc3FxkZWXhrbfewvz58xu7nkRERERNol5h6I9//COKioqwevVqbNy4EQDw+OOPQ6PRYNq0aRg3blyjVpKIiIioqdT7PkMPP/wwRo4cib1790KtViMsLAx9+/b1mlBNREREFOiuOQx98skn+OCDD/Dzzz/D4XAAAHQ6HVJTUzFu3DgMHz680StJRERE1FTqHIacTieeeOIJ/Otf/0JMTAzuvPNOtGvXDrIsIy8vD3v37sXMmTMxatQon2eMEREREQWqOoehjRs3YufOnfjrX/+K8ePHQxAEr/VOpxMffPABFi1ahLS0NIwdO7bRK0tERETU2Op8af2WLVtw//33Y8KECT5BCABUKhUefPBB3Hvvvdi8eXOjVpKIiIioqdQ5DJ06dQqDBw+utdygQYNw9OjRBlWKiIiIqLnUOQyZzWa0adOm1nIRERGoqKhoUKWIiIiImkudw5Asy1CpVLXvUBQ9D24lIiIiCnT1ehwHERERUWtxTfcZeuaZZxAaGlpjmfLy8gZViIiIiKg51TkMpaenA0CtQ2AhISFIS0trWK2IiIiImkmdw9D69eubsh5EREREfsE5Q0RERKRoDENERESkaAxDREREpGgMQ0RERKRoDENERESkaAxDREREpGgMQ0RERKRoDENERESkaAxDREREpGgMQ0RERKRoDENERESkaAxDREREpGgMQ0RERKRodX5qfVORJAkrV67Ehx9+iLKyMqSnp2PBggW47rrrfMquWLECK1eurHI/Y8aMweLFiwEAkydPxo8//ui1PiMjA+vXr2/8AyAiIqIWze9haNWqVdi4cSNeeOEFxMbGYunSpZg2bRq2b98OrVbrVXbKlCm4//77vZatW7cO77//PiZNmuRZlpOTg2eeeQbDhw/3LNNoNE16HERERNQy+TUM2Ww2vPXWW3jyyScxZMgQAMDy5csxaNAg7Ny5E3fddZdX+ZCQEISEhHi+PnToEN59910899xzSEpKAgBcvnwZly9fRt++fREVFdVsx0JEREQtk1/nDB05cgQVFRUYMGCAZ5nBYEDPnj2xb9++WrdfuHAh0tLScPfdd3uW5eTkQBAEdOnSpUnqTERERK2LX3uG8vLyAABxcXFey6Ojoz3rqvPVV1/hp59+wpYtW7yWHz16FGFhYVi4cCF++OEHBAcH4/bbb8eMGTN8ht2ulVrduuabq1Si17vSsT18sU28Kb09BAEQRAGqyhcAiKJ4xbsElShAEAWo1QJkWfBjbf1H6efJ1VpCe/g1DJnNZgDwCSlBQUEoLS2tcdt169Zh6NCh6NGjh9fyo0ePwmq1IiUlBZMnT8bhw4exZMkSXLhwAUuWLKl3XUVRQERESO0FWyCDQe/vKgQUtocvtok3JbeHTTJBr9dCrZG8lut0rnmZGrUIvU6L8PBgf1QvoCj5PKlKILeHX8OQTqcD4Jo75P4zAFitVuj11TfahQsXkJWVhTVr1visW7hwIebNm4c2bdoAABITE6HRaDB79mzMnTsX7dq1q1ddJUmG0Wiq17aBSqUSYTDoYTSa4XRKtW/QyrE9fLFNvCm9PQQBMFvsMJttsNmdAFw9QjqdBhaLHZIkQatRwWyxoaREhiz7ucJ+ovTz5Gr+bA+DQV+nHim/hiH38FhBQQE6duzoWV5QUOCZEF2VXbt2ITIyEjfddJPPOrVa7QlCbt27dwfgGparbxgCAIejdZ7UTqfUao+tPtgevtgm3pTaHoIgQJZkOCtfLq52kCTJs1yWZDgcMmSlpqFKSj1PqhPI7eHXAbzk5GSEhoYiKyvLs8xoNOLQoUNIT0+vdrvs7GxkZGRArfbNchMmTEBmZqbXsoMHD0Kj0aBz586NVnciIiJqHfzaM6TVajF+/HgsW7YMkZGR6NChA5YuXYrY2FiMGDECTqcTRUVFCAsL8xpGO3ToEO65554q93nbbbdh0aJFSElJwcCBA3Hw4EEsWbIEU6dORWhoaHMdGhEREbUQfr/p4qxZs+BwOPDUU0/BYrEgPT0da9euhUajwblz53DLLbdg8eLFGDNmjGebwsJChIeHV7m/8ePHQxAErF+/HosWLUJUVBQmTZqE6dOnN9MRERERUUsiyEof1K0jp1NCUVGFv6vRqNRqERERISgurgjYcdzmxPbwxTbxpvT2EAQB5RY7fj5+yTOBWiUKCA4OgslkhVOSodWo0LdbO4TqNIqdM6T08+Rq/myPyMiQOk2gDtyL/omIiIiaAcMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKRrDEBERESkawxAREREpGsMQERERKZra3xUgIqKWSZZlHDtbCqtTRo/r2gCC4O8qEdULwxAREV0zs9WBHw7m4cKlCgDAhcJy3NyvPbQalZ9rRnTtOExGRETXxGJz4JMfc3HhUgVUogC1SsT5wgp8uf887A7J39UjumYMQ0REdE2O5BbDbHUgVK/ByJs6Y+SgLtCoReQVmXDw5GV/V4/omjEMERFRnTmdEg6dLgYA9O3WFhFhQWjfLhQDesUAAHJyiyFJsj+rSHTNGIaIiKjO/nP8EkwWB3RaFTrHhXmWd4oNg1YjosLiwOHcYj/WkOjaMQwREVGdff3TeQBAUsdwqMTf/glRq0QktG8DAPjxl4t+qRtRfTEMERFRnZy8UIrTF8sgigISrwv3Wd893hWGfjlZhNJyazPXjqj+GIaIiKhO9h4uAAB0iTNAH+R7Z5bwsCBER+ghSTK+P8jeIWo5GIaIiKhOfj1VBADoGBNabZmkjuEAgOwjBc1RJaJG4fcwJEkSXn31VQwaNAj9+vXDww8/jLNnz1Zbftu2bUhKSvJ5nTt3zlPms88+wx133IGUlBSMHj0au3fvbo5DISJqtUrKrThXWA4BQIeokGrLxUe7glJuXhnKzfZmqh1Rw/g9DK1atQobN27Ec889hw8++ACSJGHatGmw2WxVls/JyUFGRga+//57r1dcXBwAYM+ePZgzZw7uv/9+bN68GQMGDMD06dNx4sSJ5jws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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.set(color_codes=True)\n", "sns.distplot(list(verbUncertainty.values()), axlabel=\"uncertainty\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's single out the verbs with uncertainty greater than 9, but lower than 10, and inspect a few." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "verbHighUnc = [verb for (verb, unc) in verbUncertainty.items() if 9 < unc < 10]\n", "len(verbHighUnc)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

result 1" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 2" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 3" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 4" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 5" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

word הלך
verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 6" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 7" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 8" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 9" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

word בנו
verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 10" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A.show([[verb] for verb in verbHighUnc], fmt='layout-orig-full', condenseType='word')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.4" } }, "nbformat": 4, "nbformat_minor": 4 }