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