Bir diziyi filtrelemek için bulanık arama JavaScript kitaplığı arıyorum. Fuzzyset.js ve fuse.js kullanmayı denedim , ancak sonuçlar korkunç (bağlantılı sayfalarda deneyebileceğiniz demolar var).
Levenshtein mesafesi hakkında biraz okuma yaptıktan sonra, kullanıcıların yazarken ne aradıklarına dair zayıf bir yaklaşım olarak bana çarpıcı geliyor. Bilmeyenler için, sistem iki dizeyi eşleştirmek için kaç ekleme , silme ve değişiklik gerektiğini hesaplar .
Levenshtein-Demerau modeli sabitlenmiştir bariz bir kusur, hem olmasıdır blub ve memeyi eşit benzer kabul edilir ampul (her iki sübstitüsyona gerektiren). Bununla birlikte, ampülün , boob'dan daha çok blub'a benzediği açıktır ve az önce bahsettiğim model, transpozisyonlara izin vererek bunu kabul ediyor .
Ben bir dizi var eğer öyleyse, metin tamamlama bağlamında bu kullanmak istiyorum ['international', 'splint', 'tinder']
ve benim sorgu int , bence uluslararası daha çok daha rütbe gerektiğini splint eski 10 puan (daha yüksek = kötü) olsa bile, ikincisine karşı 3.
Yani aradığım şey (ve yoksa yaratacağım), aşağıdakileri yapan bir kitaplık:
- Farklı metin işlemlerini ağırlıklandırır
- Her bir manipülasyonu, bir kelimede nerede göründüklerine bağlı olarak farklı şekilde ağırlıklandırır (erken manipülasyonlar, geç manipülasyonlardan daha maliyetlidir)
- Alaka düzeyine göre sıralanmış bir sonuç listesi verir
Böyle bir şeye rastlayan oldu mu? StackOverflow'un yazılım önerileri istemek için bir yer olmadığının farkındayım, ancak yukarıdakiler üstü kapalı (artık değil!): Bunu doğru şekilde mi düşünüyorum?
Düzenle
Konuyla ilgili iyi bir makale (pdf) buldum . Bazı notlar ve alıntılar:
Afin düzenleme mesafesi fonksiyonları, bir dizi ekleme veya silme işlemine nispeten daha düşük bir maliyet atar
Smith-Waterman mesafe fonksiyonunun (Durban ve diğerleri 1998) belirli maliyet parametreleri ile afin bir varyantı olan Monger-Elkan mesafe fonksiyonu (Monge & Elkan 1996)
İçin Smith-Waterman mesafe (Ara) , "yerine toplam dizisinin bakarak, Smith-Waterman algoritması tüm olası uzunlukları segmentlerini karşılaştırır ve benzerlik ölçüsü optimize eder". Bu n-gram yaklaşımıdır.
Bir düzenleme mesafesi modeline dayanmayan geniş ölçüde benzer bir ölçü Jaro ölçüsüdür (Jaro 1995; 1989; Winkler 1999). Kayıt-bağlantı literatüründe, iki dizge arasındaki ortak karakterlerin sayısına ve sırasına dayanan bu yöntemin varyantları kullanılarak iyi sonuçlar elde edilmiştir.
Bunun Winkler'e (1999) bağlı bir varyantı da en uzun ortak ön ekin uzunluğunu P kullanır.
(öncelikle kısa dizeler için tasarlanmış gibi görünüyor)
Metin tamamlama amaçları için, Monger-Elkan ve Jaro-Winkler yaklaşımları en mantıklı gibi görünüyor. Winkler'in Jaro metriğine eklenmesi, kelimelerin başlangıçlarını daha ağır bir şekilde ağırlıklandırıyor. Ve Monger-Elkan'ın afin yönü, bir kelimeyi tamamlama gerekliliğinin (sadece bir dizi eklemeden ibarettir) onu çok fazla olumsuz etkilemeyeceği anlamına gelir.
Sonuç:
TFIDF sıralaması, çeşitli belirteç tabanlı mesafe ölçütleri arasında en iyi performansı gösterdi ve Monge ve Elkan tarafından önerilen ayarlanmış bir afin-boşluk düzenleme-mesafe ölçüsü, birkaç dizi düzenleme-mesafe ölçütü arasında en iyi performansı gösterdi. Şaşırtıcı derecede iyi bir mesafe metriği, Jaro tarafından önerilen ve daha sonra Winkler tarafından genişletilen hızlı bir sezgisel şemadır. Bu, neredeyse Monge-Elkan şeması kadar iyi çalışır, ancak bir kat daha hızlıdır. TFIDF yöntemini ve Jaro-Winkler'ı birleştirmenin basit bir yolu, TFIDF'de kullanılan tam jeton eşleşmelerini Jaro-Winkler şemasına dayalı yaklaşık jeton eşleşmeleriyle değiştirmektir. Bu kombinasyon, ortalama olarak Jaro-Winkler veya TFIDF'den biraz daha iyi performans gösterir ve bazen çok daha iyi performans gösterir. Ayrıca performans açısından, bu makalede ele alınan en iyi ölçümlerin birkaçının öğrenilmiş bir kombinasyonuna yakındır.