레 벤슈 테인 거리를 빠르게 계산


24

허용되는 단어 (알파벳순으로 정렬 된)와 단어로 구성된 거대한 데이터베이스가 제공되면 Levenshtein 거리 측면에서 주어진 단어와 가장 가까운 데이터베이스에서 단어를 찾으십시오.

물론 순진한 접근 방식은 주어진 단어와 사전의 모든 단어 사이의 레 벤슈 테인 거리를 간단히 계산하는 것입니다 (실제로 거리를 계산하기 전에 데이터베이스에서 이진 검색을 수행 할 수 있음).

이 문제에 대한보다 효율적인 해결책이 있는지 궁금합니다. 검색 할 단어의 수를 줄이거 나 레 벤슈 테인 거리 알고리즘에 대한 최적화를 가능하게하는 휴리스틱 일 수 있습니다.

주제에 관한 논문 링크.

답변:


16

당신이 요구하는 것은 편집 거리에서 인접 이웃 검색의 문제입니다. 이론적 결과 또는 휴리스틱에 관심이 있는지 언급하지 않았으므로 전자에 대답하겠습니다.

인접 거리 검색 구조를 구축 할 때 편집 거리가 다소 불쾌합니다. 주된 문제는 측정 항목 으로서 차원 축소 및 근사화를 위해 과 같이 잘 알려진 다른 나쁜 측정 항목과 같이 한다는 것입니다. 이 주제에 대해 읽을만한 방대한 작업이 있으며 가장 좋은 출처는 Alex Andoni 의 논문입니다 . 포인터를 뒤로 (예 : FOCS 2010 논문에서) 따라 가면 좋은 출처를 얻을 수 있습니다.1


1
미터법 공간에 대해 내가 아는 전부는 의미론에서 나온 것이므로 질문 : Levenshtein 메트릭을 괜찮은 수준으로 포함시키는 것이 있습니까? 이로 인해 이진 트리 알고리즘이 생길 수 있습니다.
Neel Krishnaswami

나는 확실하지 않다. 나는 대답이 일반적으로 없다고 생각하지만, 지적 할 것이 없다.
Suresh Venkat

boytsov.info/pubs 의 두 번째 논문 은 Levenshtein 및 Damereau-Levenshtein 편집 거리에서 근처의 주변 검색을위한 가능한 솔루션에 대한 훌륭한 조사입니다.
a3nm

@NeelKrishnaswami 울트라 메트릭에 임베드하면 최소한 왜곡 이 발생합니다. 여기서 는 문자열 길이입니다. Krauthgamer 및 Rabani 로 인해 에 임베드하기위한 왜곡 하한값이 뒤 . 는 등각 적으로 임베드되는 유클리드 공간에 아이소 메트릭으로 임베드되기 입니다. d L 1 L 1Ω(logd)dL1L1
Sasho Nikolov


5

허용 할 잘못 편집 한 부분이 적 으면 점선으로 된 접미사 트리를 사용해보십시오 . 면책 조항 : 나는 그 논문을 썼지 만 원하는 것을 해결합니다. 디스크 공간 비용은 높지만 쿼리는 실제로 빠릅니다.

일반적으로 다른 방법으로 살펴 보는 것이 좋습니다. 사전에있는 모든 단어의 색인이 있습니다. 이제 입력 단어 w의 경우 사전에 있으면 중지하십시오. 그렇지 않으면 거리 1에서 모든 변형을 생성하고 찾으십시오. 그들이 없으면 거리 2 등에서 변화를 찾으십시오.

이 기본 아이디어에는 몇 가지 개선 사항이 있습니다.


1
논문재현 가능한 연구 자료실에 대한 링크를 포함해야합니다 .
Dan D.

4

간단한 해결책은 단어를 트라이로 저장하는 것입니다. 그런 다음 각 단어에 대해 별도로 계산하는 대신 표준 동적 프로그래밍 알고리즘을 사용하여 쿼리 단어의 Levenshtein 거리를 트라이에 대해 계산할 수 있습니다. 최악의 시간 복잡도는 점진적으로 개선되지는 않지만 가장 유망한 분기를 먼저 확장하면 쿼리 길이 , 알파벳 크기에 대해 시간과 같은 결과가 나타납니다. 를 입력하고 거리 편집하십시오 .m σ kO(mk+1σk)mσk


4

cs.stackexchange.com ( /cs//a/2096/1490 ) 에서 매우 비슷한 질문에 대한 답변을 작성한 다음이 질문을 찾았습니다. 대한이 대답 대략적인 편집 거리의 가까운 이웃 검색 (즉, 알고리즘은 대략 쿼리 문자열의 가장 가까운 이웃으로 쿼리 문자열에 가까이있는 문자열을 출력). 여기에 주어진 답변에서 내가 언급 한 참고 문헌을 찾지 못했기 때문에 여기에 게시하고 있습니다.



2

당신은 사용할 수 있습니까?

그런 다음 "Dim you mean" "에 의해 반환 된 답변과 동적 프로그래밍을 사용하여 입력 문자열 사이의 Levenshtein 거리를 찾으십시오.


이 답변을 이해하지 못합니다. 이 질문은 레 벤슈 테인 거리를 계산하는 방법이나 블랙 박스 철자 검사기의 출력과 비교하는 것이 아니라 주어진 입력과 가까운 레 벤슈 테인 거리가있는 큰 사전에서 효율적으로 단어를 찾을 수있는 방법을 묻습니다.
Huck Bennett

@Huck Bennett : @Grigory Javadyan이 Did you mean?기능을 구축하고 있다고 생각했습니다 . 게다가 Did you mean?주어진 입력에 매우 가까운 단어를 반환하고 매우 효율적으로 수행합니다. :)
Pratik Deoghare

