{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# About this notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook illustrates the working of LAF-Fabric, a tool to analyze the data inside *LAF* resources (Linguistic Annotation Framework). We use it for a particular LAF resource: the Hebrew Bible with linguistic annotations. The software to get the Hebrew Bible in LAF is part of LAF-Fabric (see *emdros2laf*).\n", "\n", "> **NB 1.** This is a static copy of the Gender notebook. You can download it, and if you have iPython installed and the LAF-Fabric, then you can run this notebook. And you can create many more notebooks like this, looking for patterns in the Hebrew Bible.\n", "\n", "> **NB 2.** All software involved is open source, and the data is Open Access (not for commercial use). Click the logo:\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Gender in the Hebrew Bible" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Words in Hebrew are either masculine, or feminine, or unknown.\n", "\n", "We want to plot the percentage of masculine and feminine words per chapter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The LAF way\n", "In the Hebrew LAF data, some nodes are annotated as ``word``, and some nodes as ``chapter``\n", "(there are many more kinds of node, of course).\n", "\n", "The names of chapters and the genders of words are coded as features inside annotations to these\n", "nodes.\n", "\n", "## More on feature names\n", "The features we need are present in an annotation space named ``etcbc4`` (after the name and version of this LAF resource).\n", "The chapter features are labeled with ``sft`` and the other features with ``ft``.\n", "\n", "When LAF-Fabric compiles features into binary data, it forgets the annotations in which the features come,\n", "but the annotation *space* and *label* are retained in a double prefix to the feature name.\n", "\n", "LAF-Fabric remembers those features by their *fully qualified* names: ``etcbc4:ft.gender``, ``etcbc4:sft.chapter`` etc.\n", "There may also be annotations without feature contents." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Importing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next cell loads the required libraries and creates a task processor." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0.00s This is LAF-Fabric 4.8.1\n", "API reference: http://laf-fabric.readthedocs.org/en/latest/texts/API-reference.html\n", "Feature doc: https://shebanq.ancient-data.org/static/docs/featuredoc/texts/welcome.html\n", "\n", " 0.00s DETAIL: Data dir = /Users/dirk/laf/laf-fabric-data\n", " 0.00s DETAIL: Laf dir = /Users/dirk/laf/laf-fabric-data\n", " 0.00s DETAIL: Output dir = /Users/dirk/laf/laf-fabric-output\n" ] } ], "source": [ "import sys\n", "import collections\n", "\n", "from laf.fabric import LafFabric\n", "fabric = LafFabric(verbose='DETAIL')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Loading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The processor needs data. Here is where we say what data to load. We do not need the XML identifiers as they show up in the original LAF resource. But we do need a few features of nodes, namely the ones that give us the gender of the words, and the numbers of the chapters and the books in which the chapters are contained.\n", "\n", "The *init* function actually draws that data in, and it will take a few seconds. \n", "\n", "It needs to know the name of the **source**. \n", "This name corresponds with a subdirectory in your *work_dir*.\n", "\n", "The '--' means that we do not draw in an **annox** (extra annotation package). \n", "If you want to do that, this is the place to give the name of such a package, which must be a subdirectory name inside the *annotations* directory in your *work_dir*.\n", "\n", "Then **gender** is just a name we choose to give to this task.\n", "This name determines where on the filesystem the log file and output (if any) will be put:\n", "a subdirectory *gender* inside the **source** directory inside your *output_dir*.\n", "\n", "The last argument to ``load()`` is a dictionary of data items to load.\n", "\n", "The **primary** key indicates whether the primary data itself must be loaded.\n", "Tasks can then use methods to find the primary data that is attached to a node.\n", "For the Hebrew data this is hardly necessary, because the words have textual information as features on them.\n", "\n", "The **xmlids** are tables mapping nodes and edges to the original xml identifiers they have in the original LAF source.\n", "Most tasks do not need this.\n", "Only when a task needs to link new annotations to nodes and edges and write the result as an additional LAF file,\n", "it needs to know the original identifiers.\n", "\n", "The **features** to be loaded are specified by two strings, one for node features and one for edge features.\n", "For all these features, data will be loaded, and all other features' data will be unloaded, if still loaded.\n", "\n", "**Caution: Missing feature data**\n", "\n", "If you forget to mention a feature in the load declaration and you\n", "do use it in your task,\n", "LAF-Fabric will stop your task and shout error messages at you.\n", "If you declare features that do not exist in the LAF data, you just get\n", "a warning. But if you try to use such features, you get also a loud error." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0.00s LOADING API: please wait ... \n", " 0.00s USING main: etcbc4b DATA COMPILED AT: 2015-11-02T15-08-56\n", " 2.01s LOGFILE=/Users/dirk/laf/laf-fabric-output/etcbc4b/gender/__log__gender.txt\n", " 2.01s INFO: DATA LOADED FROM SOURCE etcbc4b AND ANNOX FOR TASK gender AT 2016-09-09T14-48-44\n" ] } ], "source": [ "fabric.load('etcbc4b', '--', 'gender',\n", "{\n", " \"primary\": False,\n", " \"xmlids\": {\"node\": False, \"edge\": False},\n", " \"features\": (\"otype gn chapter book\", \"\"),\n", "})\n", "exec(fabric.localnames.format(var='fabric'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to write an efficient task,\n", "it is convenient to import the names of the API methods as *local variables*.\n", "The lookup of names in Python is fastest for local names.\n", "And it makes the code much cleaner. The method ``load()`` does this.\n", "See the [API reference](http://laf-fabric.readthedocs.org/texts/API-reference.html) for full documentation.\n", "\n", "## F\n", "All that you want to know about features and are not afraid to ask.\n", "It is an object, and for each feature that you have declared, it has a member\n", "with a handy name. For example,\n", "\n", " F.etcbc4_db_otype\n", "\n", "is a feature object\n", "that corresponds with the LAF feature given in an annotation \n", "in the annotation space ``etcbc4``, with label ``db`` and name ``otype``.\n", "It is a node feature, because otherwise we had to use ``FE`` instead of ``F``.\n", "\n", "You do not have to mention the annotation space and label, Laf-Fabric will find out what they should be\n", "given the available features. If there is confusion, Laf-Fabric will tell you, and you can supply\n", "more full names.\n", "\n", "You can look up a feature value of this feature, say for node ``n``, by saying\n", "\n", " F.otype.v(n) \n", "\n", "## NN(test=function value=something values=list of somethings)\n", "If you want to walk through all the nodes, possibly skipping some, then this is your method.\n", "It is an *iterator* that yields a new node everytime it is called.\n", "The order is so-called *primary data order*, which will be explained below.\n", "The ``test`` and ``value`` and ``values`` arguments are optional.\n", "If given, ``test`` should be a *callable* with one argument, returning a string;\n", "``value`` should be a string, ``values`` a list of strings.\n", "``test`` will be called for each passing node,\n", "and if the value returned is not equal to the given ``value`` and not a member of ``values``,\n", "the node will be skipped.\n", "\n", "### msg\n", "Issues a timed message to the standard error and to the log file.\n", "\n", "### infile(filename)\n", "Creates a open file handle for reading a file in your task output directory \n", "\n", "### outfile(filename)\n", "Creates a open file handle for writing a file in your task output directory\n", "\n", "### my_file(filename)\n", "Gives the full path to a file in your task output directory" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Available features\n", "\n", "The *F_all* component delivers a list of available node features in the chosen source, \n", "and like wise *FE_all* yields the edge features.\n", "Let us see what we have got. For convenience, the components *fF_all* and *fFE_all* produce formatted outputs for\n", "these feature lists." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "etcbc4:\n", "\tdb.maxmonad:\n", "\tdb.minmonad:\n", "\tdb.monads:\n", "\tdb.oid:\n", "\tdb.otype:\n", "\tft.code:\n", "\tft.det:\n", "\tft.dist:\n", "\tft.dist_unit:\n", "\tft.domain:\n", "\tft.function:\n", "\tft.g_cons:\n", "\tft.g_cons_utf8:\n", "\tft.g_lex:\n", "\tft.g_lex_utf8:\n", "\tft.g_nme:\n", "\tft.g_nme_utf8:\n", "\tft.g_pfm:\n", "\tft.g_pfm_utf8:\n", "\tft.g_prs:\n", "\tft.g_prs_utf8:\n", "\tft.g_uvf:\n", "\tft.g_uvf_utf8:\n", "\tft.g_vbe:\n", "\tft.g_vbe_utf8:\n", "\tft.g_vbs:\n", "\tft.g_vbs_utf8:\n", "\tft.g_word:\n", "\tft.g_word_utf8:\n", "\tft.gn:\n", "\tft.is_root:\n", "\tft.kind:\n", "\tft.language:\n", "\tft.lex:\n", "\tft.lex_utf8:\n", "\tft.ls:\n", "\tft.mother_object_type:\n", "\tft.nme:\n", "\tft.nu:\n", "\tft.number:\n", "\tft.pdp:\n", "\tft.pfm:\n", "\tft.prs:\n", "\tft.ps:\n", "\tft.rela:\n", "\tft.sp:\n", "\tft.st:\n", "\tft.tab:\n", "\tft.trailer_utf8:\n", "\tft.txt:\n", "\tft.typ:\n", "\tft.uvf:\n", "\tft.vbe:\n", "\tft.vbs:\n", "\tft.vs:\n", "\tft.vt:\n", "\tsft.book:\n", "\tsft.chapter:\n", "\tsft.label:\n", "\tsft.verse:\n", "etcbc4:\n", "\tft.distributional_parent:\n", "\tft.functional_parent:\n", "\tft.mother:\n", "laf:\n", "\t('', 'x'):\n", "\t('', 'y'):\n" ] } ], "source": [ "print(fF_all)\n", "print(fFE_all)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Task Execution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to get an output file to write to.\n", "A simple method provides a handle to a file open for writing.\n", "The file will be created in the *output_dir*, under the subdir *etcbc4*, under the subdir *gender*." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "table = outfile('table.tsv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All open files (reading and writing) will be closed with\n", "\n", " close()\n", "\n", "below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Walking the nodes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we loop over a bunch of nodes (in fact over all nodes), in a convenient document order.\n", "\n", "### Node order\n", "There is an implicit partial order on nodes.\n", "The short story is: the nodes that are linked to primary data, inherit the order that is present\n", "in the primary data.\n", "The long story is a bit more complicated, since nodes may be attached to multiple ranges of \n", "primary data.\n", "\n", "See [node order](http://laf-fabric.readthedocs.org/texts/API-reference.html#node-order) for details.\n", "If you don't, it might be enough to know\n", "that *embedding* nodes always come before *embedded* nodes, meaning that if a node happens \n", "to be attached to a big piece of primary data, and a second node to a part of that data,\n", "then the node with the bigger attachment comes first.\n", "\n", "When there is no inclusion either way, and the start and end points are the same, the order is left undefined. \n", "\n", "### Initialization\n", "We initialize the counters in which we store the word counts.\n", "We keep track of the chapter we are in and accumulate counts of the words, masculine and feminine.\n", "For each chapter we create entries in the *ch*, *m* and *f* lists.\n", "\n", "Note also the progress messages after each chapter." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "stats = [0, 0, 0]\n", "cur_chapter = None\n", "cur_book = None\n", "ch = []\n", "m = []\n", "f = []" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\n", "Genesis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50\n", "Exodus 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40\n", "Leviticus 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27\n", "Numeri 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36\n", "Deuteronomium 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34\n", "Josua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24\n", "Judices 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21\n", "Samuel_I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n", "Samuel_II 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24\n", "Reges_I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22\n", "Reges_II 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25\n", "Jesaia 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66\n", "Jeremia 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52\n", "Ezechiel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48\n", "Hosea 1 2 3 4 5 6 7 8 9 10 11 12 13 14\n", "Joel 1 2 3 4\n", "Amos 1 2 3 4 5 6 7 8 9\n", "Obadia 1\n", "Jona 1 2 3 4\n", "Micha 1 2 3 4 5 6 7\n", "Nahum 1 2 3\n", "Habakuk 1 2 3\n", "Zephania 1 2 3\n", "Haggai 1 2\n", "Sacharia 1 2 3 4 5 6 7 8 9 10 11 12 13 14\n", "Maleachi 1 2 3\n", "Psalmi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150\n", "Iob 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42\n", "Proverbia 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n", "Ruth 1 2 3 4\n", "Canticum 1 2 3 4 5 6 7 8\n", "Ecclesiastes 1 2 3 4 5 6 7 8 9 10 11 12\n", "Threni 1 2 3 4 5\n", "Esther 1 2 3 4 5 6 7 8 9 10\n", "Daniel 1 2 3 4 5 6 7 8 9 10 11 12\n", "Esra 1 2 3 4 5 6 7 8 9 10\n", "Nehemia 1 2 3 4 5 6 7 8 9 10 11 12 13\n", "Chronica_I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29\n", "Chronica_II 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36" ] } ], "source": [ "for node in NN():\n", " otype = F.otype.v(node)\n", " if otype == \"word\":\n", " stats[0] += 1\n", " if F.gn.v(node) == \"m\":\n", " stats[1] += 1\n", " elif F.gn.v(node) == \"f\":\n", " stats[2] += 1\n", " elif otype == \"chapter\":\n", " if cur_chapter != None:\n", " masc = 0 if not stats[0] else 100 * float(stats[1]) / stats[0]\n", " fem = 0 if not stats[0] else 100 * float(stats[2]) / stats[0]\n", " ch.append(cur_chapter)\n", " m.append(masc)\n", " f.append(fem)\n", " table.write(\"{},{},{}\\n\".format(cur_chapter, masc, fem))\n", " else:\n", " table.write(\"{},{},{}\\n\".format('book chapter', 'masculine', 'feminine'))\n", " this_book = F.book.v(node)\n", " this_chapnum = F.chapter.v(node)\n", " this_chapter = \"{} {}\".format(this_book, this_chapnum)\n", " if this_book != cur_book:\n", " sys.stderr.write(\"\\n{}\".format(this_book))\n", " cur_book = this_book\n", " sys.stderr.write(\" {}\".format(this_chapnum))\n", " stats = [0, 0, 0]\n", " cur_chapter = this_chapter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Closing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to close open files. This is exactly what the next statement does." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 22s Results directory:\n", "/Users/dirk/SURFdrive/laf-fabric-output/etcbc4b/gender\n", "\n", "__log__gender.txt 217 Fri Nov 13 14:09:01 2015\n", "table.tsv 43234 Fri Nov 13 14:09:01 2015\n" ] } ], "source": [ "close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Showing off" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Everything is still in memory. Now it is the time to generate a graphical representation of the data.\n", "\n", "The *matplotlib* package is full of instruments to do that.\n", "\n", "But let us first have a look at a few rows of the data itself." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas\n", "import matplotlib.pyplot as plt\n", "from IPython.display import display\n", "pandas.set_option('display.notebook_repr_html', True)\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The files that have been generated reside in a subdirectory of your work directory.\n", "You can easily refer to them as follows:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "table_file = my_file('table.tsv')\n", "df = pandas.read_csv(table_file)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\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", " \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", " \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", " \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", "
book chaptermasculinefeminine
0Genesis 142.3476975.794948
1Genesis 238.6639687.692308
2Genesis 337.47495010.020040
3Genesis 443.04635811.920530
4Genesis 540.74844118.918919
5Genesis 636.6132729.610984
6Genesis 733.59683811.462451
7Genesis 831.3008139.959350
8Genesis 937.9721679.741551
9Genesis 1030.6791574.683841
10Genesis 1138.41698815.057915
11Genesis 1231.15183210.209424
12Genesis 1336.9942203.757225
13Genesis 1440.3930134.148472
14Genesis 1536.1878455.524862
15Genesis 1629.79452122.945205
16Genesis 1741.29979011.111111
17Genesis 1834.0288928.346709
18Genesis 1930.90024310.705596
19Genesis 2035.63829811.702128
20Genesis 2135.55926512.520868
21Genesis 2238.1322965.252918
22Genesis 2338.8739959.115282
23Genesis 2432.80182212.984055
24Genesis 2542.57246410.326087
25Genesis 2636.9300918.662614
26Genesis 2742.1296307.754630
27Genesis 2836.4444448.444444
28Genesis 2930.74534218.012422
29Genesis 3032.65565415.374841
............
70Exodus 2140.70351810.050251
71Exodus 2239.5555568.000000
72Exodus 2338.2189246.493506
73Exodus 2445.1871664.010695
74Exodus 2533.43898615.055468
75Exodus 2633.15290918.809202
76Exodus 2737.33333318.666667
77Exodus 2839.75609813.048780
78Exodus 2936.7075666.952965
79Exodus 3038.47352011.059190
80Exodus 3131.10465110.174419
81Exodus 3240.1832464.450262
82Exodus 3340.1209682.016129
83Exodus 3442.4694714.884668
84Exodus 3536.06060611.363636
85Exodus 3634.50520817.578125
86Exodus 3734.63796516.634051
87Exodus 3835.59870616.343042
88Exodus 3939.30348311.815920
89Exodus 4038.9230774.923077
90Leviticus 138.1868134.945055
91Leviticus 239.00709216.312057
92Leviticus 338.4180796.497175
93Leviticus 437.99743310.654685
94Leviticus 532.94702013.245033
95Leviticus 638.92773913.519814
96Leviticus 735.71428613.025210
97Leviticus 836.8295597.985697
98Leviticus 936.6863917.692308
99Leviticus 1040.6521747.173913
\n", "

100 rows × 3 columns

\n", "
" ], "text/plain": [ " book chapter masculine feminine\n", "0 Genesis 1 42.347697 5.794948\n", "1 Genesis 2 38.663968 7.692308\n", "2 Genesis 3 37.474950 10.020040\n", "3 Genesis 4 43.046358 11.920530\n", "4 Genesis 5 40.748441 18.918919\n", "5 Genesis 6 36.613272 9.610984\n", "6 Genesis 7 33.596838 11.462451\n", "7 Genesis 8 31.300813 9.959350\n", "8 Genesis 9 37.972167 9.741551\n", "9 Genesis 10 30.679157 4.683841\n", "10 Genesis 11 38.416988 15.057915\n", "11 Genesis 12 31.151832 10.209424\n", "12 Genesis 13 36.994220 3.757225\n", "13 Genesis 14 40.393013 4.148472\n", "14 Genesis 15 36.187845 5.524862\n", "15 Genesis 16 29.794521 22.945205\n", "16 Genesis 17 41.299790 11.111111\n", "17 Genesis 18 34.028892 8.346709\n", "18 Genesis 19 30.900243 10.705596\n", "19 Genesis 20 35.638298 11.702128\n", "20 Genesis 21 35.559265 12.520868\n", "21 Genesis 22 38.132296 5.252918\n", "22 Genesis 23 38.873995 9.115282\n", "23 Genesis 24 32.801822 12.984055\n", "24 Genesis 25 42.572464 10.326087\n", "25 Genesis 26 36.930091 8.662614\n", "26 Genesis 27 42.129630 7.754630\n", "27 Genesis 28 36.444444 8.444444\n", "28 Genesis 29 30.745342 18.012422\n", "29 Genesis 30 32.655654 15.374841\n", ".. ... ... ...\n", "70 Exodus 21 40.703518 10.050251\n", "71 Exodus 22 39.555556 8.000000\n", "72 Exodus 23 38.218924 6.493506\n", "73 Exodus 24 45.187166 4.010695\n", "74 Exodus 25 33.438986 15.055468\n", "75 Exodus 26 33.152909 18.809202\n", "76 Exodus 27 37.333333 18.666667\n", "77 Exodus 28 39.756098 13.048780\n", "78 Exodus 29 36.707566 6.952965\n", "79 Exodus 30 38.473520 11.059190\n", "80 Exodus 31 31.104651 10.174419\n", "81 Exodus 32 40.183246 4.450262\n", "82 Exodus 33 40.120968 2.016129\n", "83 Exodus 34 42.469471 4.884668\n", "84 Exodus 35 36.060606 11.363636\n", "85 Exodus 36 34.505208 17.578125\n", "86 Exodus 37 34.637965 16.634051\n", "87 Exodus 38 35.598706 16.343042\n", "88 Exodus 39 39.303483 11.815920\n", "89 Exodus 40 38.923077 4.923077\n", "90 Leviticus 1 38.186813 4.945055\n", "91 Leviticus 2 39.007092 16.312057\n", "92 Leviticus 3 38.418079 6.497175\n", "93 Leviticus 4 37.997433 10.654685\n", "94 Leviticus 5 32.947020 13.245033\n", "95 Leviticus 6 38.927739 13.519814\n", "96 Leviticus 7 35.714286 13.025210\n", "97 Leviticus 8 36.829559 7.985697\n", "98 Leviticus 9 36.686391 7.692308\n", "99 Leviticus 10 40.652174 7.173913\n", "\n", "[100 rows x 3 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's get *matplotlib* to work.\n", "Here we just show a line graph of 20 chapters.\n", "If you want to see another series of chapters,\n", "just modify the *start* and *end* variables below and execute again by pressing *Shift Enter*.\n", "You can repeat this as often as you like without re-running earlier steps." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = range(len(ch))\n", "start = 100\n", "end = 120\n", "fig = plt.figure()\n", "plt.plot(x[start:end], m[start:end], 'b-', x[start:end], f[start:end], 'r-')\n", "plt.axis([start, end, 0, 50])\n", "plt.xticks(x[start:end], ch[start:end], rotation='vertical')\n", "plt.margins(0.2)\n", "plt.subplots_adjust(bottom=0.15);\n", "plt.title('gender');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Note the chapters where the feminine words peak: Leviticus 12 and 18." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, save the chart." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "fig.savefig('gender.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![saved chart](gender.png)" ] } ], "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.0" } }, "nbformat": 4, "nbformat_minor": 2 }