Я в настоящее время работаю над проектом, где я данные, соответствующие алгоритму, должен быть реализован. Внешняя система передает во всех данных, которые она знает о клиенте, и система, которую я разрабатываю, должна возвратиться, клиент соответствовал. Таким образом, внешняя система затем знает, что корректный идентификатор клиента плюс она получает дополнительные данные или может обновить его собственные данные определенного клиента.
Следующие поля передаются в:
Данные могут иметь высокое качество, и большая информация доступна, но часто данные являются дрянными, и просто имя и адрес доступно и могло бы иметь написания.
Я реализую проект в .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;
}
Это позволило бы мне брать в соображении все данные соответствия, и в зависимости от некоторого веса я увеличу счет соответствия. Если счет достаточно высок, это - соответствие.
Знайте, что мой вопрос: Есть ли какие-либо лучшие практики там для таких вещей, как соответствие шаблонам алгоритма и т.д.? Большое спасибо!
Для вдохновения взгляните на алгоритм расстояния Левенштейна . Это даст вам разумный механизм для взвешивания ваших сравнений.
Я бы также добавил, что по моему опыту вы никогда не сможете сопоставить два произвольных фрагмента данных в одном и том же объекте с абсолютной уверенностью. Вам необходимо представить правдоподобные совпадения пользователю, который затем сможет точно проверить, является ли Джон Смит на улице 1920 г. Э. Пайн тем же человеком, что и Джон Смит на улице Ист-Пайн-роуд, 192, или нет.
По моему опыту с подобными вещами, на самом деле именно бизнесмены определили правила того, что можно считать соответствием, а не техническим решением. Для меня это имело смысл, поскольку бизнес в конечном итоге берет на себя риск. Кроме того, то, что составляет совпадение, может быть подвержено изменениям, например, если они используют систему и обнаруживают, что слишком много людей исключаются.
Я думаю, что ваш первый подход имеет больше смысла в том смысле, что если вы можете сопоставить кого-то по имени и номеру банковского счета, то вы почти уверены, что это они. Однако, если имя и информация о банке не совпадают, но есть адрес, телефон и все, что совпадает (например, супруг), система подсчета очков может неправильно сопоставить людей. Я понимаю, что это много кода, но пока вы извлекаете фактический совпадающий код (метод 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 и проверяет их, подходит ли он. Я мог бы даже вытащить списки допустимых совпадений в файл конфигурации. Однако все зависит от уровня надежности, который необходим вашей системе.