Source code for cltk.morphology.akk

"""
Functions and classes for Akkadian morphology.
"""


__author__ = ["M. Willis Monroe <willismonroe@gmail.com>"]
__license__ = "MIT License. See LICENSE."

from cltk.phonology.akk import AKKADIAN, get_cv_pattern, syllabify
from cltk.stem.akk import AKKADIAN_ENDINGS, stem


[docs]def get_bound_form(noun: str, gender: str) -> str: """ Return bound form of nound, given its gender. >>> get_bound_form("awīlum", "m") 'awīl' """ syllables = syllabify(noun) stemmed_noun = stem(noun, gender) cv_pattern = get_cv_pattern(stemmed_noun) # Based on Huehnergard Appendix 6.C.1: base in -VC if [letter[0] for letter in cv_pattern[-2:]] == ["V", "C"] or stemmed_noun in [ "nakr" ]: # a. 2-syllable if len(syllables) > 2: # awīlum > awīl, nakrum > naker if stemmed_noun in ["nakr"]: return "naker" else: return stemmed_noun # b. 1-syllable elif len(syllables) > 1: # bēlum > bēl return stemmed_noun # c. abum, aḫum if stemmed_noun in ["ab", "aḫ"]: return stemmed_noun + "i" # Appendix 6.C.2: base in -C₁C₁ if cv_pattern[-1][:2] == cv_pattern[-2][:2]: # a. 1-syllable if 3 > len(syllables) > 1: return stemmed_noun + "i" # b. 2-syllable, -tt if len(syllables) > 2 and cv_pattern[-1][2] + cv_pattern[-2][2] == "tt": return stemmed_noun + "i" # c. 2-syllable, other if len(syllables) > 2: return stemmed_noun[:-1] # Appendix 6.C.3: base in -C₁C₂, C₂ ≠ t, i.e. pVrs if ( cv_pattern[-1][0] == cv_pattern[-2][0] and cv_pattern[-1][1] != cv_pattern[-2][1] ): return stemmed_noun[:-1] + stemmed_noun[1] + stemmed_noun[-1] # Appendix 6.C.4: base in -Ct (fem.) if cv_pattern[-1][2] == "t" and cv_pattern[-2][0] == "C": if len(syllables) > 2: return stemmed_noun + "i" # Need to deal with fem. Ptcpl. māḫirtum -> māḫirat if len(syllables) > 1: # These are case by case if stemmed_noun in ["qīšt"]: return stemmed_noun + "i" if stemmed_noun in ["mārt"]: return stemmed_noun[:-1] + stemmed_noun[1] + stemmed_noun[-1]
# Appendix 6.C.5: base in -V # Weak nouns...
[docs]def decline_noun( noun: str, gender: str, mimation: bool = True ) -> list[tuple[str, dict[str, str]]]: """ Return a list of all possible Akkadiandeclined forms given any form of a noun and its gender. >>> decline_noun('iltum', 'f') [('iltum', {'case': 'nominative', 'number': 'singular'}), \ ('iltam', {'case': 'accusative', 'number': 'singular'}), \ ('iltim', {'case': 'genitive', 'number': 'singular'}), \ ('iltān', {'case': 'nominative', 'number': 'dual'}), \ ('iltīn', {'case': 'oblique', 'number': 'dual'}), \ ('ilātum', {'case': 'nominative', 'number': 'plural'}), \ ('ilātim', {'case': 'oblique', 'number': 'plural'})] """ stemmed_noun = stem(noun, gender) declension = [] for case in AKKADIAN_ENDINGS[gender]["singular"]: if gender == "m": form = stemmed_noun + AKKADIAN_ENDINGS[gender]["singular"][case] else: form = stemmed_noun + AKKADIAN_ENDINGS[gender]["singular"][case][1:] declension.append((form, {"case": case, "number": "singular"})) for case in AKKADIAN_ENDINGS[gender]["dual"]: if gender == "m": form = stemmed_noun + AKKADIAN_ENDINGS[gender]["dual"][case] else: form = stemmed_noun + AKKADIAN_ENDINGS[gender]["dual"][case][1:] declension.append((form, {"case": case, "number": "dual"})) for case in AKKADIAN_ENDINGS[gender]["plural"]: if gender == "m": form = stemmed_noun + AKKADIAN_ENDINGS[gender]["plural"][case] else: if stemmed_noun[-3] in AKKADIAN["macron_vowels"]: theme_vowel = stemmed_noun[-3] else: theme_vowel = "ā" ending = [ x for x in AKKADIAN_ENDINGS[gender]["plural"][case] if x[0] == theme_vowel ] if stemmed_noun[-2] in AKKADIAN["short_vowels"]: form = stemmed_noun[:-2] + ending[0] elif ( stemmed_noun[-1] in AKKADIAN["consonants"] and stemmed_noun[-2] in AKKADIAN["macron_vowels"] ): form = stemmed_noun + ending[0] else: form = stemmed_noun[:-1] + ending[0] declension.append((form, {"case": case, "number": "plural"})) return declension