Szukam rozmytej biblioteki wyszukiwania JavaScript do filtrowania tablicy. Próbowałem używać fuzzyset.js i fuse.js , ale wyniki są straszne (są wersje demonstracyjne, które możesz wypróbować na połączonych stronach).
Po przeczytaniu informacji o odległości Levenshteina, wydaje mi się, że jest to słabe przybliżenie tego, czego szukają użytkownicy podczas pisania. Dla tych, którzy nie wiedzą, system oblicza, ile wstawień , usunięć i podstawień jest potrzebnych, aby dopasować dwa ciągi.
Oczywistą wadą, która jest zamocowana na modelu Levenshteina-Demerau jest to, że zarówno Blub i cycek są traktowane jednakowo podobny do bańki (każde wymaga dwie zmiany). Widać jednak, że żarówka bardziej przypomina blub niż boob , a model, o którym właśnie wspomniałem, rozpoznaje to, dopuszczając transpozycje .
Chcę tego użyć w kontekście uzupełniania tekstu, więc jeśli mam tablicę ['international', 'splint', 'tinder']
, a moje zapytanie to int , myślę, że international powinno mieć wyższą rangę niż szyna , mimo że ta pierwsza ma wynik (wyższy = gorszy) 10 w porównaniu do tego ostatniego 3.
Więc to, czego szukam (i utworzę, jeśli nie istnieje), to biblioteka, która wykonuje następujące czynności:
- Waży różne manipulacje tekstem
- Waży każdą manipulację inaczej w zależności od tego, gdzie pojawiają się w słowie (wczesne manipulacje są droższe niż późne manipulacje)
- Zwraca listę wyników posortowanych według trafności
Czy ktoś spotkał coś takiego? Zdaję sobie sprawę, że StackOverflow nie jest miejscem, w którym można prosić o zalecenia dotyczące oprogramowania, ale ukryte (już nie!) W powyższym brzmi: czy myślę o tym we właściwy sposób?
Edytować
Znalazłem dobry artykuł (pdf) na ten temat. Kilka uwag i fragmentów:
Funkcje afinicznej odległości edycji przypisują relatywnie mniejszy koszt sekwencji wstawień lub usunięć
funkcja odległości Mongera-Elkana (Monge i Elkan 1996), która jest afinicznym wariantem funkcji odległości Smitha-Watermana (Durban et al. 1998) o określonych parametrach kosztowych
Dla odległości Smitha-Watermana (wikipedia) : „Zamiast patrzeć na całkowitą sekwencję, algorytm Smitha-Watermana porównuje segmenty o wszystkich możliwych długościach i optymalizuje miarę podobieństwa”. To podejście n-gramowe.
Zasadniczo podobną metryką, która nie jest oparta na modelu odległości edycji, jest metryka Jaro (Jaro 1995; 1989; Winkler 1999). W literaturze na temat łączenia rekordów dobre wyniki uzyskano przy zastosowaniu wariantów tej metody, opartej na liczbie i kolejności wspólnych znaków między dwoma ciągami.
Odmiana tego ze względu na Winklera (1999) wykorzystuje również długość P najdłuższego wspólnego przedrostka
(wydaje się być przeznaczony głównie do krótkich strun)
Do celów uzupełniania tekstu najbardziej sensowne wydają się podejścia Monger-Elkan i Jaro-Winkler. Dodatek Winklera do metryki Jaro efektywniej waży początki słów. A afiniczny aspekt Monger-Elkan oznacza, że konieczność dokończenia słowa (będącego po prostu sekwencją dodatków) nie będzie go zbytnio nie podobać.
Wniosek:
ranking TFIDF wypadł najlepiej spośród kilku metryk odległości opartych na tokenach, a dostrojona metryka odległości edycji z przerwami afinicznymi zaproponowana przez Monge i Elkana uzyskała najlepsze wyniki spośród kilku metryk długości edycji. Zaskakująco dobrym miernikiem odległości jest szybki schemat heurystyczny, zaproponowany przez Jaro, a później rozszerzony przez Winklera. Działa to prawie tak samo dobrze jak schemat Monge-Elkana, ale jest o rząd wielkości szybsze. Jednym prostym sposobem połączenia metody TFIDF i Jaro-Winklera jest zastąpienie dokładnych dopasowań tokenów używanych w TFIDF przybliżonymi dopasowaniami tokenów opartymi na schemacie Jaro-Winklera. Ta kombinacja działa średnio nieco lepiej niż Jaro-Winkler lub TFIDF, a czasami działa znacznie lepiej. Jego wydajność jest również zbliżona do wyuczonej kombinacji kilku najlepszych wskaźników rozważanych w tym artykule.