알파벳으로 한글 쓰기 0r2#rld7lxolNJ 6rLrlN ^^-7l

2020. 10. 27. 19:44nlp

반응형

 

0r2#rld7lxolNJ 6rLrlN ^^-7l

0r2 알

#r 파 

ld7lx 벳

ol 으 (왼쪽 90도 회전)

NJ 로 (왼쪽 90도 회전)

 

6rL 한

rlN 글 (왼쪽 90도 회전)

 

^^- 쓰 

7l 기 

 

ㅎㅎㅎ 억지스러운 것도 있지만 

요즘 사람들은 이렇게 아이디 만든다며?!?!?! 

난 영어 자판으로 해놓고 한글 쓰는뎁 

 

파이썬으로  함수 만들었는데 웹페이지로 어떻게 만드는지 모르겠다. 엄청 어렵네 

 

우선 한땀한땀 열심히 딕셔너리를 만들고 

# 'key' : [[있는 그대로의 형태], [왼쪽으로 90도 회전한 형태], [오른쪽으로 90도 회전한 형태], [180도 회전한 형태]]
onset_dict = {
'ㄱ': [['7'], ['r'], ['_l'], ['L']],
'ㄲ': [['77'], ['F'], [], []],
'ㄴ': [['L', 'l_'], ['J', 'v', 'V', 'j', '_l'], ['r'], ['7']],
'ㄷ': [['C', 'c', '<'], ['u', 'U'], ['n'], []],
'ㄸ': [['CC', 'cc', '<<'], [], ['fl', 'Fl'], ['>>']],
'ㄹ': [['2', 'z'], ['N', 'W', 'w', 'ru'], ['ru'], ['z', 'Z']],
'ㅁ': [['17', '12', 'D'], ['D'], ['D'], ['D']],
'ㅂ' : [['ld'], [], [], ['fl', 'Fl']],
'ㅃ': [['ldld'], [], [], []],
'ㅅ': [['^', 'x'], ['<', 'c', 'x','X', 'T'], ['>', 'T', '7'], ['v',' V', 'y', 'x']],
'ㅆ': [['^^', 'xx'], [], [], ['vv', 'VV', 'yy', 'xx']],
'ㅇ': [['0', 'o', 'O'], ['0', 'o', 'O'], ['0', 'o', 'O'], ['0', 'o', 'O']],
'ㅈ' : [['z', 'Z'], ['K', 'k'], [], []],
'ㅉ': [['zz', 'ZZ'], [], [], []],
'ㅊ': [[], ['lk', 'lK'], [], []],
'ㅋ': [[], ['lr'], ['_ll'], []],
'ㅌ': [['E'], [], ['rn'], ['3']],
'ㅍ': [['#'], ['lxl'], ['lxl'], []],
'ㅎ': [['6'], ['lb', 'lp', 'lo', '1o', '|o', 'llo'], ['ql', 'or', 'dl', 'ol', 'o1', 'o|', 'oll'], ['e', 'g']] }

nucleus_dict = {
'ㅏ': [['r', 'l-'], [], [], ['-l']],
'ㅐ': [['H', 'rl', 'h'], [], [], ['rl', 'H']],
'ㅑ': [['f', 'F'], [], [], ['xl', 'Xl', 'zl', 'Zl' ]],
'ㅒ': [['lxl', 'kl', 'tl', 'fl'], [], [], ['lxl', 'kl', 'tl', 'fl']],
'ㅓ': [['-l'], [], [], ['r', 'L']],
'ㅔ': [['7l'], [], [], ['lr', 'lL']],
'ㅕ': [['xl', 'Xl', 'zl', 'Zl'], [], [], ['f', 'k']],
'ㅖ': [['xl'], [], [], ['lk', 'lf', 'lt']],
'ㅗ' : [[], ['J', '-l'], ['r'], []],
'ㅘ': [['Lr'], [], [], []],
'ㅙ': [['LH'], [], [], ['HT']],
'ㅚ': [['Ll'], [], [], ['lT']],
'ㅛ': [[], ['zl', 'Zl', '3l'], ['k', 'K', 'f', 'F'], []],
'ㅜ': [[], ['r',  'l-'], ['y', '-l'], []],
'ㅝ': [[], ['rT'], [], []],
'ㅞ': [[], [], [], []],
'ㅟ': [['7l'], [], [], []],
'ㅠ': [[], ['F', 'f', 'k', 'K'], ['zl', 'Zl', '3l'], []],
'ㅡ' : [['-'], ['l', '1', '|'], ['l', '1', '|'], ['-']],
'ㅣ' : [['l', '1', '|'], ['-'], ['_',], ['l', '1', '|']],
'ㅢ': [['-l'], ['T'], ['L'], ['l-']] }


