# -*- coding: utf-8 -*-
"""한국어 시제 표현 nlp.ipynb

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/1rRxXNxGmTIgTNOl5ub6xEVSLstWW0cgZ
"""

import re

from soynlp.hangle import compose, decompose

"""현재형"""

def present(verb):
  import re
  from soynlp.hangle import compose, decompose
  def present_(verb): 

    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=verb[:-1]      #어간은 마지막 문자인 '-다'를 삭제한 나머지 부분
    n=len(eogan)
    c0, c1, c2 = decompose(eogan[-1])

    if verb== '이다':    
      return (verb)

    if verb.endswith('하다'):             #1. ~하다 로 끝나는 동사
      eogan=re.sub(r'하다','',verb)
      return (eogan+'한다')
    else:                         #2. ~하다 로 끝나지 않는 동사
      if ends_with_jong(eogan):   # 2-1 어간이 자음으로 끝나는 동사
        if c2=='ㄹ':          #ㄹ 불규칙 ex. 살다 -> 산다, 밀다->민다
          result=eogan[:(n-1)]+compose(c0,c1,'ㄴ')+'다'
          return(result)
        else:                 #-ㄹ로 끝나지 않는 
          return(eogan+'는다')
      else:                       #2-2 어간에 받침이 없는 동사    #ex. 사귀다, 가다, 속삭이다
          result= eogan[:(n-1)] + compose(c0, c1, 'ㄴ')+ '다'
          return(result)

  if len(present_(verb))< len(verb):  # 잘못 추출된 동사들은 변형하지 않고 원형 그대로 배출
    return(verb)
  return(present_(verb))


"""현재진행형"""

def present_progressive(verb):
  def present_progressive_ (verb):
    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=verb[:-1]      #어간은 마지막 문자인 '-다'를 삭제한 나머지 부분
    
    if verb== '이다':    
      return (verb)

    if verb.endswith('하다'):   #1. ~하다 로 끝나는 동사
      eogan=re.sub(r'하다','',verb)  
      return (eogan+'하는 중이다', eogan+'하고 있다')
      
    else: #2. ~하다 로 끝나지 않는 동사
        c0, c1, c2 = decompose(eogan[-1])
        if c2=='ㄹ':          #ㄹ 불규칙 ex. 살다 -> 산다, 밀다->민다
          c2=' '
          result=compose(c0,c1,c2)+'는 중이다'
          result2= eogan+'고 있다'
          return(result,result2) 
        if c2 !='ㄹ':          #ㄹ 불규칙 제외, ~하다로 끝나지 않는 동사
          return (eogan+'는 중이다', eogan+'고 있다')
  if len(present_progressive_(verb)[0])< len(verb):  # 잘못 추출된 동사들은 변형하지 않고 원형 그대로 배출
    return(verb)
  return(present_progressive_(verb))


"""미래형"""

