Python 에서 한글 조사 을/를, 이/가, 은/는, 와/과 출력하기

예전 게임들을 보면, 조사를 제대로 표현못하는 메시지를 띄우곤 했습니다.

  • 당신은 몬스터을(를) 때렸습니다!

와 같이 말이죠. 엄청 구리게 보이죠;

제대로 조사를 쓰려면 한글 조사의 규칙을 좀 연구해야합니다. 결론적으로 말하자면 한글 조사 을/를, 이/가, 은/는, 와/과 등은 그 조사의 앞 글자가 받침이 있느냐 없느냐에 따라 달라집니다.

즉, “사과”라는 단어는 “과”라는 받침이 없는 글자로 끝나기 때문에, 여기에는 “~가” / “~를” / “~는” / “~와” 등의 조사가 붙고, “수박”이라는 단어는 “박”이라는 받침이 있는 글자로 끝나기 때문에 “~이” / “~을” / “~은” / “~과” 등의 조사가 붙는다는 것입니다. 그래서

  • 나는 사과 먹었다
  • 나는 수박 먹었다

와 같이 조사를 사용해야 합니다. 이렇게 제대로 조사를 출력하기 위해서는 조사 앞 글자가 받침이 있느냐 없느냐를 알아내야 합니다.

받침이 있는지 알아내기

파이썬 3.x 에서는 기본적으로 모든 문자열이 유니코드를 쓰기 때문에, 받침 유무를 비교적 수월하게 알 수 있습니다. 유니코드 한글 문자표를 좍 펼쳐놓고 보면 대략 규칙을 발견할 수 있습니다. 결론을 말하자면, 한글문자에 유니코드의 한글 시작점(“가”가 시작점입니다)의 코드를 빼서 28로 나누어 떨어지면 받침이 없고, 나누어 떨어지지 않으면 받침이 있다고 판단하면 됩니다.

def ends_with_jong(kstr):
    k = kstr[-1]
    if "가" <= k <= "힣":
        return (ord(k)-ord("가")) % 28 > 0
    else:
        return

위 코드에서 만약 파라메터 kstr 의 마지막 글자가 한글이 아니라면 None 을 리턴하게 됩니다.

만약 kstr 이 “사과(apple)” 나 “수박(watermelon)”과 같이 한글과 함께 영문자를 포함하는 경우, 정규표현식(Regular Expression)을 사용하여 다음과 같이 한글부분만 골라내서 처리해도 됩니다.

import re
def ends_with_jong(kstr):
    m = re.search("[가-힣]+", kstr)
    if m:
        k = m.group()[-1]
        return (ord(k) - ord("가")) % 28 > 0
    else:
        return

물론 한글 문자열이 여러개 있는 경우엔 위 코드가 제대로 작동 안 하겠지만, 뭐 그건 그 상황에 맞게 정규표현식을 수정하면 되는 거고, 여기서는 생략합니다.

조사 출력하는 함수

어째건 종성으로 끝나는지 아닌지를 체크하는 코드가 됐으므로 조사를 출력하는 함수는 다음과 같이 만들면 됩니다.

def ul(kstr):
    josa = "을" if ends_with_jong(kstr) else "를"
    print(f"{kstr}{josa} ", end='')
def yi(kstr):
    josa = "이" if ends_with_jong(kstr) else "가"
    print(f"{kstr}{josa} ", end='')
def wa(kstr):
    josa = "과" if ends_with_jong(kstr) else "와"
    print(f"{kstr}{josa} ", end='')
def en(kstr):
    josa = "은" if ends_with_jong(kstr) else "는"
    print(f"{kstr}{josa} ", end='')

위 코드는 ends_with_jong() 이 None 을 리턴했을 때의 처리는 안 하고 있는데, 뭐 대충 알아서 손 보시기 바라며 그냥 넘어가도록 하겠습니다 ㅎ

if __name__ == "__main__":
    apple = "사과"
    melon = "수박"
    ul(apple); print("집었다.")
    ul(melon); print("집었다.")
    en(apple); print("맛있다.")
    en(melon); print("더 맛있다.")
    yi(apple); print("더욱 더 맛있다.")
    yi(melon); print("더더욱 맛있다.")
    wa(apple); print(melon)
    wa(melon); print(apple)

위 함수들을 테스트하는 코드입니다. 그리고 아래는 출력 결과.

사과를 집었다.
수박을 집었다.
사과는 맛있다.
수박은 더 맛있다.
사과가 더욱 더 맛있다.
수박이 더더욱 맛있다.
사과와 수박
수박과 사과

확장

위에서의 논의를 좀 더 확장해서, “~로” / “~으로” 와 같이 방향을 나타내는 조사를 사용할 때, “~야” / “~아” / “~이여” / “~여” 와 같이 누군가를 부를 때 등의 경우도 같은 방식으로 앞 글자가 받침을 갖고있는지에 따라 달리 쓰면 됩니다.

그리고 한가지 주의할 점이 있는데, “~로” / “~으로” 의 경우에는 보통의 경우 “제주도로”, “부산으로” 와 같이 받침이 없는 글자 뒤에는 “~로”가, 받침이 있는 글자 뒤에는 “~으로”가 붙지만, “서울로”와 같이 받침이 있더라도 ㄹ받침 뒤에는 “~로”가 붙으므로 이런 예외를 적절히 처리해야할 것입니다.

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

파이썬 Python

번호 제목 글쓴이 날짜 조회수
16 비큐냐(Vicuna)와 text-generation-webu 관리자 04-17 450
15 Pyjosa - 파이썬 한글 조사 처리 모듈 관리자 03-11 511
14 Python 에서 한글 조사 을/를, 이/가, 은/는, 와/과 출력하기 관리자 06-10 1,145
13 flask multifile upload 관리자 05-25 666
12 Fast api로 머신러닝 기반 웹사이트 만들고 배포하기 관리자 05-16 1,245
11 CentOS에서 Python 버전 변경 관리자 05-04 634
10 fastapi 관리자 05-04 658
9 PyQt5 프린트 할 위젯 선택하고 프린트 하는 예제 관리자 02-22 655
8 Python 가상환경 - venv 관리자 02-15 473
7 MacOS에서 Pyenv PYENV_VIRTUALENV_DISABLE_PROMPT 문구 제거 하기 관리자 02-05 450
6 Mac VSCODE에서 가상환경내 Python으로 Python Interpreter 설정 관리자 02-05 519
5 NAVER API를 사용해서 크롤링하기 - 2 관리자 02-05 1,469
4 NAVER API를 사용해서 크롤링하기 - 1 관리자 02-05 478
3 selenium을 사용한 데이터 크롤링하기 관리자 02-05 447
2 Using both Python 2.x & 3.x 관리자 02-05 382
1 MacOS] Python(pyenv) 설치 및 버전관리 관리자 02-05 388