coda_dict = {
'ㄱ': [['7'], ['r'], ['_l'], ['L']],
'ㄲ': [['77'], ['F'], [], []],
'ㄳ': [[], [], [], []],
'ㄴ': [['L', 'l_'], ['J', 'v', 'V', 'j', '_l'], ['r'], ['7']],
'ㄵ': [[], [], [], []],
'ㄶ': [[], [], [], []],
'ㄷ': [['C', 'c', '<'], ['u', 'U'], ['n'], []],
'ㄹ': [['2', 'z'], ['N', 'W', 'w', 'ru'], ['ru'], ['z', 'Z']],
'ㄺ': [['27', 'z7'], [], [], ['LZ', 'Lz']],
'ㄻ': [['212', '2D'], [], [], ['Dz', 'DZ']],
'ㄼ': [['2ld', 'zld'], [], [], ['flz', 'FlZ']],
'ㄽ': [['zx', '2X'], [], [], ['vz', 'VZ', 'yz', 'xz']],
'ㄾ': [['zE', 'ZE', '2E'], [], [], ['3z', '3Z']],
'ㄿ': [[], [], [], []],
'ㅀ': [['z6'], [], [], ['ez', 'gz']],
'ㅁ': [['17', '12', 'D'], ['D'], ['D'], ['D']],
'ㅂ': [['ld'], [], [], ['fl', 'Fl']],
'ㅄ': [['ldx'], [], [], ['vfl', 'VFl']],
'ㅅ': [['^', 'x'], ['<', 'c', 'x','X', 'T'], ['>', 'T', '7'], ['v',' V', 'y', 'x']],
'ㅆ': [['^^', 'xx'], [], [], ['vv', 'VV', 'yy', 'xx']],
'ㅇ': [['0', 'o', 'O'], ['0', 'o', 'O'], ['0', 'o', 'O'], ['0', 'o', 'O']],
'ㅈ': [['z', 'Z'], ['K', 'k'], [], []],
'ㅊ': [[], ['lk', 'lK'], [], []],
'ㅋ': [[], ['lr'], ['_ll'], []],
'ㅌ': [['E'], [], ['rn'], ['3']],
'ㅍ': [[], ['lxl'], ['lxl'], []],
'ㅎ': [['6'], ['lb', 'lp', 'lo', '1o', '|o', 'llo'], ['ql', 'or', 'dl', 'ol', 'o1', 'o|', 'oll'], ['e', 'g']] }

 

대충 합치면 됨 

 

