{ "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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have followed the installation instructions, you are set.\n", "Go to the browser window that opened when you gave the command `jupyter notebook` in your terminal.\n", "\n", "Then continue reading, and, ... executing.\n", "\n", "You can execute a cell by putting your cursor inside it and pressing `Shift Enter`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we load the Text-Fabric module, as follows:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import seaborn as sns\n", "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": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "TF-app: ~/github/annotation/app-dss/code" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/github/etcbc/dss/tf/0.6" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "data: ~/github/etcbc/dss/parallels/tf/0.6" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Text-Fabric: Text-Fabric API 8.3.0, app-dss, Search Reference
Data: DSS, Character table, Feature docs
Features:
Parallel Passagessim
Dead Sea Scrollsafter
alt
biblical
book
chapter
cl
cl2
cor
fragment
full
fulle
fullo
glex
glexe
glexo
glyph
glyphe
glypho
gn
gn2
gn3
halfverse
intl
lang
lex
lexe
lexo
line
md
merr
morpho
nu
nu2
nu3
otype
ps
ps2
ps3
punc
punce
punco
rec
rem
script
scroll
sp
srcLn
st
type
unc
vac
verse
vs
vt
occ
oslots
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Text-Fabric API: names N F E L T S C TF directly usable

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = use(\"dss:clone\", checkout=\"clone\", hoist=globals())\n", "# A = use('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": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 4.47s 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 less than five seconds, we have all the results!\n", "\n", "Let's look at the first one:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1607456, 1742)" ] }, "execution_count": 4, "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": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1607456, 1743)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here the last one:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2107836, 1430165)" ] }, "execution_count": 6, "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": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "37344" ] }, "execution_count": 7, "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": 8, "metadata": { "lines_to_next_cell": 2 }, "outputs": [ { "data": { "text/plain": [ "58873" ] }, "execution_count": 8, "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": { "lines_to_next_cell": 2 }, "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": 9, "metadata": {}, "outputs": [], "source": [ "def getUncertainty(sign):\n", " return sum(\n", " (\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", " )\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": 10, "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": 11, "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": 12, "metadata": { "lines_to_next_cell": 2 }, "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": { "lines_to_next_cell": 2 }, "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": 13, "metadata": {}, "outputs": [], "source": [ "def uncertainty(word):\n", " signs = L.d(\n", " word, otype=\"sign\"\n", " ) # 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": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
sp=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": 15, "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": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
sp=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": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "37344" ] }, "execution_count": 17, "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": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14.0" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max(verbUncertainty.values())" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.14285714285714285" ] }, "execution_count": 19, "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": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deVhU59038O8szOAwCEIOE9xi3IlLtNFqrTVJIyKy1SVvVRJrrCSaxaemWomaR0Ji0ldJzIZpYnolV6t9DKkRg48vWpO3zdNg86JJEA0m1h2QRUBggBlmud8/RkZZlBkcZhjO93NdXnKWOfObW/yec+455z4KIYQAERH1ekpfF0BERN7BwCcikgkGPhGRTDDwiYhkgoFPRCQTDHwiIplwKfDffvttxMXFIS4uDlu2bGm3vKioCPPnz0dMTAw2bNgAq9UKACgtLUVycjJmz56NlStXoqGhwbPVExGRyzoN/Ly8PPzzn//E3r17kZ2djZMnT+Jvf/tbq3XWrl2L559/HgcPHoQQAllZWQCAF154AYsXL0Zubi7Gjh2L7du3d8+nICKiTqk7W0GSJKSmpkKj0QAAhg0bhtLSUufykpISmEwmTJgwAQAwb948vPnmm3j44YeRn5+PzMxM5/xHHnkEa9eudbm4mpoG2O09576w8HA9qqqMvi7Dbazb+/y1dtbtXZ6uW6lUoF+/oJsu7zTwR4wY4fz5/PnzOHDgAHbv3u2cV1FRAUmSnNOSJKG8vBw1NTXQ6/VQq9Wt5rvDbhc9KvAB9Lh6XMW6vc9fa2fd3uXNujsN/BanT5/GE088gXXr1mHIkCHO+R2NzKBQKG463x3h4Xq31vcGSQr2dQldwrq9z19rZ93e5c26XQr8Y8eOYdWqVVi/fj3i4uJaLTMYDLhy5YpzurKyEhEREQgLC4PRaITNZoNKpXLOd0dVlbFH7bUlKRiVlfW+LsNtrNv7/LV21u1dnq5bqVTc8kC50y9tL1++jKeeegoZGRntwh4ABgwYAK1Wi2PHjgEAsrOzMWPGDAQEBGDSpEk4cOBAq/lEROQbnR7h//GPf4TZbMbvf/9757yFCxfi888/x6pVqzBu3DhkZGRg48aNaGhowD333IMlS5YAADZt2oTU1FS88847iIyMxGuvvdZ9n4SIiG5J0ZOHR2aXjmewbu/z19pZt3f1uC4dIiLqHRj4REQy4fJlmUTU+1jtgNlidU6L6kY0mq3QBqih5uFgr8PAJ5Ixs8WK/KLrN0QG6wNRbzRhcpQBai3jobfhPpyISCYY+EREMsHAJyKSCQY+EZFMMPCJiGSCgU9EJBMMfCIimWDgExHJBAOfiEgmGPhERDLBwCcikgkGPhGRTDDwiYhkgoFPRCQTLo9/ajQasXDhQvzhD3/AwIEDnfOLioqQmprqnK6urkZISAj279+P7OxsZGRkIDw8HADwwAMPYPXq1R4sn4iIXOVS4BcUFGDjxo04f/58u2VRUVHYt28fAKCpqQkPP/ww0tLSAACFhYVITU1FfHy8xwomIqKucalLJysrC5s2bUJERMQt13v33XcxefJkTJo0CYAj8LOzs5GYmIg1a9agtrb29ismIqIucSnwN2/e7Azxm6mrq0NWVhaefvpp5zxJkvDMM89g3759iIyMRHp6+u1VS0REXeaxZ5jl5ORg5syZzv56AMjMzHT+vHz5csycOdOtbYaH6z1VnsdIUrCvS+gS1u19/lC7qG5EsD6w1bxgfSB0Oi2kMJ2Pquoaf2jvjnizbo8F/uHDh/HEE084p+vr67Fnzx4sXboUACCEgFrt3ttVVRlhtwtPlXjbJCkYlZX1vi7Dbazb+/yl9kazFfVGk3O65Zm2jY1mVNpsPqzMPf7S3m15um6lUnHLA2WPXJYphMDJkycxceJE5zydTof3338fBQUFAICdO3ciOjraE29HRERd0OXAT0lJQWFhIQDHpZgBAQHQarXO5SqVCq+//jrS0tIQGxuLkydPYu3atbdfMRERdYlCCNFz+kzaYJeOZ7Bu7/OX2hvMVuQXlTunW7p0JkcZEKT1WI9vt/OX9m7LL7t0iIio52PgExHJBAOfiEgmGPhERDLBwCcikgkGPhGRTDDwiYhkgoFPRCQTDHwiIplg4BMRyQQDn4hIJhj4REQywcAnIpIJBj4RkUww8ImIZIKBT0QkEwx8IiKZYOATEcmEy4FvNBoRHx+P4uLidsvefvttPPjgg0hKSkJSUhJ27doFACgqKsL8+fMRExODDRs2wGq1eq5yIiJyi0uBX1BQgEWLFuH8+fMdLj9x4gRee+017Nu3D/v27UNycjIAYO3atXj++edx8OBBCCGQlZXlscKJiMg9LgV+VlYWNm3ahIiIiA6XnzhxAjt27EBCQgLS09NhNptRUlICk8mECRMmAADmzZuH3Nxcz1VORERucSnwN2/ejEmTJnW4rKGhAVFRUVi3bh327t2Luro6bN++HRUVFZAkybmeJEkoLy/3TNVEROQ29e1uICgoCDt27HBOL1u2DOvXr8f999/fbl2FQuHWtsPD9bdbnsdJUrCvS+gS1u19/lC7qG5EsD6w1bxgfSB0Oi2kMJ2Pquoaf2jvjniz7tsO/NLSUuTl5WHBggUAACEE1Go1DAYDrly54lyvsrLypl1CN1NVZYTdLm63RI+RpGBUVtb7ugy3sW7v85faG81W1BtNzulgfSDqjSY0NppRabP5sDL3+Et7t+XpupVKxS0PlG/7sszAwEBs3boVly5dghACu3btQnR0NAYMGACtVotjx44BALKzszFjxozbfTsiIuqiLgd+SkoKCgsLERYWhvT0dKxcuRKzZ8+GEAKPPfYYACAjIwOvvPIKYmNj0dTUhCVLlniscCIico9CCNFz+kzaYJeOZ7Bu7/OX2hvMVuQXXb+YoqVLZ3KUAUHa2+7x9Rp/ae+2/K5Lh4iI/AMDn4hIJhj4REQywcAnIpIJBj4RkUww8ImIZIKBT0QkEwx8IiKZYOATEckEA5+ISCYY+EREMsHAJyKSCQY+EZFMMPCJiGSCgU9EJBMMfCIimWDgExHJhMuBbzQaER8fj+Li4nbLDh8+jKSkJCQmJuLJJ59EbW0tAMdzbKdPn46kpCQkJSVh27ZtnquciIjc4tIzzAoKCrBx40acP3++3TKj0Yi0tDTs2bMHBoMBb7zxBt566y1s3LgRhYWFSE1NRXx8vKfrJiIiN7l0hJ+VlYVNmzYhIiKi3TKLxYK0tDQYDAYAwKhRo3D58mUAQGFhIbKzs5GYmIg1a9Y4j/yJiMj7XAr8zZs3Y9KkSR0u69evH2bOnAkAMJlMeO+995zTkiThmWeewb59+xAZGYn09HQPlU1ERO7y2GPp6+vr8eSTT2L06NGYO3cuACAzM9O5fPny5c4dgatu9fR1X5GkYF+X0CWs2/v8oXZR3YhgfWCrecH6QOh0WkhhOh9V1TX+0N4d8WbdHgn8iooK/PrXv8bUqVOxfv16AI4dwJ49e7B06VIAgBACarV7b1dVZYTdLjxRokdIUjAqK+t9XYbbWLf3+UvtjWYr6o0m53SwPhD1RhMaG82otNl8WJl7/KW92/J03Uql4pYHyrd9WabNZsOKFSsQGxuLDRs2QKFQAAB0Oh3ef/99FBQUAAB27tyJ6Ojo2307IiLqoi4f4aekpGDVqlUoKyvDd999B5vNhoMHDwIAxo4di82bN+P1119HWloaTCYThgwZgi1btniscCIico9CCNFz+kzaYJeOZ7Bu7/OX2hvMVuQXlTunW7p0JkcZEKT12Fd83c5f2rstv+vSISIi/8DAJyKSCQY+EZFMMPCJiGSCgU9EJBMMfCIimWDgExHJBAOfiEgmGPhERDLBwCcikgkGPhGRTDDwiYhkgoFPRCQTDHwiIplg4BMRyQQDn4hIJhj4REQywcAnIpIJlwLfaDQiPj4excXF7ZYVFRVh/vz5iImJwYYNG2C1WgEApaWlSE5OxuzZs7Fy5Uo0NDR4tnIiInJLp4FfUFCARYsW4fz58x0uX7t2LZ5//nkcPHgQQghkZWUBAF544QUsXrwYubm5GDt2LLZv3+7RwomIyD2dBn5WVhY2bdqEiIiIdstKSkpgMpkwYcIEAMC8efOQm5sLi8WC/Px8xMTEtJpPRES+0+lj6Tdv3nzTZRUVFZAkyTktSRLKy8tRU1MDvV4PtVrdaj4REflOp4F/K0KIdvMUCsVN57srPFzfpbq6kyQF+7qELmHd3ucPtYvqRgTrA1vNC9YHQqfTQgrT+aiqrvGH9u6IN+u+rcA3GAy4cuWKc7qyshIREREICwuD0WiEzWaDSqVyzndXVZURdnv7nYevSFIwKivrfV2G21i39/lL7Y1mK+qNJud0sD4Q9UYTGhvNqLTZfFiZe/ylvdvydN1KpeKWB8q3dVnmgAEDoNVqcezYMQBAdnY2ZsyYgYCAAEyaNAkHDhxoNZ+IiHynS4GfkpKCwsJCAEBGRgZeeeUVxMbGoqmpCUuWLAEAbNq0CVlZWZgzZw6OHj2K3/zmN56rmoiI3KYQHXW49xDs0vEM1u19/lJ7g9mK/KLrF1S0dOlMjjIgSHtbPb5e5S/t3ZZfdekQEZH/YOATEckEA5+ISCYY+EREMsHAJyKSCQY+EZFMMPCJiGSCgU9EJBMMfCIimWDgExHJBAOfiEgmGPhERDLBwCcikgkGPhGRTDDwiYhkgoFPRCQTDHwiIplg4BMRyYRLzzDLycnBO++8A4vFgqVLlyI5Odm5rKioCKmpqc7p6upqhISEYP/+/cjOzkZGRgbCw8MBAA888ABWr17t4Y9ARESu6DTwy8vLsW3bNnzyySfQaDRYuHAhpkyZguHDhwMAoqKisG/fPgBAU1MTHn74YaSlpQEACgsLkZqaivj4+O77BERE5JJOu3Ty8vIwdepUhIaGQqfTISYmBrm5uR2u++6772Ly5MmYNGkSAEfgZ2dnIzExEWvWrEFtba1nqyciIpd1GvgVFRWQJMk5HRERgfLy8nbr1dXVISsrC08//bRzniRJeOaZZ7Bv3z5ERkYiPT3dQ2UTEZG7Ou3SEUK0m6dQKNrNy8nJwcyZM5399QCQmZnp/Hn58uWYOXOmW8WFh+vdWt8bJCnY1yV0Cev2Pn+oXVQ3Ilgf2GpesD4QOp0WUpjOR1V1jT+0d0e8WXengW8wGHD06FHndEVFBSIiItqtd/jwYTzxxBPO6fr6euzZswdLly4F4NhxqNUufUfsVFVlhN3efofjK5IUjMrKel+X4TbW7X3+Unuj2Yp6o8k5HawPRL3RhMZGMyptNh9W5h5/ae+2PF23Uqm45YFyp10606ZNw5EjR1BdXY2mpiYcOnQIM2bMaLWOEAInT57ExIkTnfN0Oh3ef/99FBQUAAB27tyJ6Ojorn4OIiK6TS4d4a9evRpLliyBxWLBggULMH78eKSkpGDVqlUYN24cqqurERAQAK1W63ydSqXC66+/jrS0NJhMJgwZMgRbtmzp1g9DREQ3pxAdddL3EOzS8QzW7X3+UnuD2Yr8ousXYbR06UyOMiBI614XrC/5S3u31eO6dIiIqHdg4BMRyQQDn4hIJhj4REQywcAnIpIJBj4RkUww8ImIZIKBT0QkEwx8IiKZYOATEckEA5+ISCYY+EREMsHAJyIAgL3njqNIHsLAJyKcv1yHjz77Ny6U1fm6FOpGDHwimbNY7cg/VQmL1Y7cI+dRUdPk65KomzDwiWTu5LlqNJmteGBifwT1CcDnx4pReqXB12VRN2DgE8lYTb0JJ89VY8idwRhsCEbiz4ZBrVIic08h6hqbfV0eeRgDn0jGPv3neQgAPxolAQD6BmnwwMT+qGtsxjc/VPq2OPI4lwI/JycHc+bMQXR0NHbt2tVu+dtvv40HH3wQSUlJSEpKcq5TVFSE+fPnIyYmBhs2bIDVavVs9UTUZecu1+HoqQqMGdIP+j4BzvnhIYHoF6zF8TNVPqyOukOnD60sLy/Htm3b8Mknn0Cj0WDhwoWYMmUKhg8f7lznxIkTeO211zBx4sRWr127di1eeuklTJgwAevXr0dWVhYWL17s+U9BRG7718lyBKiUGDs0vNV8hUKBMXeHIf9UBaw2O9QqdgT0Fp3+S+bl5WHq1KkIDQ2FTqdDTEwMcnNzW61z4sQJ7NixAwkJCUhPT4fZbEZJSQlMJhMmTJgAAJg3b1671xGR7xRdqMHQAX0RoG4fA/cMCYO52YbTl676oDLqLp0GfkVFBSRJck5HRESgvPz6U+4bGhoQFRWFdevWYe/evairq8P27dvbvU6SpFavIyLfqWtsRnGlESMHhXa4fOSgUKhVChSerfZyZdSdOu3SER3cfadQKJw/BwUFYceOHc7pZcuWYf369bj//vtv+TpXhIfr3VrfGyQp2NcldAnr9r6eXPv3BSUAgPEjInDVaG61LFgfiH6hOowdegdOXqjp0Z/jRv5SZ1verLvTwDcYDDh69KhzuqKiAhEREc7p0tJS5OXlYcGCBQAcOwi1Wg2DwYArV64416usrGz1OldUVRlht/ec270lKRiVlfW+LsNtrNv7enrtXxVeRqBGBSlEi0tltc75wfpA1BtNaGw0Y/SgEOz+vBJF/67AHSF9fFht53p6e9+Mp+tWKhW3PFDutEtn2rRpOHLkCKqrq9HU1IRDhw5hxowZzuWBgYHYunUrLl26BCEEdu3ahejoaAwYMABarRbHjh0DAGRnZ7d6HRH5TtH5aowaFAqV8uZn3eOGOb7MZbdO79Fp4BsMBqxevRpLlizBL37xC8THx2P8+PFISUlBYWEhwsLCkJ6ejpUrV2L27NkQQuCxxx4DAGRkZOCVV15BbGwsmpqasGTJkm7/QER0a9V1JpTXNCHqrn63XO/OMB3uCAlEIS/P7DU67dIBgISEBCQkJLSad2O/fUxMDGJiYtq9bvTo0fjrX/96myUSkScVXagBAIzuJPAVCgXGDQtHXmEZLFZ7h1fzkH/hvyCRzJy6UAN9nwAMjOj8oojxQ8NhtthwupiXZ/YGDHwiGRFCoOhiDUYPDoXShavmRgwMhQLAv0tqO12Xej4GPpGMVFxtQnWdudP++xa6QDX63xGEs6UcJ783YOATyYir/fc3Gtq/L86U1HZ4Tw75FwY+kYz8u7gWfXUBuDNM5/Jrhg0IQYPJygej9AIMfCIZOVNah2EDQty6631o/77XXst+fH/HwCeSCWOTBeXVjc4Ad1X/8CAEalQ4w358v8fAJ5KJli9eh/UPcet1SqUCd0f25Re3vQADn0gmzpbWQqEAhkS6P1jXsAF9UVxhhNli64bKyFsY+EQycaa0DgMlPQI1Lt1g38rQ/iGw2QUulPnfAGV0HQOfSAbsQuBsaR2Gudl/36Kl35/dOv6NgU8kA2VVjWgyWzHUzf77Fn11GkSE9uGVOn6OgU8kAy1BPWxA147wAWDoAH5x6+8Y+EQycLa0DjqtGgY3brhqa1j/ENTUm1FdZ/JgZeRNDHwiGThTUoeh/fu6NGDazVy/AYtH+f6KgU/UyzWZrSi5YnT7hqu2BkXooVErOVSyH2PgE/Vy58vqIYRjTJzboVYpMbR/X5wu5he3/oqBT9TLnb32he3dkbd3hA84xse/VG6Eqdl629si73Mp8HNycjBnzhxER0dj165d7ZYfPnwYSUlJSExMxJNPPonaWscvWHZ2NqZPn46kpCQkJSVh27Ztnq2eiDr1/aWriAzXQd8n4La3NWJgiPOafvI/nd5yV15ejm3btuGTTz6BRqPBwoULMWXKFAwfPhwAYDQakZaWhj179sBgMOCNN97AW2+9hY0bN6KwsBCpqamIj4/v9g9CRO1ZbXacvlSLaePu9Mj2HCNtAqeLa3HPkDCPbJO8p9Mj/Ly8PEydOhWhoaHQ6XSIiYlBbm6uc7nFYkFaWhoMBgMAYNSoUbh8+TIAoLCwENnZ2UhMTMSaNWucR/5E5B0XyuphttgwerDrDzy5lT5aNQZJen5x66c6PcKvqKiAJEnO6YiICBw/ftw53a9fP8ycORMAYDKZ8N577+HRRx8FAEiShMcffxzjx4/Ha6+9hvT0dLz66qsuFxce3vlDlr1NktwfeKonYN3e1xNq//txx8HXTycORIhe2265qG5EsD6w1bxgfSB0Oi2km1yzP36EhMP5FxEWFgSVqud8DdgT2rsrvFl3p4Hf0WPNOnp4Qn19PZ588kmMHj0ac+fOBQBkZmY6ly9fvty5Y3BVVZURdnvPeayaJAWjstL/Bo9i3d7XU2o/VlSOAVIQmpuaUdnU3G55o9mKeuP1G6mC9YGoN5rQ2GhGpa3jkTEH3qGDqdmGr7+7jCF33v4XwZ7QU9rbXZ6uW6lU3PJAudPds8FgwJUrV5zTFRUViIiIaLVORUUFFi9ejNGjR2Pz5s0AHDuADz/80LmOEAJqtfuj9BFR11htdpwuvorRgzzTndNi+LXLO09fYhetv+k08KdNm4YjR46guroaTU1NOHToEGbMmOFcbrPZsGLFCsTGxmLDhg3Oo3+dTof3338fBQUFAICdO3ciOjq6mz4GEbV17nIdmi12jL4r1KPbDesbiDtCAtmP74c6PeQ2GAxYvXo1lixZAovFggULFmD8+PFISUnBqlWrUFZWhu+++w42mw0HDx4EAIwdOxabN2/G66+/jrS0NJhMJgwZMgRbtmzp9g9ERA6nLjoCeeQgzwY+4Lg887vzNRBCuPV8XPItl/pYEhISkJCQ0Grejh07AADjxo3DqVOnOnzdpEmTsHfv3tsskYi64tSFGgyU9AjWaTy+7REDQ3HkZDkqrzYhol/XB2Qj7+o5X7ETkcdYrHacKanF6MGeP7oHHEf4APAD+/H9CgOfqBc6d7kOzVY7Rt/l2S9sW0TeEYQQvQYFZ650vjL1GAx8ol7o1MUaKNA9/fcAoFQo8KMREgrPVqGZDzb3Gwx8ol7omx+uYEhksEfGz7mZH42U0Gyx4+S56m57D/IsBj5RL1NcacSF8npMHeOZ8XNuZtTgUOi0anz9Q2W3vg95DgOfqJfJO1EGlVKBKVGGbn0ftUqJe4ffgW//fQVWm71b34s8g4HvQVY70GC2tvtj5f8F8hK7XeDIyTKMGxqOvkGevxyzrftGSWgwWfHDJd6E5Q841oEHmS1W5BeVt5s/OcoAtZZNTd3vu/PVqDU2Y9rY7u3OaTHm7jBo1Ep8/UMlh0v2AzzCJ+pF8k6UIShQjXuH3+GV99MGqDB2aDi+/qES9g4GWqSehYFP1Es0ma34+odK/DjKgAC19/5r3zdSwlVjM85d5lOwejoGPlEvcfRUBZqtdq9157S4d3g4VEoFviws8+r7kvvYsexBzVYbLlc14MpVEyprTTA2NkMAOJR/CQEqJQxhOkSG6zBA0mPYgL4ICQqEFw/EqBezWO04dPQSDGE6DO3v3THqdYEB+Nn4SPxPQSlipwyGFNrHq+9PrmPge0B5dSP+7zcl+Ofxy2g0WwEAfXUBCNFroVQAIcFaXLnahO/OV+PoqQoAgEIBDOsfgnHDwjF+aDgGG/QcdZC67NMvz6GksgGrFoz3ye9Rwk/vxpcnypD9P+eQknCP19+fXMPA7wKr3XFFzuWqBuz/8jyOn6mCUqnA+GHhCAvWQurXB9oAlXP9e0dKKLh2c0qzxYaqOhMuX2lEbUMz9n5xFnu/OIt+wVqMGxqOMXeHYdTgUPTthhEOqXc6U1qLA/+6gOnjIjHBS1/WttUvWIuH7huIg19dROzUwRgo9bzHkxIDv0vKqhvwp/9zCmdKaqFWKzF+WDhGDgrFT8ZHOoP9ZjQBKkSGByEyPAiTowywWu0oPFOFgjNX8P+KyvFFQSkAYKAUhCGRfTEoQo/BEXpIoX0QotdApXS9D6hlxySqG51nHgCgDVCzK6mXaLbY8Mf9RegXrMXCh0b4tJY5U+/CP74twd4vzuKZ+eN9Wgt1jIHvhkaTBZ98cQYHv7oEm11g9F39MG5YGAI1XWtGhVIBtVqJiaMkTBwlwWYXuFRej7Oldfjh0lUU/PsK/nntIdSAoxuor04DXaAaWo0K2gAVVColAlRKqJQKKBSA4tqKSgVgswvU1JuhCVDBZrNDqVRApVRgYIQeOq0aAWrHawPULX9UCFAroVEroQlwbF8boIQuMAB9tCq3djbU/ZotNvz50Pcoq27Eb385AbpA3/531vcJwOwfD8be/zmHMyW1GHbtUYjUczDwXWCx2vHP46XIOXIBV+vNuG+UhLsMwdDrbm9gKrPF1uEZwc/vG4iEaUMghMBVYzOKK42oqjOhoqYJp4uvwmK1w9xsQ0OTBXa7QB+tGgKAENcfOi8EYLPb0WR2jGRos9thswvY7QKnLl7t0sPhtRoVgvsEQN8nAME6DYJ1AdAFBiA4KADB1+bp+wQgNDgQffuoEahR3VZ/cn1jMxpuODNx1uHmGUrLmc7tbqc7uVtj4dkq7Dz0PSqvmjBn6l0Yc3fPuOkpevIgfP51Cd7ZdwJrFk7EnWF8OEpP4lLg5+Tk4J133oHFYsHSpUuRnJzcanlRURE2btwIo9GISZMm4YUXXoBarUZpaSnWrl2Lqqoq3H333cjIyEBQUFC3fJDu0Gyx4R8Fpcj96iJq6s2IGhKGp+aOxZ3hQR3eUespCqXCGXQajQpDB4Rg6IAQ2AUQcarjO3mDOriTt8HsuPM3WB+IeqPJOf/ekRK+OVUBm11c2wnYYbUJDB8ciu/OVsFmE7DaHPOsNjsi7whCo8mKRpMVDU0WGJssuGo042JFPeobmnGzfYdSoYAmQOk8a1AqFVDAcSYi4BgGQAhAwPG33TEBpdJxhqJSKWG22KC6dmaiUimhViog9dNBp3GcjahVSqhUCqiUjrMc5bUzHaVCcW07CljsdhRXGB3zFLi2jgIjBzkG/3JsWwHVtddAoYTVZoNSoYDi2vYAQKtWQ6V07FQdO1RH+zRb7Wg0W9FssaHZakezxQahUKCpyQKr1Q6zxYZmiw1mqx02mx0Wm0CzxeY4I1M4th+gUqK+sRlqlRKaACU0ahU0ASqMGBQKfaAaapUSV41mlFU14mKFET9cuoo7w3RYu3AConrQHa6BGjVW/6978fqYzMUAAA9bSURBVOpH3+L3u77Gml9OwMAI9uf3FJ0Gfnl5ObZt24ZPPvkEGo0GCxcuxJQpUzB8+HDnOmvXrsVLL72ECRMmYP369cjKysLixYvxwgsvYPHixYiLi0NmZia2b9+OtWvXdusHul1CCJwpqUPeyTLkF5WjwWTFyIEhWDYnCvdPHowrV4wdHnV60s2O/O8dKXnsPZTXwtFxjuL4gjkyPAgVVY0dvm/BD5VASPv5335fgWaLHaZmG0zNVpiabRggBcFqFWg0W9BscQSixWKD7Vqg24VwhOm1YBZw7ABazgXsQsAuHGcp5dUNsNsFrHYBm80Oc7NAc6URVpsdFqvjj/3ajsvm5lnLjd1l3eV695jjb7VKCYVCgSazBcC1szIAAWoljI0W5w6k5Qzsq+9a7+C1ASrcGabDvBlDEfPjwV69wcpVgw3BSE3+Ebb+1zf433/5GiuSxuKeIf14FVoP0Gng5+XlYerUqQgNdTxIISYmBrm5uXj66acBACUlJTCZTJgwYQIAYN68eXjzzTfx8MMPIz8/H5mZmc75jzzySI8L/CazFRU1TTh7uQ6ni6/i9KWrqKozQ6NWYuJICQ9M6I9Rgx1PDeqpv7A3nhHcqAu9Nu6/t0Lh+D5Bo0IIHFcW3eyM42bdFnYBHOvgzGXSmEgcPdk+lG+86ulGk6MM6KNRQQgBu/3ajsMuYDRZcez7csdZhF1cmw/cc3cYNCol7ELAZhOw2R1B22C24tTFmnZdZMMHhQLXHtrdssNSqxxnLv8uvgq1Sgn1tbONfiF9MHZIPwR3MB59y5nXrT6T1WZHs8WOe+4OQ4BKCavVjr5BGoTqNT329/BGkeFBSH3kPmT81zd49aNv0f+OINw/oT/uGymhX7DWLz5Db9Rp4FdUVECSrh9ZRkRE4Pjx4zddLkkSysvLUVNTA71eD7Va3Wq+O5RK938pzBYb8k6Uwdxsg10ICDtgtTtOpa02O0zNdjSZLWgy23DVaG519UqwToMJIyRE3dUPY4eGI1Cjard9pVIBtcrxRWZbvppvswsUdfAQiqi7w6594aqGzXr9dd1eZ4AK5g6GCLULdPiwjJY6229f4fb7Wmw37OUUCihVCuh1GoT1bX8z0ODIvh3uFe2i451l1N1h7drZZhcYeVc/WNp8Xn2QFhqtusN2UCrb13+zzxQp6VsV02xznA9p1CqoPHBw3/Z9W35XWnZkt+POMB1efvwn+Pbflfjqu3J8dqwYnx0rRoBaifCQQIQEaa+dATm65lp2ou12Boobf7zexXajPoEBMJksznU6pOjwR0DRwXY72ESrxW42zc12cLpADRpNza3mKRXAfaMiEKrXuvcm6DwzOw180cGASDcWf7Plnb3OFf36da2/f8Gd3Xd1QHi4oz9yYGTH7zF0YMfPEJXb/JsZ3N+9dhtk6PiuUU+9r7vrd2c7uLsNT7nZ77KnRN7ZF7HTh3Xre5BrOj1GMBgMuHLl+oOKKyoqEBERcdPllZWViIiIQFhYGIxGI2w2W6v5RETkG50G/rRp03DkyBFUV1ejqakJhw4dwowZM5zLBwwYAK1Wi2PHjgEAsrOzMWPGDAQEBGDSpEk4cOBAq/lEROQbCtFR30sbOTk5ePfdd2GxWLBgwQKkpKQgJSUFq1atwrhx43Dq1Cls3LgRDQ0NuOeee/DKK69Ao9GgpKQEqampqKqqQmRkJF577TWEhPBmDCIiX3Ap8ImIyP/1vIt4iYioWzDwiYhkgoFPRCQTDHwiIplg4BMRyQQDvwM5OTmYM2cOoqOjsWvXrnbLi4qKMH/+fMTExGDDhg2wWrt3MDVXvf3224iLi0NcXBy2bNnS4fIHH3wQSUlJSEpK6vCz+cKSJUsQFxfnrKugoKDV8ry8PCQkJGDWrFnYtm2bj6ps7eOPP3bWm5SUhPvuuw/p6emt1ulp7W00GhEfH4/i4mIArrVraWkpkpOTMXv2bKxcuRINDQ3eLNmpbe0fffQR4uPjkZCQgOeeew7Nzc3tXpOdnY3p06c7298Xvztt637uuecwa9YsZ01/+9vf2r2mW/NFUCtlZWXiwQcfFDU1NaKhoUEkJCSI06dPt1onLi5OfPPNN0IIIZ577jmxa9cuX5Taypdffil++ctfCrPZLJqbm8WSJUvEoUOHWq3zxBNPiK+//tpHFXbMbreLn/70p8JisXS4vKmpSdx///3i4sWLwmKxiGXLlom///3vXq7y1n744QcRHR0tqqqqWs3vSe397bffivj4eDFmzBhx6dIll9v18ccfF/v37xdCCPH222+LLVu2eLv0drWfPXtWREdHi/r6emG328Xvfvc78cEHH7R7XXp6usjJyfF6vS3a1i2EEPHx8aK8vPyWr+vOfOERfhs3jg6q0+mco4O26Gh00BuX+4okSUhNTYVGo0FAQACGDRuG0tLSVuucOHECO3bsQEJCAtLT02E2m31U7XVnz56FQqFASkoKEhMTsXPnzlbLjx8/jrvuuguDBg2CWq1GQkJCj2jvG6WlpWH16tUIC2s9Ln1Pau+srCxs2rTJObyJK+1qsViQn5+PmJgYAL77XW9bu0ajQVpaGvR6veO5BiNHtvtdB4DCwkJkZ2cjMTERa9asQW1trU/rbmxsRGlpKZ5//nkkJCTgzTffhN3eenC97s4XBn4bHY0OeuMonzcbHdTXRowY4fwlOX/+PA4cOID777/fubyhoQFRUVFYt24d9u7di7q6Omzfvt1X5TrV1dXhJz/5CTIzM/Hhhx9i9+7d+PLLL53LO/v38LW8vDyYTCbExsa2mt/T2nvz5s2YNGmSc9qVdvXEiLee0Lb2AQMGYNq0aQCA6upq7Nq1Cw899FC710mShGeeeQb79u1DZGRkuy637ta27qqqKkydOhUvv/wysrKycPToUfz1r39t9ZruzhcGfhuii6OD9hSnT5/GsmXLsG7dOgwZMsQ5PygoCDt27MBdd90FtVqNZcuW4R//+IfvCr1m4sSJ2LJlC3Q6HcLCwrBgwYJWdfX09t69ezcee+yxdvN7anu3cKVde3rbl5eX41e/+hXmz5+PKVOmtFuemZmJe++9FwqFAsuXL8cXX3zhgyqvGzRoEDIzMxEeHo4+ffrg0Ucfbfc70d1tzsBvo6ujg/YEx44dw9KlS/Hb3/4Wc+fObbWstLS01dGEEMJ55OZLR48exZEjR5zTbevq7N/Dl5qbm5Gfn4+f//zn7Zb11PZu4Uq79uQRb8+cOYNFixZh7ty5eOqpp9otr6+vx4cffuic7gnt//333+PgwYPO6Y5q6u58YeC30dXRQX3t8uXLeOqpp5CRkYG4uLh2ywMDA7F161ZcunQJQgjs2rUL0dHRPqi0tfr6emzZsgVmsxlGoxF79+5tVde9996Lc+fO4cKFC7DZbNi/f3+PaG/A8R94yJAh0OnaP6i7p7Z3C1fataeOeGs0GvHrX/8a//Ef/4Fly5Z1uI5Op8P777/vvOJr586dPm9/IQRefvll1NbWwmKx4KOPPmpXU7fni8e+/u1FPv30UxEXFydmzZol3nvvPSGEEMuXLxfHjx8XQghRVFQk5s+fL2bPni2effZZYTabfVmuEEKIF198UUyYMEEkJiY6//zlL39pVXdubq7zc6WmpvaIuoUQYtu2bWL27Nli1qxZ4sMPPxRCCJGYmCjKysqEEELk5eWJhIQEMWvWLLF582Zht9t9Wa7Tf//3f4vf/OY3reb19PZ+8MEHnVeM3Kxd169fLw4fPiyEEKK4uFg88sgjIjY2VixbtkxcvXrV57V/8MEHYsyYMa1+119//fV2tefn54tf/OIXYvbs2WLFihWirq7Op3ULIcTOnTtFbGysiI6OFlu3bnWu46184WiZREQywS4dIiKZYOATEckEA5+ISCYY+EREMsHAJyKSCQY+URdt3LgRJ06cuOU65eXlWLhwYafb+vjjj30+mib1fgx8oi7Ky8vr8Fb4GxkMBuzevbvTbR07dgwmk8lTpRF1qOfc603URV999RVefPFF7N+/v9V0TEwMSkpKUFlZiZKSEoSFhWHbtm0wGAw4d+4c/vM//xPV1dVQKpVYuXIl5syZg/LycqSnp+Py5cuwWCyIi4vDihUrUFxcjOTkZAwbNgwlJSW47777UFFRgTVr1mDLli0QQmDr1q1obm5GZWUlpk2bhpdffhnFxcVISEjAN998g7feeqvDeo4fP47PP/8cX375JQIDA/GnP/0Jzz//PKZPnw7AcSYxYsQI/OpXv/JlM1MvwMCnXu3o0aPIzs6GXq/HihUr8NFHH2HVqlV49tlnsWDBAiQnJ+Py5ct49NFHMWPGDKxduxZLly7Fz3/+c5jNZqSkpGDw4MEYP348ysrK8OqrrzpHQPzXv/6FjIwMjBs3Ds8++yxWrVqFKVOmoKGhAQ899BBOnDiB0NBQl+r57LPPMGLECCQnJ8NiseDjjz/G9OnTYTQa8dlnn+F3v/udL5qPehkGPvVqP/7xj6HX6wEA99xzD2pra3H16lWcOnUKDz/8MAAgMjIShw8fRmNjI/Lz81FbW4s33ngDgGMM81OnTmH8+PFQq9XOIajb+v3vf48vvvgCf/jDH3D27FmYTCY0Nja2C/yO6mlr3rx5yMzMRHV1NXJzc/HAAw+gb9++HmsTki8GPvk9hULRqi/dYrE4fw4MDGy3XssIhTcOO3v27FlIkgQhBHbv3o0+ffoAcIy3rtVqUVNTA41Gc9MRF5OTkzF69Gj87Gc/Q2xsLAoKCjrs3++onrb69u2L2bNn49NPP0VOTg42bdrkalMQ3RK/tCW/FxYWhtLSUlRVVUEIgcOHD99yfb1ejzFjxiA7OxuAY6TRRYsWOZ809MEHHwBwPJxl0aJF+OyzzzrcjkqlgtVqRW1tLU6cOIE1a9Zg1qxZKC8vx8WLF9s9zehWWrbVIjk5GX/6058ghMD48eNd3g7RrfAIn/ze8OHDsXDhQsyfPx+SJOGBBx7o9DWvvvoqXnjhBfz5z3+GQqHA5s2bIUkSMjIy8OKLLyIhIQHNzc2Ij49HYmKi8yHUN5o5cyZWr16Nl156CY8//jjmzp2L0NBQ9OvXDz/60Y9w4cIFDBo0yKXPMGPGDLz44osAgCeeeAKjR49GSEiIS5d0ErmKo2US9UAXL17Eo48+itzcXGf3EtHtYpcOUQ/zxhtvYNGiRVi3bh3DnjyKR/hERDLBI3wiIplg4BMRyQQDn4hIJhj4REQywcAnIpIJBj4RkUz8fyZXaVppNefWAAAAAElFTkSuQmCC\n", "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": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 22, "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": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

result 1

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

result 2

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

result 3

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

result 4

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
sp=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 הלך
sp=verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 6

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

result 7

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

result 8

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
sp=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 בנו
sp=verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

result 10

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
sp=verbtype=glyph
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A.show([[verb] for verb in verbHighUnc], fmt=\"layout-orig-full\", condenseType=\"word\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }