티스토리 뷰

개발/python

한글 자모 분리

Jaeyeon Baek 2019.05.02 16:39

한글 자소분리를 처리하기 위해서는 Unicode에 대한 이해가 필요합니다. 우선 위키피디아에 정의되어 있는 한글 음절에 대해 살펴보도록 하시죠.

https://ko.wikipedia.org/wiki/한글_음절

우선 여기서 잘 확인하고 넘어가야 하는 부분이 초성, 중성, 종성을 이루는 문자들과 그 개수입니다.

초성 : ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ (19개)
중성 : ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ (21개)
종성 : ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ (28개)

종성의 경우에는 종성이 없는 경우를 위해서 빈 문자도 포함해서 28로 취급합니다. 예를들면 "가", "우", "소" 등이 종성이 없는 경우가 있겠죠.

이 그림을 참고해서 아래 설명을 보세요



또한 위 링크에서 확인한 한글문자코드의 범위는 0xAC00(가) ~ 0xD7A3(힣)로 나타납니다. 예를들어 가(0xAC00) 다음에 나오는 까(0xAE4C)는 가부터 시작해서 모든 중성과 종성의 조합을 지나서 나오게 되는데 위에서 이야기한것처럼 종성의 개수는 21개, 종성의 개수는 28개입니다. 쉽게 이야기를 해봅시다. 종성이 붙지 않은 "가"부터 성(즉 받침)을 붙여나가면 

가, 각, 갂, 갃, 간, 갅, 갆, 갇, 갈, 갉, 갊, 갋, 갌, 갍, 갎, 갏, 감, 갑, 값, 갓, 갔, 강, 갖, 갗, 갘, 같, 갚, 갛

이렇게 총 28개가 나옵니다. 이렇게 모든 종성을 훑었으면 중성을 바꿔줍니다. "ㅏ" ~> "ㅐ" 로 변경하고 다시 28종류의 종성(종성이 없는 경우 포함)을 훑어주면 

개, 객, 갞, 갟, 갠, 갡, 갢, 갣, 갤, 갥, 갦, 갧, 갨, 갩, 갪, 갫, 갬, 갭, 갮, 갯, 갰, 갱, 갲, 갳, 갴, 갵, 갶, 갷

다시 이렇게 28종류가 나옵니다. 이제 자연스럽게 반복문이 되겠죠? 중성(21개)을 모든 종성(28개)만큼 반복해주면 588이라는 수치가 나오는데 가(0xAC00)에 588을 더해주면 까(0xAE4C), 위에서 미리 확인한 초성의 두번째 인덱스에 들어있는 "ㄲ"을 만나게 됩니다. 마찬가지로 다시 한번 588을 더해주면 나(0xB098), 즉 세번째 초성으로 만들 수 있는 첫 문자가 출력됩니다. 이쯤 되면 대충 느낌이 옵니다. 가(0xAC00)에 588(21 x 28)을 초성의 인덱스만큼 곱셈해주면 원하는 초성으로 시작하는 위치를 찾을 수 있게 된다는 겁니다. 

이게 글로 표현하면 참 어렵죠. 반대로 특정 문자의 유니코드가 주어지고 그 문자를 초성, 중성, 종성으로 분리하는 공식을 확인해보면 이해에 도움이 됩니다. 문자 유니코드로 부터 초성, 중성, 종성의 인덱스를 찾는 아래와 같은 공식을 살펴봅시다.

초성의 인덱스 : (문자 - 0xAC00) / 21 / 28
중성의 인덱스 : (문자 - 0xAC00 - (초성 인덱스 * 21 * 28)) / 28 
종성의 인덱스 : (문자 - 0xAC00 - (초성 인덱스 * 21 * 28) - (중성 인덱스 * 28))

이 공식이 잘 이해가 되지 않는다면 아래 링크를 브라우저에 열어놓고 들여다보면 도움이 될겁니다.
https://www.unicode.org/charts/PDF/UAC00.pdf

