Сравнить 2 строки

У меня есть следующие 2 строки:

String A: Manchester United
String B: Manchester Utd

Обе строки означают одно и то же, но содержат разные значения.

Как я могу сравнить эти строки, чтобы иметь "совпадающую оценку", как, в случае, если первое слово похоже, "Манчестер", а вторые слова содержат похожие буквы, но не в нужном месте.

Есть ли какой-нибудь простой алгоритм, который возвращает "счет совпадения" после того, как я предоставил 2 строки?

8 голосов | спросил m0fo 8 Maypm12 2012, 13:20:59

3 ответа


0

Вы можете рассчитать расстояние Левенштейна между двумя строками и, если оно меньше некоторого значения (которое вы должны определить Вы можете считать их довольно близкими.

ответил Darin Dimitrov 8 Maypm12 2012, 13:25:18
0

То, что вы ищете - это мера сходства строк. Есть несколько способов сделать это:

  1. Изменить расстояния между двумя строками (как в ответе № 1)
  2. Преобразование строк в наборы символов (обычно в биграммы или слова), а затем вычисление коэффициента Брюса или коэффициента кости по двум наборам.
  3. Проецирование строк в векторы терминов (в словах или биграммах) и вычисление косинусного расстояния между двумя векторами.

Обычно я считаю, что вариант №2 проще всего реализовать, и если ваши строки являются фразами, вы можете просто разбить их на границы слов. Во всех вышеперечисленных случаях вы можете сначала удалить стоп-слова (общие слова, такие как и, а, и т. Д.) Перед токенизацией. Обновление: ссылки

Коэффициент костей

Схожесть косинусов

Реализация механизма наивного сходства в C # * Предупреждение : бесстыдная Самореклама

ответил Sachin 8 Maypm12 2012, 13:51:28
0

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

    public static double CompareStrings(string strA, string strB)
    {
        List<string> setA = new List<string>();
        List<string> setB = new List<string>();

        for (int i = 0; i < strA.Length - 1; ++i)
            setA.Add(strA.Substring(i, 2));

        for (int i = 0; i < strB.Length - 1; ++i)
            setB.Add(strB.Substring(i, 2));

        var intersection = setA.Intersect(setB, StringComparer.InvariantCultureIgnoreCase);

        return (2.0 * intersection.Count()) / (setA.Count + setB.Count);
    }

Вызовите метод следующим образом:

CompareStrings("Manchester United", "Manchester Utd");

Выход: 0.75862068965517238

ответил Jack Fairfield 11 PM000000100000000931 2017, 22:04:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132