빠른 맞춤법 검사기를 구축하기위한 효율적인 데이터 구조


41

꽤 큰 사전에서 작동하는 맞춤법 검사기를 작성하려고합니다. 철자가 틀린 단어에 가장 가까운 단어를 결정하기 위해 Damerau-Levenshtein 거리를 사용하여 사전 데이터를 효율적으로 색인화하는 효율적인 방법을 원합니다 .

공간 복잡성과 런타임 복잡성 사이에서 최상의 절충안을 제공하는 데이터 구조를 찾고 있습니다.

인터넷에서 찾은 내용에 따라 사용할 데이터 구조 유형에 대한 몇 가지 리드가 있습니다.

시도

trie-500px

이것은 내 첫 번째 생각이며 구현하기가 매우 쉽고 빠른 조회 / 삽입을 제공해야합니다. Damerau-Levenshtein을 사용한 대략적인 검색도 여기에서 구현하기 간단해야합니다. 그러나 포인터 저장소에 많은 오버 헤드가 있기 때문에 공간 복잡성 측면에서 매우 효율적으로 보이지 않습니다.

패트리샤 트리

trie-500px

이것은 기본적으로 포인터 저장 비용을 피하기 때문에 일반 Trie보다 적은 공간을 소비하는 것으로 보이지만, 내가 가지고있는 것과 같은 매우 큰 사전의 경우 데이터 조각화가 약간 걱정됩니다.

접미사 트리

접미사 -500px

나는 이것에 대해 잘 모르겠습니다. 일부 사람들이 텍스트 마이닝에 유용하다고 생각하지만 철자 검사기의 성능면에서 무엇을 줄지 확실하지 않습니다.

3 차 검색 트리

tst

이것들은 꽤 멋져 보이며 복잡성 측면에서 Patricia Tries와 더 가까워 야하지만 (Patricia Tries)보다 조각화가 더 나을 것인지는 확실하지 않습니다.

버스트 트리

파열

이것은 일종의 하이브리드처럼 보이며 Tries 등의 이점이 무엇인지 확실하지 않지만 텍스트 마이닝에 매우 효율적이라는 것을 여러 번 읽었습니다.


이 맥락에서 어떤 데이터 구조를 사용하는 것이 가장 좋으며 다른 구조보다 더 나은 점에 대한 피드백을 얻고 싶습니다. 맞춤법 검사기에 더 적합한 데이터 구조가 누락 된 경우에도 매우 관심이 있습니다.


patricia trie는 어떻게 포인터를 저장하는 비용을 피합니까? 그냥 en.wikipedia.org/wiki/Radix_tree 입니까? 그렇다면 여전히 많은 포인터를 저장한다고 생각하지만 일반적인 접두사가 한 번만 저장되기 때문에 공간을 크게 절약 할 수 있습니다.
Joe

구체적인 내용이 없으면 요청한 비교가 불가능할 수 있습니다. 특히 사전에 어떤 밀도가 있습니까? 맞춤법 실수를 어느 거리까지 감지하고 싶습니까? 사전 + 변형의 밀도는 무엇입니까? (여기서 밀도 는 저장된 세트에 포함 된 길이 의 모든 단어의 일부를 의미합니다 .)n
Raphael

1
@linker : 사전에 대한 모든 변형을 시도 했습니까? 고정 된 사용 사례를 고려하면 어느 데이터 구조가 얼마나 많은 공간을 소비하는지 알아내는 가장 빠른 방법 일 것입니다.
Raphael

1
기본 사전 일 뿐이며 철자가 올바른 단어로 알려진 목록입니다.
Charles Menguy

1
이 가장 밀접한 관련 질문 도 참조하십시오 .
Raphael

답변:


4

나는 같은 문제에 직면했지만 다른 접근법을 취했다. 비슷한 단어에 대해 동일하거나 가까운 숫자를주는 일종의 "해시"함수를 구성 할 수 있습니다.

문제는 삽입 / 제거하는 단어에 대해 "좋은"결과를 제공하고 전환에 "나쁜"결과를 제공하는 기능입니다. 예 : 문자를 숫자에, 비슷한 문자를 인접한 숫자에 매핑하고 단어의 모든 문자에 대해 합산하십시오. 그런 다음 각 키의 세트로 해시 테이블을 작성하고 단어의 교차점을 찾으십시오.

"space"оf 단어를 보면 일부 결과를 얻을 수 있습니다. 문자 변경을위한 X, 추가 / 제거를위한 Y, 전환을위한 Z 또는 이와 유사한 것.

그러나 이것은 추상적 인 아이디어 일뿐입니다. 구현 할 시간이 충분하지 않습니다.


Soundex
가하는

4

무차별 대입이 불가능한 경우 (항상 무차별 대입 시도) 빠른 조사를 위해 메트릭 트리 를 사용할 수 있습니다 . 이웃을 찾는 것은 에서 가능하지만 의 상수는 수 있습니다. 당신은 수백만 개의 현을 가지고있는 것처럼 보이므로 좋은 절충이 될 수 있습니다.OO(log(n))O

메트릭 트리에 문자열을 저장하지 마십시오. 인덱스를 저장하고 문자열을 Patricia 트리에 저장하십시오.

어떤 나무를 사용 해야하는지 잘 모르겠습니다. 데이터와 요구 사항에 따라 달라집니다 (빠른 삽입이 필요합니까?). 한 트리가 다른 트리보다 효율적이라는 것을 알게되면 질문을 업데이트하십시오.

lucene과 같은 특수 도구를 볼 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.