Skip to content

Instantly share code, notes, and snippets.

@RazhanHameed
Last active September 9, 2023 07:24
Show Gist options
  • Save RazhanHameed/f40de23a4b75308cef507dab23caa835 to your computer and use it in GitHub Desktop.
Save RazhanHameed/f40de23a4b75308cef507dab23caa835 to your computer and use it in GitHub Desktop.
A Python function to correct the misspelling of the AE character (ە) in Kurdish text.
import re
def resolve_ae(text):
"""
This function takes a text input in Central Kurdish (Sorani) script and performs a series of character replacements
to standardize variations in the script. Specifically, it addresses cases where the character 'ە' (Arabic letter
AE) may be used in different contexts.
"""
# First replace all occurrences of 'ه' with 'ە'
text = re.sub("ه", "ە", text)
# Replace specific combinations with 'ها', 'هێ', and 'ه'
text = re.sub("ەا", "ها", text) # Replace ەا with ها
text = re.sub("ەێ", "هێ", text) # Replace ەێ with هێ
text = re.sub("ەۆ", "هۆ", text) # Replace ەۆ with هۆ
# Replace ە (AE) at the beginning of a word with ه (HEH)
text = re.sub(r"\b(ە\w*)", lambda match: "ه" + match.group(1)[1:], text)
# Replace ALEF+AE with ALEF+HEH
text = re.sub("اە", "اه", text)
# Special words should go here before the replcement of 'ە' at the end of the word
# Special case: گەهـ or گاهـ but without the tatweel since tatweel is not a phoneme in Kurdish and it will be a class for the model
text = re.sub(r'\bگەە[-ـ]?\b', "گەه", text)
# Replace 'ەە' at the beginning and end with 'هە'
text = re.sub(r"\bەە|ەە\b", "هە", text)
# Special case if two AEs come before ۆ it should be replaced with AE+HEH
text = re.sub(r"ەە(?=ۆ)", "ەه", text)
# Special case if two AEs come after either و or ب or ئ or ڕ or ق or ز they should be replaced with AE+HEH
text = re.sub(r"(?<=\b[بوئڕقزژ])ەە", "ەه", text)
# The following special case should happen after the previous special case and before the following speciall case
# Special case when two words are together with waw and the the AEs after the waw becomes HEH+AE
text = re.sub(r'(?<=و)ەە(?=\w)', "هە", text)
# Replace Three AEs with AE+HEH+AE (This will has to be run before the following special case so words like لەهەوادا will not be ruined)
text = re.sub(r"(?<=\w)ەەە(?=\w)", "ەهە", text)
# Special case if two AEs are in the middle of a word and come before YEH ی or TCHEH چ or و they will be replaced with AE+HEH if the YEH or TCHEH are not at the END of the word
text = re.sub(r"(?<=\w)ەە(?=[چیو]\B)", "ەه", text)
# Replace 'ەە'AE+AE in the middle of a word with HEH+AE
text = re.sub(r"(?<=\w)ەە(?=\w)", "هە", text)
# Replace two AE with spaces in between with AE HEH
text = re.sub("ە ە", "ە ه", text)
# Replace all HEH DOACHASHMEE with HEH
# text = text.replace('ھ', 'ە')
return text
if __name__ == "__main__":
AE_AND_ALEF = "هەروەەا جۆرەەا"
assert resolve_ae(AE_AND_ALEF) == "هەروەها جۆرەها"
AE_AND_YEH_WITH_SMALL_V = "ەێمن ەێژا ەێڤی"
assert resolve_ae(AE_AND_YEH_WITH_SMALL_V) == "هێمن هێژا هێڤی"
AE_OE = "دەۆک"
assert resolve_ae(AE_OE) == "دهۆک"
AE_BEGINNING = "ەێڵ ەەڵوێست ەەژار ەەڵە"
assert resolve_ae(AE_BEGINNING) == "هێڵ هەڵوێست هەژار هەڵە"
ALEF_AE = "ئاەەنگ ئاەورا"
assert resolve_ae(ALEF_AE) == "ئاهەنگ ئاهورا"
TWO_AE_BEGINNING = "ەەوار ەەوراز"
assert resolve_ae(TWO_AE_BEGINNING) == "هەوار هەوراز"
TWO_AE_END = "دەەە وەەە"
assert resolve_ae(TWO_AE_END) == "دەهە وەهە"
THREE_AE_MIDDLE = "نەەەنگ"
assert resolve_ae(THREE_AE_MIDDLE) == "نەهەنگ"
TWO_AE_MIDDLE = "کەشوهەوا ئاووەەوای"
print(resolve_ae(TWO_AE_MIDDLE))
assert resolve_ae(TWO_AE_MIDDLE) == "کەشوهەوا ئاووهەوای"
TWO_AE_MIDDLE_BEFORE_OE = "بەەۆی"
assert resolve_ae(TWO_AE_MIDDLE_BEFORE_OE) == "بەهۆی"
TWO_AE_MIDDLE_AFTER_WAW_OR_BEH_OR_YEH_WITH_HAMZA_ABOVE_OR_REH_WITH_SMALL_V_BELOW_OR_QAF = (
"ڕەەێڵ ئەەلی وەەمی بەەمەن قەەری زهەری ژهەراویبوون"
)
assert (
resolve_ae(
TWO_AE_MIDDLE_AFTER_WAW_OR_BEH_OR_YEH_WITH_HAMZA_ABOVE_OR_REH_WITH_SMALL_V_BELOW_OR_QAF
)
== "ڕەهێڵ ئەهلی وەهمی بەهمەن قەهری زەهری ژەهراویبوون"
)
TWO_AE_MIDDLE_BEFORE_YEY_OR_TCHEH_OR_WAW = "شەهید شەەید چەەچەهەی لەندەەوور"
assert resolve_ae(TWO_AE_MIDDLE_BEFORE_YEY_OR_TCHEH_OR_WAW) == "شەهید شەهید چەهچەهەی لەندەهوور"
TWO_AE_AFTER_GAF = "گەە گاه"
assert resolve_ae(TWO_AE_AFTER_GAF) == "گەه گاه"
text = """ئهگەر دادهنیشن لهـ مهجلیسی دە رەنگینه
ئێستاش دوو خوێندکاری ماستهر لێرهـ خولی کرداریی دهبینن
ئهی هاوار یان زۆر و یان کهم
بهـ قیسمهتێم بسپێره
بهو جووتهـ چاوهـ ، توخوا ، تهماتهـ چهـ بکهی
ئهوشوکهـ ژییاوم وهدهزانم سەت ساڵە
وهک بهنهوشهی بههارێ خۆی ناگری لهـ بهر تاوێ
ماندووی ماندووت حهساوه
منیش هاتووم تا بیبهمهوه
بهـ شاڵی پێغهمبهری حهرامهـ ئاوێ شووشان
چ دهکا بینایهـ سەر
وهڵڵا تازهـ پێگهیی
سوارهکهی سوار بووی لهـ وڵاغێکی عەسڵهـ شێر خەزاڵییه
هانام ساڵح پێغهمبەر
ئهمن دوعا دهکهم
ئاسکۆڵهی قهسری شیرینه
دهڵێی ههڵاڵەەی شلک و کاڵه
هاتهو با بێتهوه
ئهمن سوێندم خواردووهـ بهوەی ئهزهلی وئهبهدییه
لهـ چهنگ ئهو گۆڵی مندار
بۆچی بێ نمهک لهـ کن ئەمن خهڵات و بهراتت کهمه
قسەی تۆ بۆ من زیندهگانییه
بهو ئیشهڵڵایهی دهبو گیر
ریشوەیان هاتبوهـ سەرسنگیسپییه
سی دهدەن بهسی باز دهدەن بهـ باز
کیژی زولفت لهـ سهر ههنبەت ڕاست و چەپ ڕاوهستاوه
ههی کلهی لهـ چاوان کهن ، بمرم کهتانه
لهـ خۆیان داوهـ جهوههر
لهـ دڵی پکاتهوهـ تیرئەندازییه
چاو وهک زیرەی کرمانه
لهـ خۆت دهتا نووت و حونەر
خوێنت دهرێژمهـ مهیدان
لهنجهـ و لارهکهت لهـ دین دهرمی کرد
خەمت تۆ بدهـ بهـ باد
بهـ سهردهشت و بهـ بانه
بێنهـ ماچیان کهم دەم برینهکانیان
لهـ قالبیان دهستێنین گیان
دهڵێن ، هات رابوورد گهردنبهخاڵ
سهەییدی ئاخری زهمان
نازناوی پلهـ سێ و چواری بهدهستهێناوه
قیسمهتت هات بۆ ئێره
من جهورم کێشای کێ نیشت لهـ سایهت
دهچیهـ ماڵهـ خاڵانی
ئێیستا دهبینی جهنگ وگاڵهگاڵ
کهمهند پخە سەر شانێ
گیانهـ تۆزی کهش و کێو
پاکی لهـ بهر دهستی دان
نامهی من بهـ لای ههر کهسێک چووگه
لهپێی نهکردبوو جووتێک کەوشی کودەری سەر نوقرهـ بهندییه
ههچی مهقبوڵهـ لهـ لات
دهستور بهـ دهستم من حوکم ڕەوام
چونکهـ ئەقیدهیان ههیهـ دهلین بهـ بیێ عومری خودای ئهجەل نییه
بریا نهـ لهـ من بویایهی نهـ لهـ ڕهش برۆیه
ئهوهـ هات بۆ بهـ خێرهاتن کردنی شەعرهـ ئاشقی بووهـ دهڵێ
جا توخڵا ئهو غیرهتهـ چییهـ ئهوهـ بۆ تویە
وهکوو ههژدیها ناڵی ودهخوڕی
هانێ گوڵ چهپکێ گوڵ بیدهـ لهـ بهر یهخهکهو
هەر داهێنان و گەشەکردنێک لە سیکتەرە جیاکانی کۆمەلگا
پارهـ بدهو مهلا لهـ مزگهوت دهرکه
ئهم گرفتهـ بکهنهـ بابهتی تویژینهوه
خۆی ئهسپارد بهـ سوبحانی
بهختم رهشهـ ههر وهکوو خاڵی رووته
گوڵو گوڵ چهرمۆ کهـ دهدهخشێنێ
هاتهـ ناو بۆکم کهرهو
کهمهندباوێ سەر ملی
بههاران کهشاوهرزم بهـ ئیمامێ رهببانی
باران بارانهـ نم نم تهڕمی کرد
پیاو میوان دهبێ لهـ حەرەمخانه
دهوری بهو و بیلاوێنه
ئهـ دهوای دهردهکهم کاڵێ
پێڵاوت سهر چاوم هات
ئهو دوگمهـ بترازێنه
لهـ سهری نابوو شهدێکی ئەلوانی ڕهنگ عاسمانییه
سەر بهبێ ئهجهل ناشتهوە بن گڵی
ئهوێ شەویش نههاتهوهـ کابرا
عهبووبهکر تا عوسمان
چومکهـ دڵم دهسووتا
تاکهـ شتێک کهـ لهـ شهڕ خراپترهـ دیکتاتۆریهته
زندگانیم لهـ دهس ، مهگرهـ ، عالهمێ دهکهی
خاکم بهـ بهر پاتهوه
خاڵێ ها وهـ بان ، لێو نگارهوه
بۆ زێدهـ لهـ ههموویان بهـ بێکیفایهتی بهـ منت دا ئاوه
نهجیبهـ ، پهرچهمی خاوت چینچینه
یهخسیر نهبی تو ئهو جار
دڵخۆشێم پێت بوو دهمگوت ئینشەڵڵا نیژراوه
کوتی ئهوهـ کێیهـ ڕامدهوهشێنێ
شهش و حهوتان دهکوژم ئهمنیش وهک کابرای نواوێ
محەممەد شیرن لاوهـ لهـ رێگایەی لا داوه
کوتی لە ڕکێف سوار بهـ وهکوو مەرد
ئهمیر ههتا خولەفا
بههۆی ئهوهی بابهتی کرداریمان زۆره
با دانیشین لهـ بن داری ئهو قۆخه
چبکەم ئاوری جگهره
یاخودا ههر وا گهردوتۆز بێ"""
from klpt.preprocess import Preprocess
# KLPT is useful in this case to remove TATWEEL
preprocessor_ckb = Preprocess("Sorani", "Arabic", numeral="Latin")
text = resolve_ae(preprocessor_ckb.preprocess(text))
print(text)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment