2010-11-03 8 views
8

ho bisogno di attuare un qualche tipo di questo:fuzzy matching con filtro soglia C#

string textToSearch = "Extreme Golf: The Showdown"; 
string textToSearchFor = "Golf Extreme Showdown"; 
int fuzzyMatchScoreThreshold = 80; // One a 0 to 100 scale 
bool searchSuccessful = IsFuzzyMatch(textToSearch, textToSearchFor, fuzzyMatchScoreThreshold); 
if (searchSuccessful == true) 
{ 
    -- we have a match. 
} 

Ecco la funzione stub scritto in C#:

public bool IsFuzzyMatch (string textToSearch, string textToSearchFor, int fuzzyMatchScoreThreshold) 
{ 
    bool isMatch = false; 
    // do fuzzy logic here and set isMatch to true if successful match. 
    return isMatch; 
} 

Ma non ho idea di come implementare la logica nel metodo IsFuzzyMatch. Qualche idea? Forse c'è una soluzione pronta per questo scopo?

+1

È possibile calcolare la [distanza di Levenshtein] (http://en.wikipedia.org/wiki/Levenshtein_distance), utilizzando le parole come simboli anziché caratteri, dove le parole sono considerate uguali in base alla loro distanza di Levenshtein. Ci sono [molti argomenti SO] (http://stackoverflow.com/search?q= [c% 23] + Levenshtein + distanza) sulla distanza di Levenshtein. – dtb

+0

Vedere http://stackoverflow.com/questions/451884/similar-string-algorithm/451910#451910 –

risposta

1

È necessario Levenshtein Distance Algorithm per trovare come passare da una stringa all'altra mediante operazioni di inserimento, eliminazione e modifica. You fuzzyMatchScoreThreshold è una distanza Levenshtein divisa in base alla lunghezza della stringa in modo semplice.

9

Mi piace una combinazione di Dice Coeffiecient, Levenshtein Distance, Longest Common Subsequence e talvolta Double Metaphone. I primi tre ti forniranno un valore di soglia. Preferisco unirli in qualche modo. YMMV.

Ho appena pubblicato un post sul blog che ha un'implementazione C# per ciascuno di questi chiamati Four Functions for Finding Fuzzy String Matches in C# Extensions.