본문 바로가기
카테고리 없음

파이썬 유니코드 한글 자소 분리 방법

by 퍼포먼스마케팅코더 2024. 3. 19.
반응형

유니코드 한글 자소 분리 방법

Python을 이용하여 한글 문자열을 초성, 중성, 종성으로 분리하는 방법에 대해 설명하겠습니다. 이를 위해 JamoUtils라는 클래스를 사용하는 예를 들어보겠습니다. 이 클래스는 한글 문자열을 다루는 유용한 도구를 제공합니다.

JamoUtils 클래스 개요

JamoUtils 클래스는 한글 문자의 초성, 중성, 종성을 분리해내는 기능을 제공합니다. 이 클래스에는 초성(CHOSUNG), 중성(JUNGSUNG), 종성(JONGSUNG)을 각각 나타내는 리스트가 정의되어 있습니다. 클래스의 메서드는 모두 정적 메서드로, 인스턴스를 생성하지 않고도 사용할 수 있습니다.

주요 메서드

  1. split_one(target): 한글 문자 하나를 입력받아 초성, 중성, 종성을 분리해내는 메서드입니다. 입력된 문자가 한글이 아닌 경우, 입력 문자와 빈 문자열 두 개를 튜플 형태로 반환합니다.
  2. split(target): 문자열을 입력받아 각 문자를 초성, 중성, 종성으로 분리하고, 이를 튜플로 묶어 리스트 형태로 반환합니다.

사용 예시

단일 문자 분리

chosung, jungsung, jongsung = JamoUtils.split_one('가')
print(f"'가'의 초성: {chosung}, 중성: {jungsung}, 종성: {jongsung}")

이 코드는 '가'라는 문자를 초성, 중성, 종성으로 분리하여 출력합니다. 결과는 '가'의 초성: ㄱ, 중성: ㅏ, 종성:이 됩니다.

문자열 분리

split_result = JamoUtils.split('안녕하세요')
for chosung, jungsung, jongsung in split_result:
    print(f"초성: {chosung}, 중성: {jungsung}, 종성: {jongsung}")

'안녕하세요'라는 문자열 내의 각 글자를 초성, 중성, 종성으로 분리하여 출력합니다. 각 글자마다 초성, 중성, 종성이 출력됩니다.

결론

JamoUtils 클래스를 통해 한글 문자열을 다루는 작업을 쉽게 할 수 있습니다. 특히 한글 텍스트의 처리나 분석에 있어서 매우 유용하게 사용될 수 있습니다. 이러한 기능은 한글을 기반으로 하는 자연어 처리나 텍스트 마이닝 분야에서 특히 요긴하게 사용될 수 있습니다.

 

아래는 전체 파이썬 코드

class JamoUtils:
    # 초성, 중성, 종성 리스트 정의
    CHOSUNG = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ',
               'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
    JUNGSUNG = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ',
                'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ']
    JONGSUNG = ['', 'ㄱ', 'ㄲ', 'ᆪ', 'ᆫ', 'ᆬ', 'ᆭ', 'ㄷ',
                'ㄹ', 'ᆰ', 'ᆱ', 'ᆲ', 'ᆳ', 'ᆴ', 'ᆵ', 'ᆶ', 'ㅁ', 'ㅂ', 'ᆹ', 'ᆺ', 'ᆻ', 'ᆼ',
                'ᆽ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
    
    def __init__(self):
        # 인스턴스 생성을 방지하기 위한 예외 처리
        raise NotImplementedError

    @staticmethod
    def split_one(target):
        """
        한글 문자를 입력받아 초성, 중성, 종성으로 분리하는 함수

        Parameters:
        target (str): 분리하고자 하는 한글 문자

        Returns:
        tuple: 분리된 초성, 중성, 종성을 담은 튜플. 한글이 아닌 경우 입력받은 문자와 빈 문자열 2개를 반환.
        """
        code_point = ord(target)  # 입력받은 문자를 유니코드 코드 포인트로 변환
        # 한글 유니코드 범위에 속하는지 확인
        if 0xAC00 <= code_point <= 0xD7A3:
            start_value = code_point - 0xAC00
            jong = start_value % 28  # 종성
            jung = ((start_value - jong) // 28) % 21  # 중성
            cho = (((start_value - jong) // 28) - jung) // 21  # 초성

            return JamoUtils.CHOSUNG[cho], JamoUtils.JUNGSUNG[jung], JamoUtils.JONGSUNG[jong]

        # 한글이 아닌 경우
        return target, '', ''

    @staticmethod
    def split(target):
        """
        문자열을 입력받아 각 문자를 초성, 중성, 종성으로 분리하는 함수

        Parameters:
        target (str): 분리하고자 하는 문자열

        Returns:
        list: 각 문자를 분리한 결과를 튜플로 묶어 리스트로 반환. 각 튜플은 (초성, 중성, 종성) 형태임.
        """
        result = []  # 분리 결과를 담을 리스트 초기화
        for c in target:  # 입력받은 문자열의 각 문자에 대해 반복
            result.append(JamoUtils.split_one(c))  # 각 문자를 초성, 중성, 종성으로 분리하여 결과 리스트에 추가

        return result  # 분리 결과 반환

# JamoUtils 클래스를 사용하는 예시

# JamoUtils 클래스를 정의합니다.
# 이 클래스는 한글 문자열을 초성, 중성, 종성으로 분리하는 유틸리티를 제공합니다.

# JamoUtils 클래스 인스턴스 생성은 지원하지 않으므로, 클래스 메서드를 직접 호출해야 합니다.

# 단일 문자 분리 예시
# '가' 문자를 초성, 중성, 종성으로 분리합니다.
chosung, jungsung, jongsung = JamoUtils.split_one('가')
print(f"'가'의 초성: {chosung}, 중성: {jungsung}, 종성: {jongsung}")
# 출력: '가'의 초성: ㄱ, 중성: ㅏ, 종성:

# 문자열 분리 예시
# '안녕하세요' 문자열의 각 글자를 초성, 중성, 종성으로 분리합니다.
split_result = JamoUtils.split('안녕하세요')
for chosung, jungsung, jongsung in split_result:
    print(f"초성: {chosung}, 중성: {jungsung}, 종성: {jongsung}")
# 출력은 각 글자를 분리한 초성, 중성, 종성을 나타냅니다.

# 이 예시는 JamoUtils 클래스의 static 메서드를 사용하여,
# 한글 문자열 내의 각 글자를 초성, 중성, 종성으로 분리하는 방법을 보여줍니다.
반응형

댓글