Соответствие двум спискам - PullRequest
       3

Соответствие двум спискам

3 голосов
/ 25 декабря 2010

У меня есть таблица, которая содержит введенные человеком данные наблюдений. Существует столбец, который должен соответствовать другому списку; введенное человеком значение должно совпадать с таким же, как в основном списке возможностей.

Проблема, однако, заключается в том, что данные человека сокращены, написаны с ошибками и т. Д. Существует ли механизм, который выполняет какой-либо поиск сходства, чтобы определить, какими должны быть введенные человеком данные?

Примеры

**Human Entered**         **Should Be**
Carbon-12                 Carbon(12)
South Korea               Republic of Korea
farenheit                 Fahrenheit

Единственная мысль, которая у меня действительно есть, - это разбить данные, введенные человеком, на 3-х символьные секции и посмотреть, содержатся ли они в списке «Должен быть». Было бы просто выбрать запись с самым высоким рейтингом. В качестве более позднего дополнения он может предоставить пользователю выбор из топ-10 или чего-то еще.

Я также не обязательно заинтересован в абсолютно идеальном решении, но если бы оно работало на 70% правильно, это сэкономило бы МНОГО времени при просмотре списка.

Ответы [ 3 ]

3 голосов
/ 25 декабря 2010

Один из вариантов - искать небольшое расстояние Левенштейна между двумя строками, а не требовать точного соответствия Это поможет найти совпадения, где есть небольшие правописания или опечатки.

Другой вариант - нормализовать строки перед их сравнением. Методы нормализации, которые имеют смысл, зависят от вашего конкретного приложения, но могут, например, включать:

  • Удаление всех знаков препинания.
  • Преобразование английского написания в американское.
  • Использование научного названия вещества вместо его общих названий.
  • и т.д.

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

2 голосов
/ 25 декабря 2010

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

private static int CalcLevensteinDistance(string left, string right)
{
    if (left == right)
        return 0;

    int[,] matrix = new int[left.Length + 1, right.Length + 1];

    for (int i = 0; i <= left.Length; i++)
        // delete
        matrix[i, 0] = i;

    for (int j = 0; j <= right.Length; j++)
        // insert
        matrix[0, j] = j;

    for (int i = 0; i < left.Length; i++)
    {
        for (int j = 0; j < right.Length; j++)
        {
            if (left[i] == right[j])
                matrix[i + 1, j + 1] = matrix[i, j];
            else
            {
                // deletion or insertion
                matrix[i + 1, j + 1] = System.Math.Min(matrix[i, j + 1] + 1, matrix[i + 1, j] + 1);

                // substitution
                matrix[i + 1, j + 1] = System.Math.Min(matrix[i + 1, j + 1], matrix[i, j] + 1);
            }
        }
    }

    return matrix[left.Length, right.Length];
}

Теперь вычислите сходство между двумя строками в%

public static double CalcSimilarity(string left, string right, bool ignoreCase)
{
    if (ignoreCase)
    {
        left = left.ToLower();
        right = right.ToLower();
    }

    double distance = CalcLevensteinDistance(left, right);
    if (distance == 0.0f)
        return 1.0f;

    double longestStringSize = System.Math.Max(left.Length, right.Length);
    double percent = distance / longestStringSize;

    return 1.0f - percent;
}
1 голос
/ 25 декабря 2010

Рассматривали ли вы использование (... или нескольких) выпадающих списков для обеспечения правильного ввода?На мой взгляд, это было бы лучшим подходом в большинстве случаев, учитывая удобство и простоту использования.Это также сделало бы обработку этого ввода намного легче.Когда вы используете свободный ввод текста, вы, вероятно, получите много разных способов написать что-то одно, и вы «никогда» не сможете найти способ написать что-нибудь сложное.

Пример: как вы написали;«углерод-12», «углерод-12», «углерод-12», «углерод-12», «углерод-12» и т. д. Только для этого возможности практически безграничны.Когда вы также рассматриваете такие вещи, как «Южная Корея» и «Республика Корея», где сопоставление не равно «1: 1» (как насчет Северной Кореи или просто «Кореи»?), Это становится еще сложнее.* Конечно, я ничего не знаю о вашем приложении и может быть совершенно не прав.Но обычно, когда вы ожидаете сложных значений в определенном формате, раскрывающийся список во многих случаях облегчит вашу работу в качестве разработчика и улучшит работу конечного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...