# 한 음절 -> 알파벳 상형 변환 
def syl_to_alphabet(syl, explain=False):
    result = []
    explanation = []
    
    explain_dict = {0: '있는 그대로의 형태', 1:'왼쪽으로 90도 회전한 형태', 2:'오른쪽으로 90도 회전한 형태', 3:'180도 회전한 형태'}
        
    # 받침 없는 경우 
    if coda(syl) == 0:
        on = onsets[onset(syl)] 
        nu = nuclei[nucleus(syl)] 

        # i==0 : 초성, 중성 모두 있는 그대로의 형태로 표현 가능한 경우
        # i==1 : 초성, 중성 모두 왼쪽으로 90도 회전한 형태로 표현 가능한 경우
        # i==2 : 초성, 중성 모두 오른쪽으로 90도 회전한 형태로 표현 가능한 경우
        # i==3 : 초성, 중성 모두 180도 회전한 형태로 표현 가능한 경우
        for i in range(4):
            if onset_dict[on][i] != [] and nucleus_dict[nu][i] != [ ]:
                for x in range(len(onset_dict[on][i])):
                    for y in range(len(nucleus_dict[nu][i])):
                        if i != 3: 
                            result.append(onset_dict[on][i][x] + nucleus_dict[nu][i][y])
                            explanation.append(explain_dict[i])
                        # 180도 회전한 경우 초성, 종성 순서 바뀌어야 함 
                        else:
                            result.append(nucleus_dict[nu][i][y] + onset_dict[on][i][x])
                            explanation.append(explain_dict[i])

    # 받침 있는 경우    
    else:
        on = onsets[onset(syl)] 
        nu = nuclei[nucleus(syl)] 
        co = codas[coda(syl)] 
        
        '''
        ㅓㅇ = a 
        ㅣㄴ = L, l_
        ㅕㅇ = zb 
        ㅏㅇ = 6 
        ㅕㄴ = _t 
        ㅣㅁ = b 
        ㅓㄴ = z
        '''
        
        exception = [['ㅓ', 'ㅇ', 'a'], ['ㅣ', 'ㄴ', 'L'], ['ㅕ', 'ㅇ', 'zb'], ['ㅏ', 'ㅇ', '6'], ['ㅕ', 'ㄴ', '_t'], \
                    ['l', 'ㅁ', 'b'], ['ㅓ', 'ㄴ', 'z']]

        
        for exc in range(len(exception)):
            if nu == exception[exc][0] and co == exception[exc][1] and onset_dict[on][0] != []:
                for e in range(len(onset_dict[on][0])):
                    result.append(onset_dict[on][0][e] + exception[exc][2])
                    explanation.append(explain_dict[0])
        

        # i==0 : 초성, 중성 모두 있는 그대로의 형태로 표현 가능한 경우
        # i==1 : 초성, 중성 모두 왼쪽으로 90도 회전한 형태로 표현 가능한 경우
        # i==2 : 초성, 중성 모두 오른쪽으로 90도 회전한 형태로 표현 가능한 경우
        # 받침 있으면 있는 그대로 또는 180도 회전 불가 (모아쓰기 불가)
        for i in range(3):
            if onset_dict[on][i] != [] and nucleus_dict[nu][i] != [ ] and coda_dict[co][i] != [ ]:
                for x in range(len(onset_dict[on][i])):
                    for y in range(len(nucleus_dict[nu][i])):
                        for z in range(len(coda_dict[co][i])):
                            if i != 2:
                                result.append(onset_dict[on][i][x] + nucleus_dict[nu][i][y] + coda_dict[co][i][z])
                                explanation.append(explain_dict[i])
                            # 오른쪽으로 90도 회전한 경우 초성, 종성, 종성 순서 바뀌어야 함 
                            else:
                                result.append(coda_dict[co][i][z] + nucleus_dict[nu][i][y] + onset_dict[on][i][x])
                                explanation.append(explain_dict[i])

    
    if explain:
        return pd.DataFrame(zip(result, explanation), columns=[syl, 'explanation'])
    
    else:
        return result

 

explain = True 하면 이런 식으로 나온다 

 

 

def word_to_alphabet(word):
    syls = []
    for i in range(len(word)):
        df = syl_to_alphabet(word[i], explain=True)
        syls.append(df.iloc[:,0].tolist())
    
    result = []
    
    for i in map(''.join, list(itertools.product(*syls))):
        result.append(i)
    
    return result        

 

 

잘 된 결과 몇 개 자랑

받침 없어야 잘 된다 

 

0rKr = 우주 (왼쪽으로 90도 회전)

ldrLrLr = 바나나 

 

 

반응형