Próbuję dopasować pojedynczy termin do wyszukania w słowniku możliwych wyników za pomocą algorytmu odległości Levenshteina. Algorytm zwraca odległość wyrażoną jako liczba operacji wymaganych do przekształcenia ciągu wyszukiwania w dopasowany ciąg. Chcę przedstawić wyniki w rankingu procentowej listy najlepszych "N" (powiedzmy 10) meczów.Procentowa pozycja meczów za pomocą Levenshtein Dopasowywanie odległości
Ponieważ szukany ciąg może być dłuższy lub krótszy niż poszczególne ciągi słowników, jaka byłaby odpowiednia logika wyrażania odległości jako wartości procentowej, co w sposób jakościowy zmieniłoby dopasowanie "jako procent" do wyniku każdego zapytania ciąg, przy czym 100% oznacza dokładne dopasowanie.
Rozważałem następujące opcje:
Q = query string
M = matched string
PM = Percentage Match
Option 1. PMi = (1 - Lev_distance(Q, Mi)/Strlen(Q)) * 100
Option 2. PMi = (1 - Lev_distance(Q, Mi)/max(Strlen(Q), strlen(Mi))) * 100
Opcja 1 ma możliwość negatywnych procentowych w przypadku, gdy odległość jest większa niż długość ciągu wyszukiwania, gdzie ciąg mecz jest długa. Na przykład zapytanie "ABC" pasujące do "ABC Corp." spowoduje wynik ujemny.
Opcja 2 nie wydaje się zapewniać stałego udziału procentowego w całym zestawie Mi, ponieważ każde obliczenie prawdopodobnie używa innego mianownika, w związku z czym wynikowe wartości procentowe nie zostaną znormalizowane.
Jedyny inny sposób, jaki mogę wymyślić, to porzucić porównanie wartości lev_distance do obu długości łańcuchów, ale zamiast tego przedstawimy odległości względne najwyższych "N" jako odwrotną pozycję percentyla (100-percentile-rank).
Jakieś myśli? Czy istnieją lepsze podejścia? Muszę czegoś pomijać, ponieważ odległość Levenshteina jest prawdopodobnie najczęstszym algorytmem dla dopasowań rozmytych i to musi być bardzo powszechny problem.
Co o swoim 1st opcją ale kiedy wynik jest ujemny, po prostu zwraca 0? PS: Wysłałem problem również tutaj http://math.stackexchange.com/questions/1776860/convert-levenshtein-distance-to-percent –
Nie rozumiem, jaki jest problem z Option2, ponieważ zaimplementowałem dokładnie ta sama logika, którą opisujesz i wydaje się działać poprawnie. Czy możesz wyjaśnić to lepiej? – Roberto14