Source code for chana.syllabificator

#coding=UTF-8
"""
Syllabificator for shipibo-konibo.
General functions and rules to syllabify a shipibo-konibo word
"""
[docs]def syllabify(word): """ Function that returns all the syllables of a word :param word: a word to get its syllables :type word: str :returns: list of syllables :rtype: list :Example: >>> import chana.syllabificator >>> chana.syllabificator.syllabify('atsabo') ['a', 'tsa', 'bo'] """ word_vc = get_vc(word) sibilantes = ['m','n', 's', 'sh', 'x'] syllables = [] syllable = "" actual_pos = len(word_vc) - 1 if len(word_vc) == 1: syllables.append(word_vc[0][0]) return syllables while actual_pos >= 0 and word_vc: #vowl check if word_vc[actual_pos][1] == 'V': syllable = word_vc[actual_pos][0] del word_vc[-1] actual_pos = actual_pos - 1 #long vowel if word_vc and (word_vc[actual_pos][0] == syllable or word_vc[actual_pos][0] == accentuate(syllable)): if (len(word_vc) > 1): syllables.insert(0, syllable) syllable = "" else: syllables.insert(0, syllable) syllable = "" elif word_vc and word_vc[actual_pos][1] == 'C': if (word_vc[actual_pos][0] == 'u' or word_vc[actual_pos][0] == accentuate('u') or word_vc[actual_pos][0] == 'h'): syllables.insert(0, syllable) syllable = "" else: #Se agrega a la syllable CV syllable = word_vc[actual_pos][0] + syllable #C actual_pos = actual_pos - 1 del word_vc[-1] syllables.insert(0, syllable) syllable = "" else: if (len(word_vc) < 2 and actual_pos != 0): #lone syllable syllables.insert(0, syllable) syllable = "" actual_pos = actual_pos - 1 if (word_vc): del word_vc[-1] else: syllables.insert(0, syllable) syllable = "" else: #consonant check if word_vc[actual_pos][0] in sibilantes: syllable = word_vc[actual_pos][0] + syllable actual_pos = actual_pos - 1 if (word_vc): del word_vc[-1] #first CVC if word_vc and word_vc[actual_pos][1] == 'V': syllable = word_vc[actual_pos][0] + syllable #V actual_pos = actual_pos - 1 del word_vc[-1] #syllable = VC if len(word_vc) and word_vc[actual_pos][1] == 'C': if word_vc[actual_pos][0] == 'u' or word_vc[ actual_pos][0] == accentuate('u') or word_vc[actual_pos][0] == 'h': syllables.insert(0, syllable) syllable = "" else: #is CVC syllable = word_vc[actual_pos][0] + syllable #V syllables.insert(0, syllable) syllable = "" actual_pos = actual_pos - 1 del word_vc[-1] else: #is VC syllables.insert(0, syllable) syllable = "" else: if word_vc and (word_vc[actual_pos][0] == 'u' or word_vc[actual_pos][0] == accentuate('u')): syllables.insert(0, syllable) syllable = "" actual_pos = actual_pos - 1 del word_vc[-1] else: if (word_vc[actual_pos][0] == 'h'): syllable = word_vc[actual_pos][0] actual_pos = actual_pos - 1 del word_vc[-1] elif (word_vc[actual_pos][0] == 'u' or word_vc[actual_pos][0] == accentuate('u')): syllable = word_vc[actual_pos][0] syllables.insert(0, syllable) syllable = "" actual_pos = actual_pos - 1 if (word_vc): del word_vc[-1] else: if len(syllables): if word_vc[actual_pos][0] == 't' and syllables[0][0] == 's': syllables[0] = word_vc[actual_pos][0] + syllables[0] if word_vc[actual_pos][0] == 'c' and syllables[0][0] == 'h': syllables[0] = word_vc[actual_pos][0] + syllables[0] if word_vc[actual_pos][0] == 's' and syllables[0][0] == 'h': syllables[0] = word_vc[actual_pos][0] + syllables[0] actual_pos = actual_pos - 1 if (word_vc): del word_vc[-1] return syllables
[docs]def get_vc(word): """ Function that returns all the vowels and consonants of a word :param word: word to get its vowels and consonants :type word: str :returns: list of 'V' and 'C' for each letter of the word :rtype: list :Example: >>> import chana.syllabificator >>> chana.syllabificator.get_vc('piti') [['p', 'C'], ['i', 'V'], ['t', 'C'], ['i', 'V']] """ structure = [] vowels = ['a', 'e', 'i', 'o'] acentuado = ['á', 'é', 'í', 'ó'] specials = ['ch', 'hu', 'sh', 'ts', 'qu'] pos_special_cons = -1 transformation = { "ch": "1", "hu": "2", "sh": "3", "ts": "4", "qu": "5" } for special in specials: if special in word: word = word.replace(special, transformation[special]) for pos in range(0, len(word)): if (pos_special_cons != -1): if pos != pos_special_cons + 1: if word[pos] in vowels or word[pos] in acentuado: structure.append([word[pos], "V"]) else: if word[pos] == " ": structure.append([word[pos], " "]) else: if word[pos] == "-": structure.append([word[pos], "-"]) else: structure.append([word[pos], "C"]) else: structure[pos - 1] = [word[pos - 1] + word[pos], "C"] else: if word[pos] in vowels or word[pos] in acentuado: structure.append([word[pos], "V"]) else: if word[pos] == " ": structure.append([word[pos], " "]) else: if word[pos] == "-": structure.append([word[pos], "-"]) else: structure.append([word[pos], "C"]) for syllable in structure: syllable[0] = change(syllable[0]) return structure
[docs]def change(syllable): """ Function that returns the original form of a syllable :param syllable: a syllable to be transformed :type syllable: str :returns: syllable with its original form :rtype: str :Example: >>> import chana.syllabificator >>> chana.syllabificator.change('1a') cha """ if "1" in syllable: syllable = syllable.replace("1", "ch") elif "2" in syllable: syllable = syllable.replace("2", "hu") elif "3" in syllable: syllable = syllable.replace("3", "sh") elif "4" in syllable: syllable = syllable.replace("4", "ts") elif "5" in syllable: syllable = syllable.replace("5", "qu") else: syllable = syllable.replace("6", "bu") return syllable
[docs]def accentuate(letter): """ Function that adds the accentuation mark of a letter: :param letter: a letter to be accentuated :type letter: str :returns: letter accentuated :rtype: str :Example: >>> import chana.syllabificator >>> chana.syllabificator.accentuate('a') á """ if letter == "a": letter = "á" elif letter == "e": letter = "é" elif letter == "i": letter = "í" elif letter == "o": letter = "ó" elif letter == "u": letter = "ú" return letter