Я шукаю бібліотеку нечіткого пошуку JavaScript для фільтрації масиву. Я спробував використовувати fuzzyset.js і fuse.js , але результати жахливі (є демо-версії, які можна спробувати на пов'язаних сторінках).
Прочитавши деякий час на відстані Левенштейна, це здається мені поганим наближенням того, що користувачі шукають під час введення. Для тих, хто не знає, система обчислює, скільки потрібно вставити , видалити та замінити , щоб відповідати дві рядки.
Один очевидний недолік, який закріплений в моделі Левенштейна-Demerau, що обидва ревіти і бовдура вважаються однаково схожі на цибулини (кожен з яких вимагає дві заміни). Зрозуміло, однак, що цибулина більше схожа на ревіти , ніж бовдура є, і модель , яку я тільки що згадав визнає , що, дозволяючи транспозиція .
Я хочу використати це в контексті завершення тексту, тому, якщо у мене є масив ['international', 'splint', 'tinder']
, і мій запит є int , я думаю, що міжнародний повинен оцінювати більш високу, ніж шпагату , навіть якщо у першого є оцінка (вище = гірше) 10 порівняно з останніми 3.
Отож, що я шукаю (і буду створювати його, якщо його не існує) - це бібліотека, яка робить наступне:
- Важить різні текстові маніпуляції
- Кожна маніпуляція зважує по-різному, залежно від місця їх появи (ранні маніпуляції коштують дорожче, ніж пізні маніпуляції)
- Повертає список результатів, відсортований за релевантністю
Хтось натрапив на щось подібне? Я усвідомлюю, що StackOverflow не є запитом для програмних рекомендацій, але неявно (вже не!) У вищесказаному: чи я думаю про це правильно?
Редагувати
Я знайшов хороший статтю (pdf) на цю тему. Деякі примітки та уривки:
Функції Affine для редагування відстані призначають відносно нижчу вартість послідовності вставок або видалень
функція дистанції Монгера-Елкана (Monge & Elkan 1996), яка є афінним варіантом функції відстані Сміта-Уотермана (Durban et al. 1998) з конкретними параметрами витрат
Для відстані Сміта-Уотермана (вікіпедія) "Замість того, щоб дивитись на загальну послідовність, алгоритм Сміта-Уотермана порівнює сегменти всіх можливих довжин і оптимізує міру подібності". Це n-грамовий підхід.
Широко подібною метрикою, яка не ґрунтується на моделі дистанційного редагування, є метрика Яро (Jaro 1995; 1989; Winkler 1999). У літературі про зв'язування записів добрі результати отримані за допомогою варіантів цього методу, який ґрунтується на кількості та порядку загальних символів між двома рядками.
Варіант цього через Winkler (1999) також використовує довжину P найдовшого загального префікса
(здається, призначені в основному для коротких струн)
З метою доповнення тексту, здається, підхід Монгер-Елкан та Яро-Вінклер має найбільш сенс. Доповнення Вінклера до метрики Джаро значно виважує початки слів. І споріднений аспект Монгер-Елкана означає, що необхідність завершити слово (що є просто послідовністю доповнень) не буде занадто сильно недобросовісною.
Висновок:
рейтинг TFIDF виявився найкращим серед кількох метрик відстані на основі лексем, а налаштована метрика коректування відстані на афінному розриві, запропонована Монже та Елканом, найкраща серед кількох рядкових показників редагування відстані. Напрочуд гарна метрика відстані - це швидка евристична схема, запропонована Джаро та пізніше розширена Вінклером. Це працює майже так само, як і схема Монже-Елкана, але на порядок швидше. Один з простих способів поєднання методу TFIDF і Jaro-Winkler - це заміна точних збігів токенів, які використовуються в TFIDF, на приблизні відповідність жетонів на основі схеми Jaro-Winkler. Ця комбінація в середньому трохи краща, ніж або Яро-Вінклер, або TFIDF, а іноді і набагато краще. Це також є близьким по продуктивності до вивченого поєднання декількох найкращих показників, розглянутих у цій роботі.
krole
не повертається Final Fantasy V: Krile
, хоча я цього хотів би. Це вимагає, щоб усі символи запиту були присутні в одному порядку в результаті, що є досить короткозорим. Здається, єдиний спосіб здійснити нечіткий пошук - це мати базу даних загальних помилок.