티스토리 뷰

개발/python

한글 자모 분리

Jaeyeon Baek 2019. 5. 2. 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

 

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday