반응형
rss 아이콘 이미지

Search

반응형

서치바에 초성 검색 기능을 넣을려고 자료를 찾다 보니

좋은 자료가 있어서 올립니다.
입력한 한글을 초성 중성 종성으로 분리하여 주는 소스인데
초성 검색에 사용하면 유용할 것 같네요.

초성검색

초성검색은 간단한 알고리즘이다. 
'ㄱㅇㅅ'로 검색하면 '강영수', '김영수', '김인수', '강연수' 등등 초성이 'ㄱㅇㅅ'으로 시작하는 모든 단어를 찾아주는 것이다. 
핸드폰에서 전화번호를 검색할때 많이 사용하는 기능이다. 
이 검색의 장점은 명백하다.

 
첫째 검색어의 타이핑수가 줄어든다.
둘째 검색의 성공확률이 높아진다. (애매모호한 검색어로 원하는 결과를 찾을수 있다. )
 
한국어는 초성, 중성, 종성 또는 초성,중성 으로 한글자가 만들어진다. 따라서 모든 글자에 포함되어 있는 초성으로 검색한다는것은 대략 
타이핑수를 1/2 ~ 1/3로 줄여준다.

 
둘째 장점은 좀더 흥미롭다. 한국어에서 목소리로 전달되는 단어중 잘못들을 확률이 높은 것은 중성, 종성이다. 굳이 정밀하게 따져보지 
않아도 누군가에게 이름을 들었는데 잘못들은 부분이 초성이었는지 중성 또는 종성 부분이었는지 생각해보면 쉽게 알수 있다.  따라서 정확하게 알지 
못하는검색어로 내가 원하는 결과를 얻고자 할때도 초성검색은 유용하게 쓰일수 있다.
초성검색을 실제로 이용하려면 약간의 작업이 필요하다. 대략적으로 살펴보면 우선 기존에 존재하는 데이타 베이스에 초성값을 계산해서 
입력해둘 필요가 있다. 그렇지 않으면 매 검색마다 기존 데이타의 초성값을 계산해야 할것이다. 두번째 작업은 사소한 것인데 한글자판에서 'ㄱ', 
'ㅅ'을 연속으로 입력해보면 'ㄳ'값이 입력된다. 이건 유효하지 않은 초성이다. 'ㄳ'은 종성값이지 초성값이 아니므로 이런값이 입력되지 않도록 
만들어주어야 한다. 'ㄳ'을 내부적으로 'ㄱㅅ'으로 바꾸어주던지 아예 'ㄳ'값이 입력되는 것을 막아도 된다.  물론 'ㄱ'을 입력하고 옆으로 
이동해서 'ㅅ'을 입력하는 방법으로 해결해도 되지만 사용자 인터페이스가 후지게 된다. 또한 타이핑도 늘어난다

 

- (NSString *)GetUTF8String:(NSString *)hanggulString {

NSArray *chosung = [[NSArray alloc]initWithObjects:@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",nil];

NSArray *jungsung = [[NSArray alloc]initWithObjects:@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",nil];

NSArray *jongsung = [[NSArray alloc]initWithObjects:@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@" ",@"",@"",nil];

NSString *textResult = @"";

for (int i=0;i<[hanggulString length];i++) {

NSInteger code = [hanggulString characterAtIndex:i];

if (code >= 44032 && code <= 55203) {

NSInteger uniCode = code - 44032;

NSInteger chosungIndex = uniCode / 21 / 28;

NSInteger jungsungIndex = uniCode % (21 * 28) / 28;

NSInteger jongsungIndex = uniCode % 28;

textResult = [NSString stringWithFormat:@"%@%@%@%@", textResult, [chosungobjectAtIndex:chosungIndex], [jungsung objectAtIndex:jungsungIndex], [jongsung objectAtIndex:jongsungIndex]];

}

}

return textResult;

}


- (void)loadView {

[super loadView];

NSLog@"%@", [self GetUTF8String:@"투덜이"]);

}

반응형