나는 당신의 아이디어가 좋다고 생각하지만 Grigory는 더 깊고 더 구체적인 것을 요구하는 것 같습니다.
Huck Bennett

@Huck Bennett : 네 맞아요! :)
Pratik Deoghare

-1

한 가지 방법은 기계 학습 모델을 훈련시켜 단어를 벡터에 매핑하고 레 벤슈 테인 거리를 유클리드 거리에 매핑하는 것입니다. 그런 다음 사용하려는 사전의 벡터로 KDTree를 작성할 수 있습니다. 나는 이것을 수행하는 jupyter 노트북을 만들었습니다 : https://gist.github.com/MichaelSnowden/9b8b1e662c98c514d571f4d5c20c3a03

DW의 의견에 따라 :

  1. 훈련 절차 = 적응 적 기울기
  2. 손실 함수 = 실제 편집 거리와 유클리드 거리 사이의 평균 제곱 오차
  3. 훈련 데이터 = 1 ~ 32 자 길이의 임의 문자열 (일반적인 오타의 실제 분포와 일치하는 데이터로 향상 될 수 있음)
  4. 정량적 결과 : 배치 크기가 2048 (벽 시간 = 약 1 분) 인 약 150 개의 에포크에 대해 학습 한 후 512 차원의 단어 임베딩을 사용하여 숨겨진 레이어 하나, 실제 편집 거리와 예측 된 편집 거리 사이의 평균 절대 오차 약 0.75에 위치합니다. 즉, 예상 편집 거리가 대략 한 문자 떨어져 있음을 의미합니다.

모델 구조의 요약 :

  1. 널 문자를 포함하여 각 문자에 대해 학습 된 임베드를 작성하십시오 (나중에 문자 한계 아래 오른쪽 패드 텍스트에 사용됨)
  2. 문자의 한계에 도달 할 때까지 텍스트의 오른쪽을 널 문자로 채 웁니다 (32)
  3. 이러한 임베딩을 연결
  4. 피드 포워드 신경망을 통해 임베딩을 실행하여보다 낮은 차원의 워드 임베딩 (512 차원)을 생성합니다.
  5. 두 단어를 위해 이것을하십시오
  6. 벡터 사이의 유클리드 거리 찾기
  7. 손실을 실제 레 벤슈 테인 거리와 유클리드 거리 사이의 평균 제곱 오차로 설정

내 훈련 데이터는 임의의 문자열이지만 훈련 데이터가 (오타 / 올바른 단어) 쌍이면 결과가 실제로 향상 될 수 있다고 생각합니다. 나는 /usr/share/dict/words일반적으로 사용 가능하기 때문에 그냥 사용 했습니다.


2
Levenshtein 거리 근처에있는 단어가 유사한 벡터에 매핑되도록 ML 모델을 어떻게 훈련합니까? 어떤 훈련 절차와 손실 기능을 사용합니까? 링크가 작동을 멈추더라도 답변이 여전히 유용하고 사용중인 방법을 이해하기 위해 노트북을 파지 않아도되도록 답변에 방법을 요약 할 수 있습니까? 또한 정량적 인 방식으로 얼마나 잘 작동하는지 평가할 수 있습니까? 이것이 대안보다 낫습니까?
DW

그것이 말하듯이 이것은 CSTheory에 적합하지 않다고 생각합니다. 즉, 구체적으로 제안 된 내용을 알지 못하며 이론적 근거가 없습니다.
Clement C.

@DW 죄송합니다. 링크가 다운 될 때 (또는 노트북을 찌르고 싶지 않은 경우) 포괄적으로 편집해야합니다. 비록 이것이 연구가 아니기 때문에 이것이 실제로 CS 이론은 아니지만, 나는 그것이 훈련과 추론 모두에 빠르고 빠르기 때문에 실용적인 접근법이라고 생각합니다.
michaelsnowden

1
임의의 문자열을 훈련하고 있습니다. 그러한 두 스트링 사이의 예상되는 레 벤슈 테인 거리는 대략 더 긴 스트링의 길이 일 것이다. 따라서 임의의 문자열에서이 거리를 추정하는 것은 매우 쉽지만 실제 데이터를 처리하는 데는 유용하지 않습니다. 임베딩이 문자열의 길이를 인코딩 할 수 있다고 생각하므로 사소하고 쓸모없는 것을 수행하는 멋진 방법을 만들었을 것입니다. 이것은 ML을 사용할 때 발생하는 문제입니다. 사용하는 손실 기능에 매우 민감합니다.
DW

@DW 노트북에서 결과를 보면, 검색 결과 같은 길이의 문자열 만이 아니라 적절한 결과가 나타납니다. 정말 당신이 그것을 탈지하는 것이 좋습니다. 나는 그것을 사소하고 쓸모없는 것으로 부르지 않을 것입니다.
michaelsnowden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.