2013-12-11 2 views
5

C++에서 다음을 구현하고 싶습니다.자동 수정 알고리즘

1) 주어진 단어가 사전에 있는지 확인하십시오. 사전 파일은 거대한 파일입니다. 100MB 또는 3-4 백만 단어를 고려하십시오.

2) 잘못된 단어에 대한 수정을 제안하십시오.

3) 자동 완성 기능.

내 접근이

1) 나는 그렇게 효율적 의지를 검색 트리를 구축 할 계획입니다.

2) 자동 수정 기능을 구현하는 방법이 표시되지 않습니다.

3) 나는 나무

My tree Image

위의 모든 기능을 구현하는 최선의 데이터 구조 및 알고리즘은 무엇입니까

를 사용하여 자동 완성 기능을 구현 할 수 있습니까?

+5

trie처럼 보입니다. http://en.wikipedia.org/wiki/Trie –

+0

위의 질문에 대한 완벽한 해결책은 https://github.com/msankith/Trie/tree/1입니다.1 – Ankith

+0

효율적으로 작동하는 동안이 방법은 다소 비효율적 인 솔루션이라는 것을 알았습니다. 시도는 효율적이지 않습니다. 또한 이것은 철자가 틀린 하나의 알파벳에 대해서만 철자를 교정 할 수 있습니다. – Pawan

답변

2

주어진 하위 트리의 모든 문자열을보고 자동 완성을 수행 할 수 있습니다. 선택하는 데 도움이되는 점수가 도움이 될 수 있습니다. 이것은 당신이 trie에서 그 경로를 따라 내려가는 "te"와 모든 가능한 결말을 얻기 위해 전체 서브 트리를 가로 지르는 것과 같은 방식으로 작동합니다.

수정하려면 트리 위에 http://en.wikipedia.org/wiki/Levenshtein_distance과 같은 것을 구현해야합니다. trie에서 주어진 경로를 처리했다면 경로 끝을 루트로하는 서브 트리의 모든 문자열에 결과를 재사용 할 수 있다는 사실을 사용할 수 있습니다.

+0

자동 보정을 구현하는 "Levenshtein distance"사용법? 내 이해에 따라 - Levenshtein Distance는 주어진 문자열과 문자열 목록 (사전)을 비교하는 데 사용됩니다. 그러나 내가 사전에있는 각 문자열과 비교해 보면 많은 시간이 걸립니다. 더 나은 실행 알고리즘이 있습니까? – Ankith

+0

@Ankith : BK 나무는 Levenshtein 거리가 메트릭 공간이라는 사실을 이용하여 문자열 집합 (사전)에서 한 문자열 (쿼리)의 가장 가까운 이웃을 검색하는 알고리즘입니다. –

1

1) 외에 나무에서, 또 다른 흥미로운 방법 http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
BWT 접미사 배열 용이 주어진 단어 접두어를 추적하는 데 사용될 수 BWT
이다. 오류 수정에 대한

2), 현대 접근 방식은 좌입니다 : 무작위로 구글 검색에 의해 제공
http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search

일부 링크 : 나는에 노력하고있다
https://cs.stackexchange.com/questions/2093/efficient-map-data-structure-supporting-approximate-lookup
https://code.google.com/p/likelike/
http://aspguy.wordpress.com/2012/02/18/the-magic-behind-the-google-search/

3

같은 문제. 지금까지 내가 만난 최고의 솔루션은 자동 완성을 위해 삼항 검색 트리를 사용하는 것입니다. Ternary Search Trees는 시도보다 공간 효율적입니다. 내 삼항 검색 트리에서 조회 한 문자열을 찾을 수 없다면 가장 가까운 일치를 찾는 데 이미 빌드 된 BK 트리를 사용합니다. BK Tree는 내부적으로 Levenshtein 거리를 사용합니다. 너

메타 폰은 탐험하고 싶은 무언가이기도하지만 메타 폰의 깊이에 빠져들지는 않는다.

원한다면 BK TREE + TERNARY SEARCH TREE 용 Java 솔루션을 가지고 있습니다.

+1

- http://www.dhruvbird.com/autocomplete.pdf – Pawan

+0

잘못 입력 된 단어에 대한 자동 수정 또는 제안 사항이 있습니까? 나는 무차별 대입을 사용하여 구현했다. 내가 말했던 것처럼 더 나은 알고리즘 – Ankith

+0

이 필요하다. 자동으로 BK 트리를 사용한다. Levenshtein Distance를 내부적으로 사용합니다. 예를 들어 Cabllge는 최대 2 자까지 교정하도록 허용하면 양배추로 수정됩니다. 또한 허용 가능한 최대 Levenshtein 거리를 기반으로 다른 가능한 제안합니다. 그것은 무차별 한 것보다 훨씬 빨리 구현됩니다. – Pawan