'종성'에 해당되는 글 1건

  1. 2015.11.19 [자모분석기] 초성, 중성, 종성 남의 코드 가져다 구현해 보기.

[자모분석기] 초성, 중성, 종성 남의 코드 가져다 구현해 보기.

ITWeb/검색일반 2015. 11. 19. 15:44

구글님을 통해서 한글 초성검색 또는 초성, 중성, 종성 이런식으로 검색 하시면 엄청난 자료들이 나옵니다.

지금은 어느 검색 포털이나 쇼핑몰 검색에서 흔히 사용되는 기술이죠.

오픈 된 소스가 많이 있기 때문에 잘 작성된 코드 보고 원리를 이해하고 자신의 서비스에 맞게 적용하시면 될 것 같습니다.


저는 늘 그렇듯이 맨날 잊어버려서 복습 차원에서 또 블로깅을 해봅니다. :)


보통 시작하기에 앞서 한글의 초성, 중성, 종성을 먼저 정리 하게 됩니다.

하고 싶은게 초중종을 분리 하는 것이기 때문에 당연한 것이라고 생각 됩니다.

저 같은 경우는 내가 하고 싶은걸 먼저 적고 그걸 어떻게 구현 할 수 있을까 를 고민 하면서 스케치를 합니다.

그런 다음 고민한 내용을 기반으로 직접 구현 할 것인지 오픈소스를 가져다 사용할 것인지를 또 정리 합니다.


이미 잘 작성된 오픈 소스가 있다면 당연히 비용을 줄이는 차원에서 가져다 사용을 합니다.

단, 사용하는 오픈 소스나 도구의 동작 원리와 내부 구성이 어떻게 되어 있는지는 잘 분석하고 시작을 해야 한다고 생각 합니다.

그래야 시행착오를 줄일 수 있지 않을까 생각 하거든요.


암튼 이제 살펴 보겠습니다.


[초성/자음] - 19자

{'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'}


[중성/모음] - 21자

{'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'}


[종성/받침] - 28자 (채움문자 포함)

{' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'}


[초성 유니코드]

{0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}


[중성 유니코드]

{0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163}


[종성 유니코드]

{0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}


아래는 국립국어연구원에서 발췌한 글 입니다.


[한글의 자모로 조합 가능한 글자의 수는 11,172개]


우리가 조합형 한글 코드로 조합하여 만들 수 있는 글자의 수는 얼마나 될까? 초성과 중성에 쓰이는 자음과 모음의 숫자는 한글 맞춤법 규정과 다를 것이 없다. 그러나 받침의 경우는 사정이 조금 다르다. 우리말은 받침이 없는 경우가 있기 때문에 받침이 없는 경우에도 한글 한 글자에 해당하는 2바이트(16비트)를 만들기 위한 5비트의 종성을 채워줄 수 있는 채움 문자가 필요하다. 그래서 조합할 수 있는 받침의 수는 한글 맞춤법에 나온 27자에 채움 문자 한 글자가 더 들어간 28자로 계산하여야 한다. 따라서 조합형 한글 코드로 만들어 낼 수 있는 글자의 수는 19(초성)×21(중성)×28(종성)=11,172개이다. 물론 이는 이론적으로 가능한 숫자이고 조합 가능한 모든 글자가 실생활에서 쓰이는 것은 아니다.


여기서 이렇게 한글만 정리 하면 영어 같은 경우는 어떻게 할 수 있을까요?

영어는 그냥 글자 자체로 초성으로 취급 하면 되지 않겠습니까?

이렇게 한글에 대한 분리와 분리된 자모를 다시 합치기 위한 공식이 나오게 됩니다.

당연히 누군가 만들어 놓은 공식을 사용하였습니다.

단, 왜 이렇게 나왔는지를 이해하고 사용하시면 좋겠습니다.


[분리 기본 공식]

    초성 = ( ( (글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) / 21

    중성 = ( ( (글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) % 21

    종성 = (글자 - 0xAC00) % 28


[합치기 기본 공식]

    원문 = 0xAC00 + 28 * 21 * (초성의 index) + 28 * (중성의 index) + (종성의 index)


    각 index 정보는 CHOSUNG, JUNGSUNG, JONGSUNG char[]에 정의한 index 입니다.

    하지만 아래 코드에서는 원문이 필요 없기 때문에 합치기 위한 로직은 포함 되어 있지 않습니다


자 그럼 초성, 중성, 종성 알아봤고, 공식까지 확인했으니 구현만 하면 되겠습니다.

실제 구현한 코드는 아래 링크에서 확인 하시면 됩니다.


[소스코드 Repository]

https://github.com/HowookJeong/hanguel-jamo-analyzer


[사용방법]

public static void main(String args[]) {
String query = "Nike 청바지";
HanguelJamoMorphTokenizer tokenizer = HanguelJamoMorphTokenizer.getInstance();

String chosung = tokenizer.tokenizer(query, HanguelJamoType.CHOSUNG);
String jungsung = tokenizer.tokenizer(query, HanguelJamoType.JUNGSUNG);

String jongsung = tokenizer.tokenizer(query, HanguelJamoType.JONGSUNG);


System.out.println("원문 : [" + query + "]");
System.out.println("초성 : [" + chosung + "]");
System.out.println("중성 : [" + jungsung + "]");
System.out.println("종성 : [" + jongsung + "]");
}


[실행결과]

원문 : [Nike 청바지]

초성 : [Nikeㅊㅂㅈ]

중성 : [Nikeㅓㅏㅣ]

종성 : [Nikeㅇ]


이제 활용만 하면 될 것 같습니다.

어떻게?

그건 각 서비스 요구사항에 맞춰서 하셔야죠. ^^

: