Алгоритм соответствия данных

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

Следующие поля передаются в:

  • Имя:
  • Name2
  • Улица
  • Город
  • ZipCode
  • BankAccountNumber
  • BankName
  • BankCode
  • Электронная почта
  • Телефон
  • Факс
  • Сеть

Данные могут иметь высокое качество, и большая информация доступна, но часто данные являются дрянными, и просто имя и адрес доступно и могло бы иметь написания.

Я реализую проект в .NET. То, что я в настоящее время делаю, является чем-то как следующее:

public bool IsMatch(Customer customer)
{
    // CanIdentify just checks if the info is provided and has a specific length (e.g. > 1)
    if (CanIdentifyByStreet() && CanIdentifyByBankAccountNumber())
    {
        // some parsing of strings done before (substring, etc.)
        if(Street == customer.Street && AccountNumber == customer.BankAccountNumber) return true;
    }
    if (CanIdentifyByStreet() && CanIdentifyByZipCode() &&CanIdentifyByName())
    {
        ...
    }
}

Я не очень доволен подходом выше. Это вызвано тем, что я должен был бы записать, если операторы для всех разумных случаев (комбинации), таким образом, я не упускаю шанса соответствия объекту.

Таким образом, я думал, возможно, что я мог создать некоторый счет соответствия. Таким образом для каждого критерии соответствовали, счет был бы добавлен. Как:

public bool IsMatch(Customer customer)
{
    int matchingScore = 0;
    if (CanIdentifyByStreet())
    {
        if(....)
            matchingScore += 10;
    }
    if (CanIdentifyByName())
    {
        if(....)
            matchingScore += 10;
    }
    if (CanIdentifyBankAccountNumber())
    {
        if(....)
            matchingScore += 10;
    }

    if(matchingScore > iDontKnow)
        return true;
}

Это позволило бы мне брать в соображении все данные соответствия, и в зависимости от некоторого веса я увеличу счет соответствия. Если счет достаточно высок, это - соответствие.

Знайте, что мой вопрос: Есть ли какие-либо лучшие практики там для таких вещей, как соответствие шаблонам алгоритма и т.д.? Большое спасибо!

5
задан rodrigoap 12 March 2010 в 19:49
поделиться

2 ответа

Для вдохновения взгляните на алгоритм расстояния Левенштейна . Это даст вам разумный механизм для взвешивания ваших сравнений.

Я бы также добавил, что по моему опыту вы никогда не сможете сопоставить два произвольных фрагмента данных в одном и том же объекте с абсолютной уверенностью. Вам необходимо представить правдоподобные совпадения пользователю, который затем сможет точно проверить, является ли Джон Смит на улице 1920 г. Э. Пайн тем же человеком, что и Джон Смит на улице Ист-Пайн-роуд, 192, или нет.

2
ответ дан 15 December 2019 в 00:57
поделиться

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

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

Я бы, вероятно, пошел дальше и вытащил сопоставление в перечисление, а затем получил бы списки допустимых совпадений. Примерно так: interface Match { логические совпадения (клиент c1, клиент c2); }

class BankAccountMatch implements Match
{
    public boolean matches(Customer c1, Customer c2)
    {
        return c1.getBankAccountNumber() == c2.getBankAccountNumber();
    }
}

static Match BANK_ACCOUNT_MATCH = new BankAccountMatch();

Match[][] validMatches = new Match[] [] {
        {BANK_ACCOUNT_MATCH, NAME_MATCH},
        {NAME_MATCH, ADDRESS_MATCH, FAX_MATCH}, ...
};

А затем код, выполняющий проверку просто перебирает массив validMatches и проверяет их, подходит ли он. Я мог бы даже вытащить списки допустимых совпадений в файл конфигурации. Однако все зависит от уровня надежности, который необходим вашей системе.

2
ответ дан 15 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

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