У меня есть довольно небольшой корпус структурированных записей, хранящихся в базе данных. Учитывая крошечную часть информации, содержащейся в одной записи, представленной через веб-форму (структурированную так же, как схема таблицы) (назовем ее тестовой записью), мне нужно быстро составить список записи, наиболее вероятные совпадения с тестовой записью, а также обеспечивают доверительную оценку того, насколько точно условия поиска соответствуют записи. Основная цель этого поиска — обнаружить, пытается ли кто-то ввести запись, дублирующую запись в корпусе. Существует разумная вероятность того, что тестовая запись будет подделкой, и разумная вероятность того, что тестовая запись не будет подделкой.
Записи имеют ширину около 12 000 байт, а общее количество записей составляет около 150 000. В схеме таблицы 110 столбцов, и 95 % поисковых запросов будут в верхних 5 % наиболее часто запрашиваемых столбцов.
Данные представляют собой такие вещи, как имена, адреса, номера телефонов и другие отраслевые номера. Как в корпусе, так и в контрольной записи он вводится вручную и полуструктурирован в рамках отдельного поля. Сначала вы можете покраснеть и сказать: «взвешивайте столбцы вручную и сопоставляйте в них токены слов», но это не так просто. Я тоже так думал: если я получу номер телефона, я подумал, что это будет означать идеальное совпадение. Проблема в том, что в форме нет ни одного поля, частота токена которого не меняется на порядки. Номер телефона может встречаться в корпусе 100 раз или 1 раз в корпусе. То же самое касается любой другой области. Это делает взвешивание на уровне поля нецелесообразным. Мне нужен более детальный подход, чтобы получить достойное соответствие.
Мой первоначальный план состоял в том, чтобы создать хэш хэшей, верхний уровень — это имя поля. Затем я выбирал всю информацию из корпуса для заданного поля, пытался очистить данные, содержащиеся в нем, и токенизировать продезинфицированные данные, хэшируя токены на втором уровне, с токенами в качестве ключей и частотой в качестве значения.
Я бы использовал подсчет частоты в качестве веса: чем выше частота токена в эталонном корпусе, тем меньший вес я придаю этому токену, если он найден в тестовой записи.
Мой первый вопрос к статистикам в зале: как бы я использовал частоту в качестве веса? Существует ли точная математическая связь между n, количеством записей, f(t), частотой появления токена t в корпусе, вероятностью o того, что запись является оригиналом, а не дубликатом, и вероятностью p того, что тестовая запись действительно является записью x с учетом теста, а x содержит одно и то же t в одном и том же поле? Как насчет отношения для совпадения нескольких токенов в нескольких полях?
Поскольку я искренне сомневаюсь, что это так, есть ли что-нибудь, что меня приблизит, но лучше, чем совершенно произвольный взлом, полный магических факторов?
За исключением этого, у кого-нибудь есть способ сделать это?
Я особенно заинтересован в других предложениях, которые не связаны с поддержкой другой таблицы в базе данных, таких как таблица поиска частоты маркеров.