def future(verb):
  def future_(verb): 
    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=verb[:-1]      #어간은 마지막 문자인 '-다'를 삭제한 나머지 부분
    n=len(eogan)
    exception=['닫다','돋다','뜯다','믿다','받다','벋다','뻗다','얻다','곧다','굳다'] #ㄷ불규칙의 예외
    exception_match=[i for i in range(len(exception)) if exception[i] in verb] #exception의 동사를 포함하는 '쥐어뜯다'까지 포함
    exception2=['벗다', '웃다','솟다', '씻다', '앗다', '빼앗다'] #ㅅ불규칙의 예외
    exception_match2=[i for i in range(len(exception2)) if exception2[i] in verb] #exception2의 동사를 포함하는 '치솟다'까지 포함
    
    if verb== '이다':   
      result= '이겠다'
      result2= '일 것이다'
      result3= '일 거다'
      return (result,result2,result3)


    if verb.endswith('하다'):             #2. ~하다 로 끝나는 동사
      eogan=re.sub(r'하다','',verb)  
      result=eogan+'하겠다'
      result2=eogan+'하기로 했다'
      result3=eogan+'할 예정이다'
      result4=eogan+'할 계획이다'
      result5=eogan+'할 것이다'
      result6=eogan+'할 거다'
      return(result,result2,result3,result4,result5,result6)


    else:                         #3. ~하다 로 끝나지 않는 동사
        if ends_with_jong(eogan):  #3-1. 어간이 자음으로 끝나는 동사
          c0, c1, c2 = decompose(eogan[-1])
          if c2=='ㄹ':             #3-1-1 어간이 -ㄹ로 끝나는 동사
            result=eogan+'겠다'
            result2=eogan+'기로 했다'
            result3=eogan+' 예정이다'
            result4=eogan+' 계획이다'
            result5=eogan+' 것이다'
            result6=eogan+' 거다'
            return(result,result2,result3,result4,result5,result6)
          if c2!= 'ㄹ':                 #3-2 어간이 -ㄹ로 끝나지 않는 동사
            if c2=='ㅂ' and c1=='ㅜ':                 #3-2-1 ㅂ불규칙 활용(모음조화) ex. 굽다, 돕다 
              result=eogan+'겠다'
              result2=eogan+'기로 했다'
              result3=compose(c0,c1,' ')+'울 예정이다'
              result4=compose(c0,c1,' ')+'울 계획이다'
              result5=compose(c0,c1,' ')+'울 것이다'
              result6=compose(c0,c1,' ')+'울 거다'
              return(result,result2,result3,result4,result5,result6)
            if c2=='ㅂ' and c1=='ㅗ': 
              result=eogan+'겠다'
              result2=eogan+'기로 했다'
              result3=compose(c0,c1,' ')+'울 예정이다'
              result4=compose(c0,c1,' ')+'울 계획이다'
              result5=compose(c0,c1,' ')+'울 것이다'
              result6=compose(c0,c1,' ')+'울 거다'
              return(result,result2,result3,result4,result5,result6)
            if not exception_match2 and c2=='ㅅ':                #3-2-2 ㅅ 불규칙활용 (벗다는 예외) ex. 긋다, 낫다
              result=eogan+'겠다'
              result2=eogan+'기로 했다'
              result3=compose(c0,c1,' ')+'을 예정이다'
              result4=compose(c0,c1,' ')+'을 계획이다'
              result5=compose(c0,c1,' ')+'을 것이다'
              result6=compose(c0,c1,' ')+'을 거다'
              return(result,result2,result3,result4,result5,result6)

            if verb=='깨닫다' or not exception_match and c2=='ㄷ': # 3-2-3 ㄷ 불규칙 활용 ex. 싣다-> 실을 예정이다      
                result= eogan + '겠다'           
                result2= eogan + '기로 했다'  
                result3= eogan[:(n-1)] +compose(c0,c1,'ㄹ')+'을 예정이다'            
                result4= eogan[:(n-1)] +compose(c0,c1,'ㄹ')+'을 계획이다'
                result5= eogan[:(n-1)] +compose(c0,c1,'ㄹ')+'을 것이다'
                result6= eogan[:(n-1)] +compose(c0,c1,'ㄹ')+'을 거다'
                return(result,result2,result3,result4,result5,result6)

            else:                     #3-2-3 ex. 죽겠다
              result=eogan+'겠다'
              result2=eogan+'기로 했다'
              result3=eogan+'을 예정이다'
              result4=eogan+'을 계획이다'
              result5=eogan+'을 것이다'
              result6=eogan+'을 거다'
              return(result,result2,result3,result4,result5,result6)
        else:                            #3-3 어간이 모음으로 끝나는 동사
            c0, c1, c2 = decompose(eogan[-1])
            if len(eogan)==1:         #어간이 1글자 # ex. 자다, 가다
              result=eogan+'겠다'
              result2=eogan+'기로 했다'
              result3=compose(c0, c1, 'ㄹ')+ ' 예정이다'
              result4=compose(c0, c1, 'ㄹ')+ ' 계획이다'
              result5=compose(c0, c1, 'ㄹ')+ ' 것이다'
              result6=compose(c0, c1, 'ㄹ')+ ' 거다'
              return(result,result2,result3,result4,result5,result6)

            if len(eogan)>=2:         #어간이 2글자 이상 #ex. 사귀다, 속삭이다
              result=eogan+'겠다'
              result2=eogan+'기로 했다'
              result3=eogan[:(n-1)] + compose(c0, c1, 'ㄹ')+ ' 예정이다'
              result4=eogan[:(n-1)] + compose(c0, c1, 'ㄹ')+ ' 계획이다'
              result5=eogan[:(n-1)] + compose(c0, c1, 'ㄹ')+ ' 것이다'
              result6=eogan[:(n-1)] + compose(c0, c1, 'ㄹ')+ ' 거다'
              return(result,result2,result3,result4,result5,result6)
  if len(future_(verb)[0])< len(verb):  # 잘못 추출된 동사들은 변형하지 않고 원형 그대로 배출
    return(verb)
  return(future_(verb))


"""과거형"""

