Нечеткое сопоставление с пороговым фильтром C # - PullRequest
8 голосов
/ 03 ноября 2010

Мне нужно реализовать что-то вроде этого:

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.
}

Вот заглушка функции, написанная на 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;
}

Но я понятия не имею, как реализовать логику в IsFuzzyMatchметод.Есть идеи?Возможно, есть готовое решение для этой цели?

Ответы [ 2 ]

9 голосов
/ 28 мая 2011

Мне нравится комбинация Дайса Коэффиниона, расстояния Левенштейна, самой длинной общей подпоследовательности, а иногда и двойного метафона.Первые три предоставят вам пороговое значение.Я предпочитаю комбинировать их каким-то образом.YMMV.

Я только что опубликовал пост в блоге, в котором есть реализация C # для каждого из них, названная Четыре функции для поиска нечетких совпадений строк в расширениях C # .

1 голос
/ 03 ноября 2010

Вам необходим Алгоритм расстояния Левенштейна , чтобы найти способ перехода от одной строки к другой с помощью операций вставки, удаления и изменения. Вы fuzzyMatchScoreThreshold - это расстояние Левенштейна, разделенное на длину строки простым способом.

...