2012-09-03 6 views
4

사전 일치 문자열 (사전 정의 된 문자열 집합 포함)을 제공하는 문자열 일치 코드 또는 알고리즘이 있습니까?문자열 근사 (사전에서 가장 가까운 일치하는 문자열 가져 오기)

예 : 사전에 10 개의 문자열 (문자열 집합)이있는 경우 사용자가 일부 문자열을 입력하면 알고리듬은 사전과 거의 일치하는 문자열을 알려야합니다. 일치하는 값 (또는 백분율)과 일치하는 문자열을 얻으면 그 값은 훌륭합니다.

+0

안녕하세요. 검색 사전은 얼마나 큽니까? – Vitaliy

답변

0

에 읽을 수 있습니다.

간단한 아이디어는 네 가지 기본 작업이 있습니다

  • 삽입 (지옥 - 오> 지옥 )
  • 교체 (좋은 ->R 얼음)
  • 삭제를 (bowlin g -> 보울 린)
  • 스와핑 (brohter-> bro er)

알고리즘은 단어와 사전 사이의 거리를 계산해야합니다. 가장 작은 거리는이 단어가 주어진 입력과 더 정확하게 일치 함을 의미합니다.

2

lucene 라이브러리를 사용하는 것이 더 좋다고 생각합니다. org.apache.lucene.search.spell 패키지를 사용하면 쉽게 사용할 수 있습니다. 3 알고리즘을 제공합니다. NGramDistance, LevensteinDistance, JaroWinklerDistance. try this

0

난 그냥 StringUtils에도 가지고 추가하고 싶었 a convenient Levenshtein Distance method 이후 버전이 가장 일치하는 컬렉션을 반복하고 기억하는 것만 큼 간단 후 것을 3.0

public static int getLevenshteinDistance(CharSequence s, 
        CharSequence t) 

:

public static Object findClosestMatch(Collection<?> collection, Object target) { 
    int distance = Integer.MAX_VALUE; 
    Object closest = null; 
    for (Object compareObject : collection) { 
     int currentDistance = StringUtils.getLevenshteinDistance(compareObject.toString(), target.toString()); 
     if(currentDistance < distance) { 
      distance = currentDistance; 
      closest = compareObject; 
     } 
    } 
    return closest; 
} 

주 상기의 메소드는 콜렉션이 null 안전하고, toString()가 감각적으로 구현 될 필요가있는 것을 나타냅니다.

+0

if 내부에 "distance = currentDistance"가 누락되어 있지 않습니까? –

+0

Woops 실제로, 일부 특정 코드를 제거해야했습니다, 내가 너무 열망했다 :) –

관련 문제