Building Amharic AI: A Developer's Guide to Linguistic Complexity
1. The Ge’ez Script
Amharic uses the Ge’ez script, an abugida. Each character represents a syllable: ላ is one character for la.
The Seven Orders
| Order | Vowel Sound | Example with ለ (l) | Pronunciation |
|---|---|---|---|
| 1st | ”ä” | ለ | lä |
| 2nd | ”u” | ሉ | lu |
| 3rd | ”i” | ሊ | li |
| 4th | ”a” | ላ | la |
| 5th | ”e” | ሌ | le |
| 6th | ”ə” or silent | ል | lə (or just ‘l’) |
| 7th | ”o” | ሎ | lo |
33 base consonants across seven orders give 231 core characters. Special characters for labialized consonants (like ኰ for kʷə) take the set past 300.
Similar Shapes
Many characters differ by a small stroke or curve:
በ(bä) vs.ቤ(be) vs.ቦ(bo)ነ(nä) vs.ኔ(ne) vs.ኖ(no)
A blurry image can make an OCR model confuse them. A TTS model that reads በ as ቤ says the wrong sound.
Unicode Normalization
Standard Unicode normalization forms (NFC, NFKC) do not resolve orthographic variation in Amharic. Ethiopic characters (U+1200 to U+137F) are precomposed syllabic codepoints. Unlike Korean Hangul, they have no canonical decomposition:
unicodedata.normalize('NFKC', "ላ")will not decompose into a consonantለand vowelአ.- Standard Unicode algorithms will never merge historical homophones (e.g.,
ሠintoሰorዐintoአ).
A purpose-built normalizer has to unify homophone families and standardize Ethiopic punctuation:
import re
import unicodedata
class AmharicNormalizer:
"""
Normalizer for Ethiopic/Amharic script.
Standardizes:
- 4 Homophone families: [h] (ሀ, ሐ, ኀ, ኸ -> ሀ), [s] (ሰ, ሠ -> ሰ),
[ʔ] (አ, ዐ -> አ), [tsʼ] (ጸ, ፀ -> ጸ)
- Punctuation marks: Ethiopic word divider (፡ -> space), four dots (። -> .)
- Punctuation to ASCII equivalents for downstream tokenizers
"""
HOMOPHONE_MAP = {
# H-family: ሐ, ኀ, ኸ -> ሀ
'ሐ': 'ሀ', 'ሑ': 'ሁ', 'ሒ': 'ሂ', 'ሓ': 'ሃ', 'ሔ': 'ሄ', 'ሕ': 'ህ', 'ሖ': 'ሆ',
'ኀ': 'ሀ', 'ኁ': 'ሁ', 'ኂ': 'ሂ', 'ኃ': 'ሃ', 'ኄ': 'ሄ', 'ኅ': 'ህ', 'ኆ': 'ሆ',
'ኸ': 'ሀ', 'ኹ': 'ሁ', 'ኺ': 'ሂ', 'ኻ': 'ሃ', 'ኼ': 'ሄ', 'ኽ': 'ህ', 'ኾ': 'ሆ',
# S-family: ሠ -> ሰ
'ሠ': 'ሰ', 'ሡ': 'ሱ', 'ሢ': 'ሲ', 'ሣ': 'ሳ', 'ሤ': 'ሴ', 'ሥ': 'ስ', 'ሦ': 'ሶ', 'ሧ': 'ሷ',
# A-family: ዐ -> አ
'ዐ': 'አ', 'ዑ': 'ኡ', 'ዒ': 'ኢ', 'ዓ': 'ኣ', 'ዔ': 'ኤ', 'ዕ': 'እ', 'ዖ': 'ኦ',
# Ts-family: ፀ -> ጸ
'ፀ': 'ጸ', 'ፁ': 'ጹ', 'ፂ': 'ጺ', 'ፃ': 'ጻ', 'ፄ': 'ጼ', 'ፅ': 'ጽ', 'ፆ': 'ጾ',
}
PUNCT_MAP = {
'፡': ' ', # Word divider (həlätt nət'əb) -> Space
'።': '.', # Full stop (arat nət'əb) -> Period
'፣': ',', # Netela serez -> Comma
'፤': ';', # Derreb serez -> Semicolon
'፥': ':', # Colon
'፦': ':-', # Preface colon
'፧': '?', # Question mark
'፨': '\n\n' # Section divider
}
@classmethod
def normalize(cls, text: str) -> str:
if not text:
return ""
# 1. NFC normalize
text = unicodedata.normalize("NFC", text)
# 2. Normalize Ethiopic punctuation
for p, r in cls.PUNCT_MAP.items():
text = text.replace(p, r)
# 3. Map homophones across all orders
for h, r in cls.HOMOPHONE_MAP.items():
text = text.replace(h, r)
# 4. Collapse consecutive whitespace
return re.sub(r'[ ]+', ' ', text).strip()
# Example usage:
raw_text = "ሠላም፡ለዓለም።ድኅነት፡ወይስ፡ድህነት፧"
clean_text = AmharicNormalizer.normalize(raw_text)
print(clean_text)
2. Gemination
Gemination lengthens a consonant and can change a word’s meaning, but it isn’t written.
| Written Word | Pronunciation | Meaning |
|---|---|---|
| አለ (alä) | [ʔalɐ] (short ‘l’) | “He said” |
| አለ (allä) | [ʔallɐ] (geminate ‘l’) | “There is” |
| ገና (gäna) | [gɐnɐ] (short ‘n’) | “Still / Not yet” |
| ገና (Gänna) | [gɐnnɐ] (geminate ‘n’) | “Christmas” |
A TTS model has to choose the pronunciation of አለ from the sentence. An STT model has to hear the difference in duration.
Gemination patterns follow Semitic morphological rules (Type A, Type B, and frequentative reduplication):
Root: ሰ-ብ-ር (s-b-r, "break")
Basic Imperfective vs. Frequentative:
- ይሰብራል (yəsäbrall) - "he breaks" (medial C2 singleton in imperfective)
- ይሰባብራል (yəsäbabbərall) - "he breaks into pieces / shatters" (frequentative: reduplicated C2 with 4th order vowel 'a')
Basic Perfective vs. Frequentative Causative:
- ሰበረ (säbbärä) - "he broke" (geminated medial C2 in Type A perfective)
- አሰባበረ (assäbabbärä) - "he shattered / caused to smash into pieces" (causative frequentative)
3. Honorifics
Pronouns and verbs change with the listener’s age, social status and gender, and with the formality of the situation. Telling someone to “come”:
- ና (
nā): for a close friend or a child. - ይምጡ (
yəmtu): for an elder or someone you want to show respect to.
If a user says, “Tell my boss I’ll be late,” the formal ለአለቃዎ እንደማረፍድ እባክዎ ይንገሩልኝ is right and the informal ለአለቃህ ንገረው አረፈድኩ is rude.
4. Morphology
Amharic is Semitic and uses a root-and-pattern system. The root ሰ-ብ-ር (s-b-r) carries the idea of “breaking”:
- ሰበረ (säbärä) - “he broke”
- ሰባሪ (säbari) - “one who breaks”
- ስብረት (səbrät) - “the act of breaking”
- መሰበር (mäsäbər) - “to break” (the infinitive)
Agglutination
Prefixes and suffixes pack a clause into one word: አላስተማረችኝም (alastämaräččəññəm) - “She did not teach me.”
- አል- (
al-): The “not” part (negation). - -አስ- (
-as-): The “caused to” part (causative). - -ተማረ- (
-tämarä-): The root for “learn.” With the causative, “teach.” - -ች- (
-čč-): The “she” part. - -ኝ- (
-ññ): The “me” part. - -ም (
-m): The other “not” part (negation).
A dictionary lookup on this word fails. It needs a morphological analyzer.
5. Word Order
Amharic is Subject-Object-Verb (SOV):
The child (S) the bread (O) ate (V).
Speakers move words to change emphasis:
- ልጁ ዳቦውን በላ (
ləǧu daboən bäla): “The child ate the bread.” (Neutral) - ዳቦውን ልጁ በላ (
daboən ləǧu bäla): “It was the bread that the child ate.” (Focus on the object) - ልጁ ነው ዳቦውን የበላው (
ləǧu näw daboən yäbälaw): “It was the child who ate the bread.” (Focus on the subject)