Collapse AllExpand All

4.8.2. 오타 교정

sample3.jsp

오타 교정은 사용자가 입력한 검색어에 대해 맞춤법 검사 후 올바른 검색어를 제안하는 기능이다. 사용자가 입력한 검색어 전체에 대해 맞춤법 검사를 수행할 수도 있고 혹은, 사용자가 입력한 검색어를 단어 단위로 잘라서 각각 맞춤법 검사를 수행할 수도 있다.

본 예제에서는 후자의 방식을 채택하였다. 예를 들어 사용자가 "모차르뜨 클레식 음악"이라는 검색어를 입력했을 경우 "모차르뜨", "클레식", "음악"에 대해 각각 맞춤법 검사를 수행한다. 아래는 단어 기반 오타 교정을 구현한 코드이다.

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>
결과

그림 C.10. 오타교정

오타교정