PHP levenshtein / similar_text hızlandırmak

3 Cevap php

Şu anda similar_text nedeniyle karşılaştırmalar sayısına çok yavaş olmasına rağmen çalışır ~ 50.000 listesine karşı bir dize karşılaştırmak için kullanıyorum. Bu ~ 500 eşsiz dizeleri karşılaştırmak için yaklaşık 11 dakika sürer.

Bu çalıştırmadan önce ben bu kadar her açmasının çalıştırdıktan sonra o anlık yakın geçmişte işlenmiş olup olmadığını görmek için veritabanlarını kontrol edebilirim.

Ben kılavuzda yayınlanan LevenshteinDistance fonksiyon birisi ilginç görünüyor levenshtein biraz daha hızlı olacağını kullanırken ve eminim. Ben önemli ölçüde daha hızlı bu yapabilirdiniz bir şey eksik?

3 Cevap

Sonunda, her iki levenshtein ve similar_text hem de bile kontrolleri dolu ve yalnızca son olarak onları bunlardan birini kullanarak geçmek zorunda dizeleri sayısı ile çok yavaş başvurmaktadırlar.

Bir deneme olarak, ben interperated kod üzerinde olurdu ne kadar hızlı görmek için C # için kod bazı taşıdık. Bu aynı kümesi ile yaklaşık 3 dakika içinde koştu.

Sonraki Ben tabloya fazladan bir alan eklenmiş ve her satır için anahtarları üretmek için çift metaphone PECL uzantısı kullanılır. Bazı sayılar dahil beri bu çiftleri neden olsa da sonuçlar iyi idi. Ben o zaman yukarıdaki fonksiyonlar aracılığıyla her birini çalıştırmak değil karar olabilirdi sanırım.

Ben basit bir yaklaşım seçti sonunda, çok iyi çalıştı tam metnini MySQLs. Onlar algılamak kolay ve doğru olmasına rağmen zaman zaman hatalar vardır. Ayrıca yaklaşık 3-4 saniye içinde, çok hızlı çalışır.

Belki sen ilk tam bir eşleşme için dize karşılaştırarak (ve ilk uzunluğu aynıdır eğer karşılaştırarak), ve atlamak ise daha pahalı similar_text çağrısı 'kısa devre' Bazı kontroller.

@ Jason belirtildiği gibi, bir O (N ^ 3) algoritma iyi bir seçim olacak asla.

Levenshtein otomat kullanırken (mesafe ile bir dizeyle eşleşir otomat k) Eğer eşleşen bir çek yapabilirim O(n), burada n dize uzunluğu Eğer kontrol ediyoruz. k max mesafe ve taban dize n boyudur otomat İnşaat, O(kn) alacaktır.