서비스 프레임워크 설명서 |
오타 교정은 사용자가 입력한 검색어에 대해 맞춤법 검사 후 올바른 검색어를 제안하는 기능이다. 사용자가 입력한 검색어 전체에 대해 맞춤법 검사를 수행할 수도 있고 혹은, 사용자가 입력한 검색어를 단어 단위로 잘라서 각각 맞춤법 검사를 수행할 수도 있다.
본 예제에서는 후자의 방식을 채택하였다. 예를 들어 사용자가 "모차르뜨 클레식 음악"이라는 검색어를 입력했을 경우 "모차르뜨", "클레식", "음악"에 대해 각각 맞춤법 검사를 수행한다. 아래는 단어 기반 오타 교정을 구현한 코드이다.
1. … 2. if (!query.equals(originalQuery)) { boolean misspell = false; // 오타 포함 여부 3. if (query.length() > 0) { 4. String tokens[] = StringUtils.split(query); // 오타 교정은 단어 기반으로 수행한다. 5. for (int i = 0; i < tokens.length; i++) { 6. String[] spells = ksfclient.suggestSpell(tokens[i]); // 오타가 존재할 경우 7. if (spells.length > 0) { // 추천된 교정 단어들 중 첫 번째 것을 택한다. 8. tokens[i] = spells[0]; 9. misspell = true; 10. } 11. } 12. if (misspell) { // 추천 받은 교정 단어와 추천 받지 않았을 경우 원래 단어로 새로 검색어를 // 조합한다. 13. session.setAttribute("spell", StringUtils.join(tokens, ' ')); 14. } 15. } 16. } 17. …
맞춤법 검사를 수행하면 추천하는 교정 단어가 하나 이상일 수 있다. 예를 들어 "milion"이란 단어로 맞춤법 검사를 수행하면 "million", "milian", "malian" 세 개의 후보가 추천된다. 위의 예제에서는 추천된 교정 단어 중 첫 번째 것을 택하도록 하였다. "모차르뜨 클레식 음악"이라는 검색어에 대해 "모차르뜨", "클레식", "음악"으로 각각 맞춤법을 검사하면 "모짜르뜨", "클래식"이 교정 단어로 각각 추천된다. "음악"의 경우에는 교정 단어가 없다. 이렇게 추천받은 교정 단어 및 원래 검색 단어를 다시 조합하여 사용자에게 "모짜르뜨 클래식 음악"이라는 검색어를 추천한다.
1. <c:if test="${not empty spell}"> 2. <dl class="suggestions dl-horizontal"> 3. <dt>검색어제안</dt> 4. <dd> 5. <strong>"<a><c:out value="${spell}"/></a>" </strong>로 검색하시겠습니까? 6. </dd> 7. </dl> 8. </c:if>