{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import collections\n", "\n", "from tf.app import use" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TF app is up-to-date.\n", "Using annotation/app-oldbabylonian commit 1f12c687368dec8eabefe35264a30f4d5eac3fb4 (=latest)\n", " in /Users/dirk/text-fabric-data/__apps__/oldbabylonian.\n", "No new data release available online.\n", "Using Nino-cunei/oldbabylonian/tf - 1.0.1 rv1.0.1 (=latest) in /Users/dirk/text-fabric-data.\n" ] }, { "data": { "text/html": [ "Documentation: OLDBABYLONIAN Character table Feature docs oldbabylonian API Text-Fabric API 7.4.11 Search Reference
Loaded features:\n", "

Old Babylonian Letters 1900-1600: Cuneiform tablets : after afterr afteru atf atfpost atfpre col collated collection comment damage det docnote docnumber excised face flags fraction grapheme graphemer graphemeu lang langalt ln lnc lnno missing object operator operatorr operatoru otype pnumber primecol primeln question reading readingr readingu remarkable remarks repeat srcLn srcLnNum srcfile supplied sym symr symu trans translation@ll type uncertain volume oslots

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
API members:\n", "C Computed, Call AllComputeds, Cs ComputedString
\n", "E Edge, Eall AllEdges, Es EdgeString
\n", "ensureLoaded, TF, ignored, loadLog
\n", "L Locality
\n", "cache, error, indent, info, reset
\n", "N Nodes, sortKey, sortKeyTuple, otypeRank, sortNodes
\n", "F Feature, Fall AllFeatures, Fs FeatureString
\n", "S Search
\n", "T Text
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = use('oldbabylonian', hoist=globals(), check=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Proper nouns\n", "\n", "List of sign stretches that occur between `um-ma` and `ma`.\n", "\n", "More precisely: we are looking for single words, immediately following the sign sequence `um-ma`, and where\n", "the word itself ends in `-ma`.\n", "\n", "The following query captures this intention.\n", "\n", "See [basic relations](https://annotation.github.io/text-fabric/Use/Search/#relational-operators)\n", "for the meaning of `<:` and `:=`.\n", "You find them under **slot comparison**." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1472 results\n" ] } ], "source": [ "query = '''\n", "line\n", " sign reading=um\n", " <: sign reading=ma\n", " <: word\n", " := sign reading=ma\n", "'''\n", "results = sorted(S.search(query))\n", "print(f'{len(results)} results')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
nplinesignsignwordsign
1000 P386007 obverse:6um-ma šu-u₂-maum-ma šu-u₂-mama
1001 P386008 obverse:3um-ma ha-am-mu-ra-bi-maum-ma ha-am-mu-ra-bi-mama
1002 P386009 obverse:3um-ma ha-am-mu-ra-bi-maum-ma ha-am-mu-ra-bi-mama
1003 P386009 obverse:7um-ma šu-maum-ma šu-mama
1004 P386010 obverse:3um-ma ha-am-mu-ra-bi-maum-ma ha-am-mu-ra-bi-mama
1005 P386010 obverse:6um-ma šu-nu-maum-ma šu-nu-mama
1006 P386011 obverse:3um-ma ha-am-mu-ra-bi-maum-ma ha-am-mu-ra-bi-mama
1007 P386011 obverse:4dišdnanna-tum ki-a-am iq-bi-a-am um-ma šu-maum-ma šu-mama
1008 P386012 obverse:3um-ma ha-am-mu-ra-bi-maum-ma ha-am-mu-ra-bi-mama
1009 P386012 obverse:4-šum ša ta--pu-ra-am um-ma at-ta-maum-ma at-ta-mama
1010 P386013 obverse:3um-ma ha-am-mu-ra-bi-maum-ma ha-am-mu-ra-bi-mama
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A.table(results, start=1000, end=1010, fmt='layout-orig-rich')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "539" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "introNouns = collections.Counter()\n", "\n", "for (line, um, ma1, word, ma2) in results:\n", " introNouns[F.symr.v(word)] += 1\n", "\n", "len(introNouns)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ha-am-mu-ra-bi-ma 108 x\n", "šu-ma 86 x\n", "šu-u₂-ma 86 x\n", "at-ta-ma 62 x\n", "a-na-ku-ma 61 x\n", "at-ta-a-ma 51 x\n", "a-na-ku-u₂-ma 39 x\n", "šu-nu-ma 28 x\n", "a-hu-um-ma 22 x\n", "ha-am-mu-ra-pi₂-ma 18 x\n", "a-bi-e-šu-uh-ma 17 x\n", "dmarduk-mu-ša-lim-ma 17 x\n", "at-ti-ma 15 x\n", "lu₂-igi-sa₆-ma 13 x\n", "ṣi-li₂-dutu-ma 13 x\n", "am-mi-ṣa-du-qa₂-ma 12 x\n", "sa-am-su-i-lu-na-ma 12 x\n", "dutu-na-ṣi-ir-ma 11 x\n", "diškur-ra-bi-ma 10 x\n", "dmarduk-na-ṣi-ir-ma 10 x\n", "dsuen-i-din-nam-ma 10 x\n", "at-tu-nu-ma 9 x\n", "ši-ma 9 x\n", "dna-bi-um-na-ṣi-ir-ma 8 x\n", "a-wi-il-dingir-ma 7 x\n", "dna-bi-um-ma-lik-ma 7 x\n", "e-tel-pi₄-dmarduk-ma 7 x\n", "gi-mil-dmarduk-ma 7 x\n", "dutu-ha-zi-ir-ma 6 x\n", "i₃-li₂-i-qi₂-ša-am-ma 6 x\n", "nu-ur₂-dsuen-ma 6 x\n", "ši-i-ma 6 x\n", "…-ma 6 x\n", "a-wi-il-eš₁₈-dar-ma 5 x\n", "be-el-šu-nu-ma 5 x\n", "be-la-nu-um-ma 5 x\n", "dingir-šu-ib-ni-šu-ma 5 x\n", "dlal₃-na-ṣi-ir-ma 5 x\n", "dsuen-i-qi₂-ša-am-ma 5 x\n", "at-ti-i-ma 4 x\n", "be-el-ta-ni-ma 4 x\n", "be-li₂-ma 4 x\n", "diškur-šar-rum-ma 4 x\n", "dmarduk-dingir-ma 4 x\n", "dsuen-be-el-ap-lim-ma 4 x\n", "dsuen-im-gur-an-ni-ma 4 x\n", "dsuen-ma-gir-ma 4 x\n", "er₃-ra-ba-ni-ma 4 x\n", "i-din-dmarduk-ma 4 x\n", "i-šar-ku-bi-ma 4 x\n", "ip-qu₂-dša-la-ma 4 x\n", "i₃-li₂-ip-pa-al-sa₃-am-ma 4 x\n", "mu-na-wi-rum-ma 4 x\n", "sa-am-su-di-ta-na-ma 4 x\n", "sag-il₂-ma-an-šum₂-ma 4 x\n", "ta-ri-ba-tum-ma 4 x\n", "wa-tar-dutu-ma 4 x\n", "a-wi-il-dna-bi-um-ma 3 x\n", "am-mi-di-ta-na-ma 3 x\n", "diškur-ma-an-šum₂-ma 3 x\n", "dnanna-tum-ma 3 x\n", "dsuen-dingir-ma 3 x\n", "dsuen-e-ri-ba-am-ma 3 x\n", "dsuen-na-di-in-šu-mi-ma 3 x\n", "dsuen-na-ṣi-ir-ma 3 x\n", "ha-li-ia-um-ma 3 x\n", "i-din-dsuen-ma 3 x\n", "i-lu-ni-ma 3 x\n", "id-da-tum-ma 3 x\n", "il-ta-ni-ma 3 x\n", "i₃-li₂-i-ma-dingir-ma 3 x\n", "lu₂-dnin-urta-ma 3 x\n", "lu₂-igi-sa₃-ma 3 x\n", "nam-ra-tum-ma 3 x\n", "ni-nu-ma 3 x\n", "ri-iš-dmarduk-ma 3 x\n", "ta-ri-bu-um-ma 3 x\n", "še-ep-dsuen-ma 3 x\n", "šu-mu-um-li-ib-ši-ma 3 x\n", "a-hu-ši-na-ma 2 x\n", "a-li₂-ta-li-mi-ma 2 x\n", "a-ma-na-nu-um-ma 2 x\n", "a-wi-il-diškur-ma 2 x\n", "ap-la-tum-ma 2 x\n", "ba-nu-u₂-um-ma 2 x\n", "dmarduk-ni-šu-ma 2 x\n", "dnanna-ibila-ma-an-šum₂-ma 2 x\n", "dnanna-in-du₈-ma 2 x\n", "dnanna-ma-an-šum₂-ma 2 x\n", "dsuen-a-bu-šu-ma 2 x\n", "dsuen-gim-la-an-ni-ma 2 x\n", "dsuen-mu-ša-lim-ma 2 x\n", "dsuen-na-di-in-šu-mi-im-ma 2 x\n", "dsuen-re-me-ni-ma 2 x\n", "dsuen-uru₄-ma 2 x\n", "dumu-eš₁₈-dar-ma 2 x\n", "dumu-zimbir-ma 2 x\n", "dutu-ba-ni-ma 2 x\n", "dutu-na-ṣir-ma 2 x\n", "dutu-ra-bi-ma 2 x\n" ] } ], "source": [ "for (proper, amount) in sorted(\n", " introNouns.items(),\n", " key=lambda x: (-x[1], x[0]),\n", ")[0:100]:\n", " print(f'{proper:<30} {amount:>4} x')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Same exercise, now based on cuneiform unicode:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "530" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "introNounsU = collections.Counter()\n", "\n", "for (line, um, ma1, word, ma2) in results:\n", " introNounsU[F.symu.v(word)] += 1\n", " \n", "len(introNounsU)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Less words. Presumably, some words that are different in ascii-reading are equal in cuneiform unicode." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ha𒄠𒈬𒊏𒁉𒈠 126 x\n", "𒋗𒈠 86 x\n", "𒋗𒌑𒈠 86 x\n", "𒀜𒋫𒈠 62 x\n", "𒀀𒈾𒆪𒈠 61 x\n", "𒀜𒋫𒀀𒈠 51 x\n", "𒀀𒈾𒆪𒌑𒈠 39 x\n", "𒋗𒉡𒈠 28 x\n", "𒀀hu𒌝𒈠 22 x\n", "𒀀𒁉𒂊𒋗uh𒈠 17 x\n" ] } ], "source": [ "for (proper, amount) in sorted(\n", " introNounsU.items(),\n", " key=lambda x: (-x[1], x[0]),\n", ")[0:10]:\n", " print(f'{proper:<30} {amount:>4} x')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But these are the wrong shapes: we need the Santakku font.\n", "\n", "Instead of counting the word strings, we collect the word nodes:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "530" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "introNounsU = collections.defaultdict(set)\n", "\n", "for (line, um, ma1, word, ma2) in results:\n", " introNounsU[F.symu.v(word)].add(word)\n", " \n", "len(introNounsU)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "from tf.applib.helpers import dh" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "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", "
ha-am-mu-ra-bi-maha𒄠𒈬𒊏𒁉𒈠 126
šu-ma 𒋗𒈠 86
šu-u₂-ma𒋗𒌑𒈠 86
at-ta-ma𒀜𒋫𒈠 62
a-na-ku-ma𒀀𒈾𒆪𒈠 61
at-ta-a-ma 𒀜𒋫𒀀𒈠 51
a-na-ku-u₂-ma 𒀀𒈾𒆪𒌑𒈠 39
šu-nu-ma𒋗𒉡𒈠 28
a-hu-um-ma𒀀hu𒌝𒈠 22
a-bi-e-šu-uh-ma𒀀𒁉𒂊𒋗uh𒈠 17
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fmtr = 'layout-orig-rich'\n", "fmtu = 'layout-orig-unicode'\n", "\n", "html = []\n", "html.append('')\n", "\n", "for (proper, words) in sorted(\n", " introNounsU.items(),\n", " key=lambda x: (-len(x[1]), x[0]),\n", ")[0:10]:\n", " firstWord = sorted(words)[0]\n", " amount = len(words)\n", " html.append(f'''\n", "\n", " \n", " \n", " \n", "\n", "''')\n", "\n", "html.append('
{A.plain(firstWord, fmt=fmtr, withPassage=False, _asString=True)}{A.plain(firstWord, fmt=fmtu, withPassage=False, _asString=True)}{amount:>4}
')\n", "\n", "dh(''.join(html))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.2" } }, "nbformat": 4, "nbformat_minor": 2 }