CoolFace
Apppublic

MRiwu/Collection

sourceHugging Facemitupdated 4y agoView on Hugging Face
1likes
korean.py211 linesDownload Raw Back to text
1import re2from jamo import h2j, j2hcj3import ko_pron4 5 6# This is a list of Korean classifiers preceded by pure Korean numerals.7_korean_classifiers = '군데 권 개 그루 닢 대 두 마리 모 모금 뭇 발 발짝 방 번 벌 보루 살 수 술 시 쌈 움큼 정 짝 채 척 첩 축 켤레 톨 통'8 9# List of (hangul, hangul divided) pairs:10_hangul_divided = [(re.compile('%s' % x[0]), x[1]) for x in [11    ('ㄳ', 'ㄱㅅ'),12    ('ㄵ', 'ㄴㅈ'),13    ('ㄶ', 'ㄴㅎ'),14    ('ㄺ', 'ㄹㄱ'),15    ('ㄻ', 'ㄹㅁ'),16    ('ㄼ', 'ㄹㅂ'),17    ('ㄽ', 'ㄹㅅ'),18    ('ㄾ', 'ㄹㅌ'),19    ('ㄿ', 'ㄹㅍ'),20    ('ㅀ', 'ㄹㅎ'),21    ('ㅄ', 'ㅂㅅ'),22    ('ㅘ', 'ㅗㅏ'),23    ('ㅙ', 'ㅗㅐ'),24    ('ㅚ', 'ㅗㅣ'),25    ('ㅝ', 'ㅜㅓ'),26    ('ㅞ', 'ㅜㅔ'),27    ('ㅟ', 'ㅜㅣ'),28    ('ㅢ', 'ㅡㅣ'),29    ('ㅑ', 'ㅣㅏ'),30    ('ㅒ', 'ㅣㅐ'),31    ('ㅕ', 'ㅣㅓ'),32    ('ㅖ', 'ㅣㅔ'),33    ('ㅛ', 'ㅣㅗ'),34    ('ㅠ', 'ㅣㅜ')35]]36 37# List of (Latin alphabet, hangul) pairs:38_latin_to_hangul = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [39    ('a', '에이'),40    ('b', '비'),41    ('c', '시'),42    ('d', '디'),43    ('e', '이'),44    ('f', '에프'),45    ('g', '지'),46    ('h', '에이치'),47    ('i', '아이'),48    ('j', '제이'),49    ('k', '케이'),50    ('l', '엘'),51    ('m', '엠'),52    ('n', '엔'),53    ('o', '오'),54    ('p', '피'),55    ('q', '큐'),56    ('r', '아르'),57    ('s', '에스'),58    ('t', '티'),59    ('u', '유'),60    ('v', '브이'),61    ('w', '더블유'),62    ('x', '엑스'),63    ('y', '와이'),64    ('z', '제트')65]]66 67# List of (ipa, lazy ipa) pairs:68_ipa_to_lazy_ipa = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [69    ('t͡ɕ','ʧ'),70    ('d͡ʑ','ʥ'),71    ('ɲ','n^'),72    ('ɕ','ʃ'),73    ('ʷ','w'),74    ('ɭ','l`'),75    ('ʎ','ɾ'),76    ('ɣ','ŋ'),77    ('ɰ','ɯ'),78    ('ʝ','j'),79    ('ʌ','ə'),80    ('ɡ','g'),81    ('\u031a','#'),82    ('\u0348','='),83    ('\u031e',''),84    ('\u0320',''),85    ('\u0339','')86]]87 88 89def latin_to_hangul(text):90    for regex, replacement in _latin_to_hangul:91        text = re.sub(regex, replacement, text)92    return text93 94 95def divide_hangul(text):96    text = j2hcj(h2j(text))97    for regex, replacement in _hangul_divided:98        text = re.sub(regex, replacement, text)99    return text100 101 102def hangul_number(num, sino=True):103    '''Reference https://github.com/Kyubyong/g2pK'''104    num = re.sub(',', '', num)105 106    if num == '0':107        return '영'108    if not sino and num == '20':109        return '스무'110 111    digits = '123456789'112    names = '일이삼사오육칠팔구'113    digit2name = {d: n for d, n in zip(digits, names)}114 115    modifiers = '한 두 세 네 다섯 여섯 일곱 여덟 아홉'116    decimals = '열 스물 서른 마흔 쉰 예순 일흔 여든 아흔'117    digit2mod = {d: mod for d, mod in zip(digits, modifiers.split())}118    digit2dec = {d: dec for d, dec in zip(digits, decimals.split())}119 120    spelledout = []121    for i, digit in enumerate(num):122        i = len(num) - i - 1123        if sino:124            if i == 0:125                name = digit2name.get(digit, '')126            elif i == 1:127                name = digit2name.get(digit, '') + '십'128                name = name.replace('일십', '십')129        else:130            if i == 0:131                name = digit2mod.get(digit, '')132            elif i == 1:133                name = digit2dec.get(digit, '')134        if digit == '0':135            if i % 4 == 0:136                last_three = spelledout[-min(3, len(spelledout)):]137                if ''.join(last_three) == '':138                    spelledout.append('')139                    continue140            else:141                spelledout.append('')142                continue143        if i == 2:144            name = digit2name.get(digit, '') + '백'145            name = name.replace('일백', '백')146        elif i == 3:147            name = digit2name.get(digit, '') + '천'148            name = name.replace('일천', '천')149        elif i == 4:150            name = digit2name.get(digit, '') + '만'151            name = name.replace('일만', '만')152        elif i == 5:153            name = digit2name.get(digit, '') + '십'154            name = name.replace('일십', '십')155        elif i == 6:156            name = digit2name.get(digit, '') + '백'157            name = name.replace('일백', '백')158        elif i == 7:159            name = digit2name.get(digit, '') + '천'160            name = name.replace('일천', '천')161        elif i == 8:162            name = digit2name.get(digit, '') + '억'163        elif i == 9:164            name = digit2name.get(digit, '') + '십'165        elif i == 10:166            name = digit2name.get(digit, '') + '백'167        elif i == 11:168            name = digit2name.get(digit, '') + '천'169        elif i == 12:170            name = digit2name.get(digit, '') + '조'171        elif i == 13:172            name = digit2name.get(digit, '') + '십'173        elif i == 14:174            name = digit2name.get(digit, '') + '백'175        elif i == 15:176            name = digit2name.get(digit, '') + '천'177        spelledout.append(name)178    return ''.join(elem for elem in spelledout)179 180 181def number_to_hangul(text):182    '''Reference https://github.com/Kyubyong/g2pK'''183    tokens = set(re.findall(r'(\d[\d,]*)([\uac00-\ud71f]+)', text))184    for token in tokens:185        num, classifier = token186        if classifier[:2] in _korean_classifiers or classifier[0] in _korean_classifiers:187            spelledout = hangul_number(num, sino=False)188        else:189            spelledout = hangul_number(num, sino=True)190        text = text.replace(f'{num}{classifier}', f'{spelledout}{classifier}')191    # digit by digit for remaining digits192    digits = '0123456789'193    names = '영일이삼사오육칠팔구'194    for d, n in zip(digits, names):195        text = text.replace(d, n)196    return text197 198 199def korean_to_lazy_ipa(text):200    text = latin_to_hangul(text)201    text = number_to_hangul(text)202    text=re.sub('[\uac00-\ud7af]+',lambda x:ko_pron.romanise(x.group(0),'ipa').split('] ~ [')[0],text)203    for regex, replacement in _ipa_to_lazy_ipa:204        text = re.sub(regex, replacement, text)205    return text206 207 208def korean_to_ipa(text):209    text = korean_to_lazy_ipa(text)210    return text.replace('ʧ','tʃ').replace('ʥ','dʑ')211