def past(verb):
  def past_ (verb): 
    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=verb[:-1]      #어간은 마지막 문자인 '-다'를 삭제한 나머지 부분
    yangsung_c=['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ'] #모음조화
    eumsung_c=['ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ','ㅣ']
    n=len(eogan)
    exception=['닫다','돋다','뜯다','믿다','받다','벋다','뻗다','얻다','곧다','굳다'] #ㄷ불규칙의 예외
    exception_match=[i for i in range(len(exception)) if exception[i] in verb] #exception의 동사를 포함하는 '쥐어뜯다'까지 포함
    exception2=['벗다', '웃다','솟다', '씻다', '앗다', '빼앗다'] #ㅅ불규칙의 예외
    exception_match2=[i for i in range(len(exception2)) if exception2[i] in verb] #exception2의 동사를 포함하는 '치솟다'까지 포함
    exception3=['따르다', '치르다'] #르 불규칙의 예외
    exception_match3=[i for i in range(len(exception3)) if exception3[i] in verb] #exception3의 동사를 포함하는 '뒤따르다'까지 포함    
    c0, c1, c2 = decompose(eogan[-1]) 


    if verb.endswith('하다'):             #1. ~하다 로 끝나는 동사
      eogan=re.sub(r'하다','',verb) 
      result= eogan+'했다'
      result2= eogan+'했었다'
      result3= eogan+'하더라'
      return (result,result2,result3)
    
    if verb.endswith('이다'):          #2. -이다 (ex. ㅇㅇ이다, 속삭이다)
      result=verb.replace('이다','였다')
      result2=verb.replace('이다','였더라')
      result3=verb.replace('이다','였었다')
      return (result,result2,result3)

    else:                        #3. ~하다,이다 로 끝나지 않는 동사   
      if c1=='ㅏ' or c1=='ㅗ':         # 3-1. 어간의 마지막 모음이 ㅏ/ㅗ인 동사  --> 았 / 었 모음조화 때문에 모음 구분   
        if ends_with_jong(eogan):   
          if c2=='ㅂ' and c1=='ㅗ':  # ㅂ 불규칙 용언(모음조화) ex. 돕다
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'왔다'
            result2= eogan[:(n-1)]+ compose(c0,c1,' ')+'왔었다'
            result3= eogan+'더라'
            return(result, result2,result3)
          if not exception_match and c2=='ㄷ' or verb=='깨닫다':              #ㄷ 불규칙 (양성모음조화# 모음이 ㅏ,ㅗ인 동사의 경우에는 ㄹ로 변형하도록 (깨달았다-> 예외인 '닫다'를 포함하는 동사지만 규칙 활용하므로 따로 처리)
            result= eogan[:(n-1)]+compose(c0,c1,'ㄹ')+'았다'  #모음이 ㅏ,ㅗ인 동사: 닫다 => 동음이의어에 대한 문제.. 일단 '닫았다'로
            result2= eogan[:(n-1)]+ compose(c0,c1,'ㄹ')+'았었다'
            result3= eogan+'더라'
            return(result, result2,result3)
          if not exception_match2 and c2=='ㅅ':      #ㅅ 불규칙 
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'았다'
            result2= eogan[:(n-1)]+compose(c0,c1,' ')+'았었다'
            result3= eogan+'더라'
            return(result, result2,result3)

            
          else:                     # 3-1-2 어간의 마지막 모음이 ㅏ/ㅗ이면서 자음으로 끝나는 동사 ex.좋+았다
            result= eogan+'았다'
            result2= eogan+'았었다'
            result3= eogan+'더라'
            return(result, result2,result3)

          
        else:                       # 3-1-2 어간의 마지막 모음이 ㅏ/ㅗ이면서 모음으로 끝나는 동사 ex.가+ㅆ다
          if c0=='ㅇ'or'ㅂ' and c1 =='ㅗ': # 오 불규칙 (오다->왔다, 보다->봤다)
                result=eogan[:(n-1)] + compose(c0, 'ㅘ', 'ㅆ')+ '다'
                result2=eogan[:(n-1)] + compose(c0, 'ㅘ', 'ㅆ')+ '었다'
                result3=eogan+'더라'
                return(result,result2,result3)

          else:                      #오 불규칙을 따르지 않음. ex.지나다
                result=eogan[:(n-1)] + compose(c0, c1, 'ㅆ')+ '다'
                result2=eogan[:(n-1)] + compose(c0, c1, 'ㅆ')+ '었다'
                result3=eogan+'더라'
                return(result,result2,result3)


      else:                         #3-2. 어간의 마지막 모음이 ㅏ/ㅗ이 아닌 동사 
        if ends_with_jong(eogan):   #3-2-2 어간의 마지막 모음이 ㅏ/ㅗ이 아니면서 자음으로 끝나는 동사 ex. 먹+었다, 울+었다, 신+었다
          if c1=='ㅜ' and c2=='ㅂ':            #ㅂ불규칙 활용(모음조화)
            result= compose(c0,c1,' ')+'웠다'
            result2= compose(c0,c1,' ')+'웠었다'
            result3= eogan+'더라'
            return(result, result2,result3)
          if not exception_match2 and c2=='ㅅ':      #ㅅ 불규칙 ex. 긋다->그었다
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'었다'
            result2= eogan[:(n-1)]+compose(c0,c1,' ')+'었었다'
            result3= eogan+'더라'
            return(result, result2,result3)
            
          if not exception_match and c2=='ㄷ':                     #ㄷ 불규칙 (음성모음조화) # 모음이 ㅏ,ㅗ아닌 동사: 일컫다->일컬었다
              result= eogan[:(n-1)]+compose(c0,c1,'ㄹ')+'었다'
              result2= eogan[:(n-1)]+ compose(c0,c1,'ㄹ')+'었었다'
              result3= eogan+'더라'
              return(result, result2,result3)
          else:
            result= eogan+'었다'
            result2= eogan+'었었다'
            result3= eogan+'더라'
            return(result, result2,result3)
        
        else:                      #3-2-3 어간의 마지막 모음이 ㅏ/ㅗ이 아니면서 모음으로 끝나는 동사 ex.섰다, 졌다 , 껐다, 건너다
          if c1=='ㅓ':
            result=eogan[:(n-1)] + compose(c0, c1, 'ㅆ')+ '다'
            result2=eogan[:(n-1)] + compose(c0, c1, 'ㅆ')+ '었다'
            result3=eogan+'더라'
            return(result,result2,result3)

          elif c1=='ㅣ':      
              result= eogan[:(n-1)] + compose(c0,'ㅕ','ㅆ')+'다'
              result2= eogan[:(n-1)] + compose(c0,'ㅕ','ㅆ')+'었다'
              result3= eogan+'더라'
              return(result, result2,result3)

          elif c1=='ㅡ':         
              if c0=='ㄹ':        #르 불규칙 ex. 부르다->불렀다, 가로지르다->가로질렀다
                if not exception_match3:   #르 불규칙의 예외 동사
                  ee0, ee1, ee2 = decompose(eogan[-2])
                  if ee1 in eumsung_c:
                    result= eogan[:-2]+compose(ee0,ee1,'ㄹ') +compose(c0,'ㅓ','ㅆ')+'다'
                    result2= eogan[:-2]+compose(ee0,ee1,'ㄹ') +compose(c0,'ㅓ','ㅆ')+'었다'
                    result3= eogan+'더라'
                    return(result, result2,result3)
                  elif ee1 in yangsung_c:         #나르다-> 날라
                    result= eogan[:-2]+compose(ee0,ee1,'ㄹ') +compose(c0,'ㅏ','ㅆ')+'다'
                    result2= eogan[:-2]+compose(ee0,ee1,'ㄹ') +compose(c0,'ㅏ','ㅆ')+'었다'
                    result3= eogan+'더라'
                    return(result, result2,result3)


                if exception_match3:   #르 불규칙의 예외
                    e0, e1, e2 = decompose(eogan[0])
                    ee0, ee1, ee2 = decompose(eogan[-2])
                    if ee1 in eumsung_c:          
                      result= eogan[:(n-1)] +compose(c0,'ㅓ','ㅆ')+'다'
                      result2= eogan[:(n-1)] +compose(c0,'ㅓ','ㅆ')+'었다'
                      result3= eogan+'더라'
                      return(result, result2,result3)
                    if ee1 in yangsung_c:
                      result= eogan[:(n-1)] +compose(c0,'ㅏ','ㅆ')+'다'
                      result2= eogan[:(n-1)] +compose(c0,'ㅏ','ㅆ')+'었다'
                      result3= eogan+'더라'
                      return(result, result2,result3)

              else:           #르 불규칙 아닌, 어간의 마지막 모음이 ㅡ인 동사들 ex. 끄다 -> 껐다  
                e0, e1, e2 = decompose(eogan[0])
                if e1 in yangsung_c:
                  result= eogan[:(n-1)] + compose(c0,'ㅏ','ㅆ')+'다'
                  result2= eogan[:(n-1)] + compose(c0,'ㅏ','ㅆ')+'었다'
                  result3= eogan+'더라'
                  return(result, result2,result3)
                else:
                  result= eogan[:(n-1)] + compose(c0,'ㅓ','ㅆ')+'다'
                  result2= eogan[:(n-1)] + compose(c0,'ㅓ','ㅆ')+'었다'
                  result3= eogan+'더라'
                  return(result, result2,result3)

          else:                     
            if c1=='ㅜ' and verb!= '푸다':  #ex. 모음축약 (우 불규칙) /예외:푸다-> *풔, 퍼 #ex. 주다->줬다
                result= eogan[:(n-1)] + compose(c0,'ㅝ','ㅆ')+'다'
                result2= eogan[:(n-1)] + compose(c0,'ㅝ','ㅆ')+'었다'
                result3= eogan+'더라'
                return(result, result2,result3)
            if verb=='푸다':                #우 불규칙 예외
                return ('펐다', '펐었다', '펐더라')

            else:  #ex.사귀다, 되다, 뛰다
              if c0=='ㅇ' and c1=='ㅐ':   #ex. 사동표현 '애': ex. 없애다 -> 없앴다
                result= eogan[:(n-1)] + compose(c0,c1,'ㅆ')+'다'
                result2= eogan[:(n-1)] + compose(c0,c1,'ㅆ')+'었다'
                result3= eogan+'더라'
                return(result, result2,result3)
              else:          #ex.사귀다, 되다, 뛰다
                result= eogan+'었다'
                result2= eogan+'었었다'
                result3= eogan+'더라'
                return(result, result2,result3)

  if len(past_(verb)[0])< len(verb):  # 잘못 추출된 동사들은 변형하지 않고 원형 그대로 배출
    return(verb)
  return(past_(verb))