이걸 파이썬 코드로 구현보면 다음과 같습니다. 어느분께는 도움이 되시길 바랍니다.

https://github.com/jybaek/jamos-toolkit

 

해당 모듈은 pip 를 통해 설치하고 사용 가능합니다.

pip install jamos-toolkit

 

댓글
  • 프로필사진 덜덜 git에서 알집풀고 어떻게 적용시키나요 ? 2019.06.18 02:47
  • 프로필사진 BlogIcon Jaeyeon Baek 아래 링크를 참고하시면 도움이 될 듯 합니다.

    https://github.com/jybaek/jamos-toolkit/blob/master/test.py
    2019.06.18 09:24 신고
  • 프로필사진 첫시작 pip3 install jamos-toolkit
    Collecting jamos-toolkit
    Using cached https://files.pythonhosted.org/packages/fa/bd/06059d909a2388055dd8313901689497698d9fc72a85f9838be67ec187ee/jamos_toolkit-1.7-py3-none-any.whl
    Installing collected packages: jamos-toolkit
    Successfully installed jamos-toolkit-1.7
    pi@raspberrypi:~/Desktop/190619 $ cd jamos-toolkit
    pi@raspberrypi:~/Desktop/190619/jamos-toolkit $ sudo python test.py
    Traceback (most recent call last):
    File "test.py", line 3, in <module>
    from jamos_toolkit import JamosSeparator
    ImportError: No module named jamos_toolkit

    인스톨하고 sudo python test.py 하면 저렇게 에러가 나는데 해결방법 이 있을까요 ?
    2019.06.19 19:58
  • 프로필사진 BlogIcon Jaeyeon Baek 에고.. test.py에 import가 수정이 안되어 있었네요. 아래처럼 진행하시면 될겁니다. test.py는 PR해놨습니다. :)

    from jamostoolkit import JamosSeparator
    2019.06.20 09:31 신고
  • 프로필사진 첫시작. 수고많으십니다. 한가지만 더 여쭤보겠습니다.

    sudo python test.py
    org:
    > 안녕하세요. 날씨가 좋네요.

    jamos:
    > []
    ------------------------------
    jamos:
    >[]

    이부분에 한글이 분리되서 나와야 될듯싶은데 아닌가용??
    2019.06.20 14:26
  • 프로필사진 BlogIcon Jaeyeon Baek 모듈이 python3에 맞게 등록되어 있는데 sudo 빼고 해보시겠어요? sudo 때문에 python2.x 로 동작하면서 인식이 안된것 같습니다. 아니라면 python3으로 테스트해보시면 되겠습니다. 2019.06.20 15:02 신고
  • 프로필사진 첫시작. python3 하니 바로 되네요 감사합니다 허허 ㅋㅋ

    다만 "안123녕" 이렇게 숫자가 들어갈시 숫자는 생략되네요 ~
    2019.06.20 18:00
  • 프로필사진 BlogIcon Jaeyeon Baek 잘 되신다니 다행입니다. 아직 한글 자모가 아닌 부분에 대해서는 예외처리 하지 않은 상태입니다. :-) 2019.06.20 18:02 신고
  • 프로필사진 첫시작. 한가지만 더 여쭙겠습니다~_~

    ['ㄴ', 'ㅕ', 'ㄴ'] 이런걸
    [ㄴ,ㅕ,ㄴ]으로 ' 따움표를 없애주고 싶습니다 가능한가요 ?

    2019.06.20 18:48
  • 프로필사진 BlogIcon Jaeyeon Baek 그건 제가 넣은 구분자가 아니라 파이썬 문법입니다 ^^; 아래와 같은거라고 생각하시면 됩니다.

    >>> test = []
    >>> test.append("a")
    >>> test.append("b")
    >>> test
    ['a', 'b']
    2019.06.20 18:50 신고
댓글쓰기 폼