Нечеткое сопоставление структурированных данных

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

Записи имеют ширину около 12 000 байт, а общее количество записей составляет около 150 000. В схеме таблицы 110 столбцов, и 95 % поисковых запросов будут в верхних 5 % наиболее часто запрашиваемых столбцов.

Данные представляют собой такие вещи, как имена, адреса, номера телефонов и другие отраслевые номера. Как в корпусе, так и в контрольной записи он вводится вручную и полуструктурирован в рамках отдельного поля. Сначала вы можете покраснеть и сказать: «взвешивайте столбцы вручную и сопоставляйте в них токены слов», но это не так просто. Я тоже так думал: если я получу номер телефона, я подумал, что это будет означать идеальное совпадение. Проблема в том, что в форме нет ни одного поля, частота токена которого не меняется на порядки. Номер телефона может встречаться в корпусе 100 раз или 1 раз в корпусе. То же самое касается любой другой области. Это делает взвешивание на уровне поля нецелесообразным. Мне нужен более детальный подход, чтобы получить достойное соответствие.

Мой первоначальный план состоял в том, чтобы создать хэш хэшей, верхний уровень — это имя поля. Затем я выбирал всю информацию из корпуса для заданного поля, пытался очистить данные, содержащиеся в нем, и токенизировать продезинфицированные данные, хэшируя токены на втором уровне, с токенами в качестве ключей и частотой в качестве значения.

Я бы использовал подсчет частоты в качестве веса: чем выше частота токена в эталонном корпусе, тем меньший вес я придаю этому токену, если он найден в тестовой записи.

Мой первый вопрос к статистикам в зале: как бы я использовал частоту в качестве веса? Существует ли точная математическая связь между n, количеством записей, f(t), частотой появления токена t в корпусе, вероятностью o того, что запись является оригиналом, а не дубликатом, и вероятностью p того, что тестовая запись действительно является записью x с учетом теста, а x содержит одно и то же t в одном и том же поле? Как насчет отношения для совпадения нескольких токенов в нескольких полях?

Поскольку я искренне сомневаюсь, что это так, есть ли что-нибудь, что меня приблизит, но лучше, чем совершенно произвольный взлом, полный магических факторов?

За исключением этого, у кого-нибудь есть способ сделать это?

Я особенно заинтересован в других предложениях, которые не связаны с поддержкой другой таблицы в базе данных, таких как таблица поиска частоты маркеров.


person masonk    schedule 12.03.2010    source источник


Ответы (1)


Вероятно, вы можете получить некоторые идеи из этого другого, но похожего вопроса SO: корреляция.

Более конкретно по рассматриваемой проблеме, вот несколько мыслей и идей:

Во-первых, признавая очень неравномерное использование (только от 6 до 10 атрибутов покрывают 95% использования), вы можете/должны применять асимметричные усилия к атрибутам, т.е. инвестировать больше, как с точки зрения времени программирования, так и с точки зрения времени выполнения. Выделение ЦП для работы с этими несколькими атрибутами, чем для 100 с лишним дополнительных атрибутов.

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

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

  • Нормализуйте данные
    Если вам не разрешено изменять исходные значения полей, возможно, скопируйте соответствующие столбцы в столбец «norm_xxx», где xxx — исходное имя.
    Что и как нормализовать, может различаться в зависимости от каждого атрибута. ; для «свободного текста», такого как данные, убедитесь, что нет начальных и конечных пробелов, только один пробел между словами, никаких табуляций и непечатаемых символов. Используйте либо все прописные, либо все строчные буквы (даже несмотря на то, что исходный текст / текст для отображения может содержать смесь, ваша обработка будет выполняться быстрее, если вы сможете принять однородный регистр). В частности, для адресов и / или названий компаний вы можете преобразовать общие термины в стандартную форму (ST для УЛИЦЫ, ST и ST и т. д.) (Обязательно сохраните этот список, поскольку он также будет применяться к критериям поиска пользователя. ). Часть нормализации также может состоять в полном исключении некоторых шумовых слов (например, CO, INC, GMBH в конце названий компаний).
  • Создайте несколько вычисляемых столбцов
    Например, столбцы с текстом в обратном порядке для атрибутов, которые можно искать с подстановочным знаком в конце.
  • Рассмотрите возможность использования преобразования, подобного Soundex, для некоторых атрибутов.
  • Полнотекстовый индекс, индивидуально, все текстовые столбцы
  • Создайте простые (SQL) индексы для всех 6–10 наиболее часто используемых столбцов.

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

  • Нормализуйте критерии поиска, которые оправдывают это
  • Запустите несколько поисковых запросов...
    Это немного сложно; есть несколько, частично противоречащих друг другу, целей для выполнения этих поисков. Мы хотим значительно сократить количество «потенциальных совпадений»: фактически нецелесообразно проводить полное индивидуальное сравнение всех 150 000 записей с заданными пользователем критериями; например, некоторая логика сопоставления может подразумевать вычисление расстояния редактирования между полем данной записи базы данных и критерием поиска. Мы также хотим убедиться, что мы не исключаем записи из списка «потенциальных совпадений» из-за опечатки, скажем, в названии компании... Наконец, мы хотим предоставить список потенциальных совпадений в ранжированном виде.
    Способ выполнять эти поиски следует некоторым предопределенным эвристикам (я обнаружил, что шаблон проектирования стратегии хорошо работает для этого, обеспечивая гибкость в способе запуска поиска в зависимости от введенных пользователем данных). В двух словах, мы ищем наиболее избирательные слова в наиболее избирательных/релевантных атрибутах, и, основываясь на количестве найденных «попаданий», мы используем «ИЛИ» (объединение) или «И» с другими результатами поиска, пока не получим несколько сто запись.
  • Вычислите значение сходства между каждым атрибутом записей «потенциальные совпадения» и соответствующими критериями поиска. Возможно, применить коэффициент к этому значению (позволяющий придать больший вес, чтобы сказать, что название компании [частично] соответствует названию города)
  • Подсчитайте общее значение сходства для полной записи (по сравнению с полными критериями поиска).
  • Показывать записи, превышающие определенный порог значения сходства, конечному пользователю для просмотра.

    И, наконец, частично автоматизированный процесс, вы можете изменить некоторые параметры на основе обратной связи, предоставленной конечным пользователем. (это очень сложно сделать, я оставлю это для другого поста ;-))

person mjv    schedule 12.03.2010
comment
Спасибо за ваши мысли и ссылки на дополнительные исследования по этому вопросу. Я мог бы в конечном итоге вычислить расстояние редактирования или нет, я не уверен. Но я думаю, что буду оценивать совпадения токенов как 1/f(t) * вес поля и посмотрю, насколько это приблизит меня, прежде чем вычислять расстояние редактирования. - person masonk; 12.03.2010