"""피동(이히리기)"""

passive_verb = ['방해하다', '쓰다', '따르다','쥐어뜯다', '헐뜯다', '믿다', '열다', '꿇다','빨다', '쌓다', '입다', '짓밟다', '앉다', '치르다', '누르다', '부르다', '바꾸다', '물다', '잡다', '치다', '죽다', '살다', '살해하다', '보다', '보다', '먹다', '들다', '찢다','잊다']

#동사원형 -> 피동 (이히리기)
#너무 예외가 많기 때문에 passivization 가능한 동사 리스트에 있는지 한 번 거쳐야 
def passive(verb):
  if verb in passive_verb:  # passivization 가능한 동사 리스트에 있는지 한 번 거쳐야 
    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=verb[:-1]      #어간은 마지막 문자인 '-다'를 삭제한 나머지 부분
    c0, c1, c2 = decompose(eogan[-1])
    n=len(eogan)
    exception= ['뜯다', '쫓다', '믿다'] #예외적으로 '기'가 붙는 동사들
    exception_match=[i for i in range(len(exception)) if exception[i] in verb] #exception의 동사를 포함하는 '쥐어뜯다'까지 포함

    if eogan.endswith (((((('이','히','리','기','당하','되')))))):   #이미 피동인 표현에 대해서는 원형 그대로 반환
      return(verb)
    if eogan.endswith((((('우','구','추','시키'))))):               #사동 표현에 대해서는 원형 그대로 반환
      return(verb)

    if '하다' in verb:              #~1. 하다 동사 -> ~되다 ex. 방해하다 -> 방해되다
      result=verb.replace('하다','되다')
      return(result)

    else:                         #피동 접사가 붙을 수 있는 동사들
      if not ends_with_jong(eogan):           #1.피동 접미사 '이' (어간 받침 x)
        if eogan[-1]=='르':        #르 불규칙
          if verb!= '따르다' and verb!= '치르다':   #르 불규칙의 예외 동사
            cc0, cc1, cc2 = decompose(eogan[-2])  #ex. 누르다 -> 눌리다
            result= eogan[:-2]+compose(cc0,cc1,'ㄹ') +'리다'
            return(result)

          if verb in ['따르다','치르다']:   #르 불규칙의 예외
            result= eogan+'게 되다'
            return(result)
        if c1 =='ㅜ':
          result=eogan[:(n-1)] + compose(c0,'ㅟ',' ')+'다'
          return(result)
        else :
          result=eogan+ '이다'
          return(result)

      elif ends_with_jong(eogan):
        if '죽다' in verb:  #예외
          return ('죽이다')
        if '찢다' in verb:
          return('찢기다')
        elif c2=='ㄲ' or c2=='ㅍ' or c2=='ㅌ' or c2=='ㄾ' or c2=='ㅎ':     #1.피동 접미사 '이' (어간 받침ㅇ)
          result= eogan + '이다'
          return(result)
        elif c2=='ㄴ'or c2=='ㄶ' or c2=='ㅁ' or c2=='ㄻ' or c2=='ㅅ'or c2=='ㅊ'or exception_match :     #2. 피동 접미사 '기'
          result=eogan+'기다'
          return(result)

        elif c2=='ㅂ'or c2=='ㄼ' or c2=='ㅈ' or c2=='ㄵ' or c2=='ㄷ'or c2=='ㄱ' or c2=='ㄺ':   #3.피동 접미사 '히' 
          result= eogan + '히다'
          return(result)

        elif c2=='ㄹ' or c2=='ㅀ':                #4. 피동 접미사 '리'
          result=eogan+'리다'
          return(result)
  else:                         #passivization 가능한 동사 리스트에 없는 동사는 원형 그대로 반환
    return(verb)


