2010-08-06 5 views
3

다른 작업을 수행하기위한 여러 위젯을 열 수있는 최상위 메뉴 트리가있는 온라인 웹 응용 프로그램이 있습니다. 앱이 더욱 강력 해짐에 따라 트리가 커지고 탐색하기가 어려워졌습니다. 사용자가 메뉴 이름이나 그 일부를 입력 할 수있는 검색 기능을 구현했으며 정규식을 사용하여 사용자가 입력 한 것과 일치하는 메뉴 트리의 모든 항목을 찾습니다. My regex는 부분 단어와 스왑 된 단어를 허용하며 검색을 각 단어의 시작 부분으로 제한합니다. 그것이 허용하지 않는 한 가지 철자가 틀린 단어입니다. 철자가 틀린 단어를 허용하려면 정규식을 사용하지 않고 문자열 거리 메서드를 사용하지 않는 것이 가장 좋지만 부분 단어와 스왑 된 단어를 허용하고 싶습니다. 이것이 가능한가?Levenshtein 문자열의 일부분에서만 거리 (Java)

예를 들어, 지금 메뉴 항목이 "Finance Rate Maintenance"인 경우 다음 중 해당 항목이 "finance", "finance ra", "rate finance"등의 메뉴 항목과 일치합니다. "inance "inance"는 해당 메뉴 항목에 대한 단어의 시작 부분에 나타나지 않으므로 "rate"는 일치하지 않습니다. 필자는 "fnane rate"와 "rate maintenanceance"와 같은 검색을 약간 일치 시키려고합니다.

+2

그러나 "inance 속도"**입니다 ** 약간의 맞춤법,에있다 . 후자는 왜 일치해야합니까? 그건 말이 안돼. –

+0

현재 "incance rate"은 일치하지 않지만 문자열 거리가 구현되면 문자열 거리가 너무 크기 때문에 "anc rate"는 그렇지 않을 것이라고 상상합니다. 단어의 시작 부분에 바인딩하는 이유는 "서비스"라는 단어가 많은 항목이 있지만 사용자가 "피해자"를 검색 할 때 "지도 서비스"와 일치하는 검색이 바람직하지 않은 "지도 서비스"와 일치했기 때문입니다. 그들은 일반적으로 "VIC"라는 메뉴 항목을 찾습니다. –

답변

1

각 옵션에 단어 목록을 첨부하고 모든 단어가 포함 된 사전을 동시에 유지 관리합니다. 그런 다음 사용자가 쿼리를 입력하면 프로그램은 입력 한 모든 단어가 사전에 있는지 확인합니다. 그렇지 않은 경우 가장 가까운 단어를 찾을 수 있습니다. 문자열 거리를 수정하고 단어를 수정하십시오.

마지막으로, 수정 된 입력 단어와 공통된 단어를 가장 많이 사용하는 메뉴 옵션을 제안 할 수 있습니다.

(하지만 파이썬에서) 맞춤법 교정기의 좋은 예는 (사실, 훨씬 더 가까이) "fnane 속도"이하 더 http://norvig.com/spell-correct.html

+1

일반적인 생각은 좋지만 메뉴는 권한 때문에 로그인 할 때 동적으로 생성되므로 로그인 할 때 사전을 만들어 세션에 저장해야합니다. 할 수 있고, 가장 좋은 대답일지도 모르지만, 나는 조금 더 똑바로 뭔가를 기대하고 있었다. –

+0

나는 당신이 의미하는 것을 본다. 그것은 일어나서 달리기위한 공정한 일처럼 보인다. 사전을 생성하고 검색하는 것은 계산적으로 비용이 많이 들지 않습니다. – hb2pencil