반응형
유니코드 한글 자소 분리 방법
Python을 이용하여 한글 문자열을 초성, 중성, 종성으로 분리하는 방법에 대해 설명하겠습니다. 이를 위해 JamoUtils
라는 클래스를 사용하는 예를 들어보겠습니다. 이 클래스는 한글 문자열을 다루는 유용한 도구를 제공합니다.
JamoUtils
클래스 개요
JamoUtils
클래스는 한글 문자의 초성, 중성, 종성을 분리해내는 기능을 제공합니다. 이 클래스에는 초성(CHOSUNG
), 중성(JUNGSUNG
), 종성(JONGSUNG
)을 각각 나타내는 리스트가 정의되어 있습니다. 클래스의 메서드는 모두 정적 메서드로, 인스턴스를 생성하지 않고도 사용할 수 있습니다.
주요 메서드
split_one(target)
: 한글 문자 하나를 입력받아 초성, 중성, 종성을 분리해내는 메서드입니다. 입력된 문자가 한글이 아닌 경우, 입력 문자와 빈 문자열 두 개를 튜플 형태로 반환합니다.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 메서드를 사용하여,
# 한글 문자열 내의 각 글자를 초성, 중성, 종성으로 분리하는 방법을 보여줍니다.
반응형
댓글