"""사동 (이히리기우구추)"""

#동사원형 -> 사동 (이히리기우구추)
#너무 예외가 많기 때문에 이히리기우구추는 포기하고 보조 동사로만 
def causative(verb):
    eogan=verb[:-1]      #어간은 마지막 문자인 '-다'를 삭제한 나머지 부분
    c0, c1, c2 = decompose(eogan[-1])
    n=len(eogan)

    if verb.endswith('하다'):               
      result=verb.replace('하다','하시다')
      return(result)

    if '하다' in verb:              #~1. 하다 동사 -> ~되다 ex. 공부하다 -> 공부시키다
      result=verb.replace('하다','시키다')
      result2=verb.replace('하다','하게 하다')
      return(result, result2)

    else:                         
        result=eogan+'게 시키다'
        result2= eogan+'게 하다'
        return(result,result2)


"""높임(주체높임)"""

#존대 변환기 (주체높임)
def subj_honorific(verb):
  def subj_honorific_(verb): 
    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=re.sub(r'다','',verb)
    c0, c1, c2 = decompose(eogan[-1])
    n=len(eogan)
    exception=['닫다','돋다','뜯다','믿다','받다','벋다','뻗다','얻다','곧다','굳다'] #ㄷ불규칙의 예외
    exception_match=[i for i in range(len(exception)) if exception[i] in verb] #exception의 동사를 포함하는 '쥐어뜯다'까지 포함
    exception2=['벗다', '웃다','솟다', '씻다', '앗다', '빼앗다'] #ㅅ불규칙의 예외
    exception_match2=[i for i in range(len(exception2)) if exception2[i] in verb] #exception2의 동사를 포함하는 '치솟다'까지 포함
    yangsung_c=['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ'] #모음조화
    eumsung_c=['ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ','ㅣ']
    irregular = {'자다':'주무시다', '먹다': '잡수시다', '아프다':'편찮으시다', '죽다':'돌아가시다'}

    
    if verb in irregular:           #불규칙 동사들 미리 선언한 대로 추출
        result=irregular.get(verb)
        return (result)

    if verb.endswith('하다'):               
      result=verb.replace('하다','하시다')
      return(result)
    else:
      if ends_with_jong(eogan):                          #어근이 자음으로 끝남
        if not exception_match2 and c2=='ㅅ':                # ㅅ 불규칙활용 ex. 긋다, 낫다
          result=eogan[:(n-1)] +compose(c0,c1,' ')+'으시다'
          return(result)
        if not exception_match and c2=='ㄷ' or verb=='깨닫다': # ㄷ 불규칙 활용 ex. 싣다-> 실으시다   
          result= eogan[:(n-1)] +compose(c0,c1,'ㄹ')+'으시다'            
          return(result)
        elif exception_match:
          result= eogan[:(n-1)] +compose(c0,c1,'ㄷ')+'으시다'            
          return(result)
        if c2== 'ㄹ':                     #ex.살다->사시다, 말다->마시다
          result=eogan[:(n-1)] +compose(c0,c1,' ')+'시다'
          return(result)
        if c1=='ㅜ' or 'ㅗ' and c2=='ㅂ':         #ㅂ 불규칙 활용
          result= eogan[:(n-1)]+ compose(c0,c1,' ')+'우시다'
          return(result)
        else: 
          result=eogan +'으시다'
          return(result)

      if not ends_with_jong(eogan):          #어근이 모음으로 끝남
        result=eogan+'시다'
        return(result)

    if len(subj_honorific_(verb)[0])< len(verb):  # 잘못 추출된 동사들은 변형하지 않고 원형 그대로 배출
      return(verb)
  return(subj_honorific_(verb))



