PHP에서 Levenshtein / 유사 _text 속도를 높이고 있습니다
-
06-07-2019 - |
문제
나는 현재 사용 중입니다 유사한_text 비교 횟수로 인해 ~ 50,000 목록과 문자열을 비교하려면 매우 느립니다. ~ 500 개의 고유 한 줄을 비교하는 데 약 11 분이 걸립니다.
이것을 실행하기 전에 데이터베이스를 확인하여 과거에 처리되었는지 여부를 확인하므로 초기 실행 후 매번 즉시 가깝습니다.
나는 확실하다 Levenshtein 약간 더 빠르고 Levenshteindistance 기능은 매뉴얼에 게시 한 사람이 흥미로워 보입니다. 이것을 훨씬 더 빨리 만들 수있는 것을 놓치고 있습니까?
해결책
결국 둘 다 levenshtein
그리고 similar_text
수표가 많고 최후의 수단으로 만 사용하더라도 끈의 수에 따라 너무 느 렸습니다.
실험으로, 나는 일부 코드를 C#에 포팅하여 인터페이스 코드가 얼마나 빠른 지 확인했습니다. 동일한 데이터 세트로 약 3 분 안에 실행되었습니다.
다음으로 테이블에 추가 필드를 추가하고 이중 중유 PECL 확장을 사용하여 각 행에 대한 키를 생성했습니다. 일부 숫자가 포함되어 있기 때문에 결과는 좋았습니다. 그런 다음 위의 기능을 통해 각각을 실행할 수 있었지만 결정하지 않기로 결정했습니다.
결국 나는 가장 간단한 접근 방식을 선택했습니다. 때로는 탐지하고 수정하기 쉽지만 실수가 있습니다. 또한 약 3-4 초 만에 매우 빠르게 실행됩니다.
다른 팁
아마도 당신은 정확한 일치를 위해 문자열을 먼저 비교하여 (그리고 길이가 동일 한 경우 먼저 비교하여) 일부 수표를 '단락'할 수 있습니다. similar_text
전화.
@jason이 지적했듯이 O (n^3) 알고리즘은 결코 좋은 선택이되지 않습니다.
Levenshtein Automaton을 사용할 때 (거리가있는 문자열과 일치하는 오토 마톤 k
) 일치하는 수표를 수행 할 수 있습니다 O(n)
, 어디 n
확인하는 문자열의 길이입니다. 오토 마톤을 건설 할 수 있습니다 O(kn)
, 어디 k
최대 거리와 n
기본 문자열의 길이.