(iOS) AutoCompleteKor, 한국어 자음/모음 풀어쓰기 기반 자동완성 오픈소스
간간히 자동완성이 필요한 경우가 있다. 어떤 정보를 검색할 때가 그러한 경우라고 볼수가 있는데, 사실 자동완성이라고 하는 범위는 너무 넓다보니 하나의 커다란 서버가 필요하기도 하는데, 여기서는 iOS 상에서 한국어 풀어쓰기 기반의 자동완성을 소개하려고 한다.
풀어쓰기가 필요한 이유.
한국어가 완성자가 아닌 조합자이기 때문에 풀어쓰기가 필요한 것인데, 사실 완성자 자동완성을 제공해도 상관은 없지만 사용자가 느끼기에는 품질이 떨어지게 된다. 아래의 은행관련 예제를 보자.
찾고자 의도 하는 것 : 국민은행
*완성자 자동완성 *
사전
[경남은행] => ㄱㅕㅇㄴㅏㅁㅇㅡㄴㅎㅐㅇ
…
AutoCompleteKor 소스코드에서 가장 중요한 부분은 한글을 풀어쓰는 부분인데 그것은 여기를 참고하길 바란다. 원래 인터넷에서 찾을수 있겠지만 자음모음 분리 공식이 존재하기 때문에 그것을 사용했다.
그외에 2개의 클래스가 AutoCompleteKor 에 존재를 하는데 AutoCompleteData
클래스와 AutoCompleteMng
클래스이다.
AutoCompleteData
클래스
– word와 wordIndex 라는 두개의 변수를 갖는다.
– word에는 원문 단어가, wordIndex 에는 풀어쓰기 결과가 들어간다.
– 이 클래스는 하나의 사전 단어당 하나씩 객체가 생성되는 클래스이다.
AutoCompleteMng
클래스
-이 클래스는 NSMutableArray
형식의 acdArr
변수를 가지고 있는데 위에서 설명한 AutoCompleteData
객체를 담기 위한 변수이다.
– 이 클래스가 생성될때, 사전 데이터를 넣게 되면 내부적으로 AutoCompleteData
를 사전내 단어 만큼 생성을 하고 그 객체를 acdArr
에 넣게 된다. 그리고 나서 acdArr
을 오름차순(ASC)를 기준으로 정렬을 한다. 정렬을 하는 이유는 좀더 빠르게 찾기 위해서이다.
아래의 코드를 보자.
AutoCompleteMng
클래스의 생성자 부분에서 은행명이 들어있는 TestData 클래스를 생성을 하고 그 내에 있는 단어 수만큼 AutoCompleteData
를 만들어서 acdArr
에 저장하는 것을 볼수가 있다. TestData 부분이 실제 원데이터 부분인데, 이 부분을 파일에서 읽어오거나, 데이터베이스에서 읽어오도록 수정하면 그대로 사용할 수가 있다. *
그렇다면 풀어쓰기는 어디서 해주는 걸까?
AutoComleteData
의 initWithWord
생성자를 보자. 생성자에서는 단어를 받으면 단어 자체는 word 에 저장을 하고 [NSStrUtils getJasoLetter]
를 통해서 풀어쓰기한 결과를 wordIndex에 저장하고 있는 것을 볼수가 있다.
*
*
자, 이제 사전 데이터는 마련이 되었다. 그렇다면 검색을 어떻게 할까?
검색시에는 AutoCompleteMng
클래스의 search:(NSString*)keyword
함수를 이용해서 검색을 할 수가 있다. search 함수에서는 받은 입력 단어에 대한 풀어쓰기를 수행한 결과를 먼저 만들고나서, 그 결과를 가지고 이진탐색을 하면서 같거나 포함된 것들이 있으면 모두 찾는 과정을 수행한다. 코드는 아래와 같다.
버그
현재 발견된 버그는 “ㅘ, ㅟ” 와 같은 문자에 대한 처리이다.