23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
그동안 다양한 오픈소스 라이브러리를 사용해 오면서 그동안 직접 라이브러리를 만들어보고 싶다는 생각을 하고 있었는데,
이번 토스에서 만든 es-hangul(https://github.com/toss/es-hangul) 을 보고 여러 한글 관련 프로젝트를 진행해왔던 경험을 살려
Swift를 활용한 한글 검색 라이브러리를 만들게 되었습니다.
초성 검색: 사용자가 입력한 초성에 맞는 데이터를 검색합니다.
자동 완성: 사용자의 입력에 기반한 자동 완성 결과를 제공합니다.
전체 문자열 검색: 입력된 전체 문자열을 포함하는 데이터를 검색합니다.
종합 검색 모드: 초성 검색과 자동 완성을 결합하여 더 넓은 범위의 검색을 지원합니다.
기본: 정렬을 수행하지 않음. 데이터 순서대로 반환
자모 순서: 항목들을 한글 자모 순서대로 정렬
자모 역순: 항목들을 한글 자모 역순으로 정렬
편집 거리: Levenshtein (편집) distance 기준으로 가장 유사한 순서대로 정렬
한글의 초성 검색은 한글 음절을 초성, 중성, 종성으로 분리하여 초성만을 추출하고 이를 이용해 검색하는 방식입니다. 한
글 음절은 유니코드 표준을 활용하여 분리됩니다. 초성 검색의 기본 원리는 다음과 같습니다:
한글 음절의 유니코드 범위
한글 음절은 유니코드 범위 0xAC00에서 0xD7A3까지의 값을 가집니다. 이 범위 내에서 각 음절의 유니코드 값을 이용하여 초성, 중성, 종성을 분리할 수 있습니다.
초성, 중성, 종성의 인덱스 계산
한글 음절의 유니코드 값에서 '가'의 유니코드 값을 뺀 후 초성, 중성, 종성의 인덱스를 계산합니다.
let 초성: [String] = ["ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]func extractChosung(_ character: Character) -> String {
let unicodeValue = character.unicodeScalars.first!.value
if unicodeValue >= 0xAC00 && unicodeValue <= 0xD7A3 {
let index = ((unicodeValue - 0xAC00) / 28) / 21
return CHO_SUNG[Int(index)]
}
return String(character)
}한글 문자열 분해
한글 문자열의 경우, 입력된 문자열을 분해하여 접두사 비교를 보다 정확하게 수행할 수 있습니다. 이를 위해 한글 음절을 초성, 중성, 종성으로 분해합니다.
func decomposeKorean(_ char: Character) -> [Character] {
let unicodeValue = char.unicodeScalars.first!.value
if unicodeValue >= 0xAC00 && unicodeValue <= 0xD7A3 {
let base = unicodeValue - 0xAC00
let chosungIndex = Int(base / 28 / 21)
let jungsungIndex = Int((base % (21 * 28)) / 28)
let jongsungIndex = Int(base % 28)
var result = [CHO_SUNG[chosungIndex], JUNG_SUNG[jungsungIndex]]
if jongsungIndex > 0 {
result.append(JONG_SUNG[jongsungIndex]!)
}
return result
}
return [char]
}분해된 문자열 기반 자동 완성 검색
입력된 문자열을 분해하여 접두사 비교를 수행합니다.
func searchItemsAutocompleteDecomposed(input: String) -> [T] {
let decomposedInput = input.flatMap { decomposeKorean($0) }.map { String($0) }.joined()
return items.filter {
let decomposedItem = $0.name.flatMap { decomposeKorean($0) }.map { String($0) }.joined()
return decomposedItem.hasPrefix(decomposedInput)
}
}iOS의 기본 문자열 검색 기능은 한글의 초성을 인식하지 못하는 경우가 많아, 로컬에서 검색을 수행하는 앱들의 경우 초성 검색 및 자동 완성 검색을 지원하지 못하는 경우가 많았습니다.
이를 통해 사용자들이 iOS 환경에서 쾌적한 한글 검색 경험을 할 수 있으면 좋겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.