"""높임(상대높임) - 낮춤이 아닌 높임의 의미를 갖는 어미 & 보편적으로 가장 많이 쓰이는 해요 체의 -요와 하십시다 체의 '-ㅂ니다' """

#존대 변환기 (상대높임)
def sangdae_honorific(verb):
  def sangdae_honorific_(verb): 
    def ends_with_jong(word):       #받침 여부 확인 #받침 있으면 True
      return(ord(word[-1])-44032)%28 !=0

    eogan=re.sub(r'다','',verb)
    c0, c1, c2 = decompose(eogan[-1])
    e0, e1, e2 = decompose(eogan[0])
    n=len(eogan)
    exception=['닫다','돋다','뜯다','믿다','받다','벋다','뻗다','얻다','곧다','굳다'] #ㄷ불규칙의 예외
    exception_match=[i for i in range(len(exception)) if exception[i] in verb] #exception의 동사를 포함하는 '쥐어뜯다'까지 포함
    exception2=['벗다', '웃다','솟다', '씻다', '앗다', '빼앗다'] #ㅅ불규칙의 예외
    exception_match2=[i for i in range(len(exception2)) if exception2[i] in verb] #exception2의 동사를 포함하는 '치솟다'까지 포함
    exception3=['따르다', '치르다'] #르 불규칙의 예외
    exception_match3=[i for i in range(len(exception3)) if exception3[i] in verb] #exception3의 동사를 포함하는 '뒤따르다'까지 포함  
    yangsung_c=['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ'] #모음조화
    eumsung_c=['ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ','ㅣ']


    if verb.endswith('하다'):               
      result=verb.replace('하다','해요')
      result2=verb.replace('하다','합니다')
      return(result, result2)
    if verb.endswith('이다'):          #2. -이다 (ex. ㅇㅇ이다, 속삭이다)
      result=verb.replace('이다','여요')
      result2=verb.replace('이다','입니다')
      return (result,result2)

    else:                        #3. ~하다,이다 로 끝나지 않는 동사   
      if c1=='ㅏ' or c1=='ㅗ':        # 3-1. 어간의 마지막 모음이 ㅏ/ㅗ인 동사  --> 모음조화 때문에 모음 구분   
        if ends_with_jong(eogan):   
          if c2=='ㅂ' and c1=='ㅗ':  # ㅂ 불규칙 용언(모음조화) ex. 돕다
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'와요'
            result2= eogan+'습니다'
            return(result, result2)
          if not exception_match and c2=='ㄷ' or verb=='깨닫다':              #ㄷ 불규칙 (양성모음조화# 모음이 ㅏ,ㅗ인 동사의 경우에는 ㄹ로 변형하도록 (깨달았다-> 예외인 '닫다'를 포함하는 동사지만 규칙 활용하므로 따로 처리)
            result= eogan[:(n-1)]+compose(c0,c1,'ㄹ')+'아요'  #모음이 ㅏ,ㅗ인 동사: 닫다 => 동음이의어에 대한 문제.. 일단 '닫았어요'로
            result2= eogan+'습니다'
            return(result, result2)
          if not exception_match2 and c2=='ㅅ':      #ㅅ 불규칙   
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'아요'
            result2= eogan+'습니다'
            return(result, result2)
          if c2== 'ㄹ':                     #ex.살다, 말다
            result= eogan+'아요'
            result2=eogan[:(n-1)] +compose(c0,c1,'ㅂ')+'니다'
            return(result, result2)
          if c0=='ㄹ' and c1=='ㅡ':         #르 불규칙 ex. 나르다
            ee0, ee1, ee2 = decompose(eogan[-2])
            result= eogan[:-2]+compose(ee0,ee1,'ㄹ') +compose(c0,'ㅏ',' ')+'요'
            result2= eogan[:-1]+compose(c0,c1,'ㅂ')+'니다'
            return(result, result2)
          else:                     # 어간의 마지막 모음이 ㅏ,ㅗ이면서 자음으로 끝나는 나머지 동사 ex.좋+았다
            result= eogan+'아요'
            result2= eogan+'습니다'
            return(result, result2)

        else:                       # 어간의 마지막 모음이 ㅏ,ㅗ이면서 모음으로 끝나는 동사
          if c0=='ㅇ'or'ㅂ' and c1 =='ㅗ': # 오 불규칙 ex. 오다, 보다
                result=eogan[:(n-1)] + compose(c0, 'ㅘ', ' ')+ '요'
                result2=eogan[:(n-1)] + compose(c0, 'ㅗ', 'ㅂ')+ '니다'
                return(result,result2)

          else:                      #오 불규칙을 따르지 않음. ex. 가다 
                result=eogan+ '요'
                result2=eogan[:(n-1)] + compose(c0, c1, 'ㅂ')+ '니다'
                return(result,result2)


      else:             #c1이 ㅏ/ㅗ가 아닌 동사
        if ends_with_jong(eogan):  
          if c2=='ㅂ' and c1=='ㅜ':  # ㅂ 불규칙 용언(모음조화) ex. 눕다
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'워요'
            result2= eogan+'습니다'
            return(result, result2)
          if not exception_match and c2=='ㄷ':              #ㄷ 불규칙 
            result= eogan[:(n-1)]+compose(c0,c1,'ㄹ')+'어요' 
            result2= eogan+'습니다'
            return(result, result2)
          if not exception_match2 and c2=='ㅅ':      #ㅅ 불규칙 ex. 벗다
            result= eogan[:(n-1)]+compose(c0,c1,' ')+'어요'
            result2= eogan+'습니다'
            return(result, result2)
          if c2== 'ㄹ':                     #ex. 밀다
            result= eogan+'어요'
            result2=eogan[:(n-1)] +compose(c0,c1,'ㅂ')+'니다'
            return(result, result2)
            
          else:                     # 어간의 마지막 모음이 ㅏ/ㅗ가 아니면서 자음으로 끝나는 나머지 동사 
            result= eogan+'어요'
            result2= eogan+'습니다'
            return(result, result2)

          
        else:                       # 어간의 마지막 모음이 ㅏ/ㅗ가 아니면서 모음으로 끝나는 동사 
          if c1=='ㅣ':      #ex. 끼다 
            result= eogan[:(n-1)] + compose(c0,'ㅕ',' ')+'요'
            result2= eogan[:(n-1)] + compose(c0,'ㅣ','ㅂ')+'니다'
            result3= eogan+'더라'
            return(result, result2)

          elif c1=='ㅡ':         
              if c0=='ㄹ':        #르 불규칙 ex. 부르다, 가로지르다
                if not exception_match3:   #르 불규칙의 예외 동사
                  ee0, ee1, ee2 = decompose(eogan[-2])
                  if ee1 in eumsung_c:
                    result= eogan[:-2]+compose(ee0,ee1,'ㄹ') +compose(c0,'ㅓ',' ')+'요'
                    result2= eogan[:-1]+compose(c0,c1,'ㅂ')+'니다'
                    return(result, result2)
              else:           #르 불규칙 아닌, 어간의 마지막 모음이 ㅡ인 동사들 ex. 끄다   
                e0, e1, e2 = decompose(eogan[0])
                if e1 in yangsung_c:        #e1을 기준으로 모음조화 
                  result= eogan[:(n-1)] + compose(c0,'ㅏ',' ')+'요'
                  result2= eogan[:-1]+compose(c0,c1,'ㅂ')+'니다'
                  return(result, result2)
                else:
                  result= eogan[:(n-1)] + compose(c0,'ㅓ',' ')+'요'
                  result2= eogan[:-1]+compose(c0,c1,'ㅂ')+'니다'
                  return(result, result2)
          
          elif c1=='ㅓ':                  #ex. 서다, 건너다
            result= eogan + '요'
            result2= eogan[:(n-1)] + compose(c0,c1,'ㅂ')+'니다'
            return(result, result2)

          else:                     
            if c1=='ㅜ' and verb!= '푸다':  #ex. 모음축약 (우 불규칙), ex. 주다 / 예외. 푸다
              result= eogan[:(n-1)] + compose(c0,'ㅝ',' ')+'요'
              result2= eogan[:(n-1)] + compose(c0,c1,'ㅂ')+'니다'
              return(result, result2)
            if verb=='푸다':                #우 불규칙 예외
                return ('퍼요', '풉니다')

            else:  #ex.사귀다, 되다, 뛰다
              if c0=='ㅇ' and c1=='ㅐ':   #ex. 사동표현 '애': ex. 없애다 
                result= eogan+'요'
                result2= eogan[:(n-1)] + compose(c0,c1,'ㅂ')+'니다'
                return(result, result2)
              else:          #ex.사귀다, 되다, 뛰다
                result= eogan+'어요'
                result2=eogan[:(n-1)] + compose(c0,c1,'ㅂ')+'니다'
              return(result, result2)

  # if len(sangdae_honorific_(verb)[0])< len(verb):  # 잘못 추출된 동사들은 변형하지 않고 원형 그대로 배출
  #   return(verb)
  return(sangdae_honorific_(verb))

