Парсинг веб-страниц даёт вам необработанные записи, но необработанные записи редко бывают чистыми. Возьмите одну и ту же компанию из трёх справочников, один и тот же товар из четырёх ритейлеров или одного и того же человека из двух баз данных, и вы получите строки, описывающие одну реальную сущность в разных форматах: «Acme Inc.» здесь, «ACME, Incorporated» там, номер телефона с тире в одном источнике и с пробелами в другом. Пока вы не решите, какие из этих строк относятся к одной сущности, ваш набор данных, куча почти-дубликатов, а не пригодное для использования целое.
Сопоставление данных, это процесс, который превращает эти разрозненные, непоследовательные записи в единое согласованное представление. Это руководство объясняет, почему спарсенные данные в первую очередь нуждаются в сопоставлении, затем описывает основные концепции: нормализацию, точное и нечёткое сопоставление, метрики сходства за нечётким сравнением, блокировку для сохранения управляемости работы, оценку по порогу и шаги дедупликации и разрешения сущностей, которые производят одну чистую запись на реальную сущность. К концу вы должны понять, как собирается конвейер сопоставления и как его настраивать, не утопая в ложных совпадениях.
Что такое сопоставление данных?
Сопоставление данных, это задача сравнения записей и принятия решения о том, какие из них относятся к одной базовой сущности, даже когда записи не совпадают поле в поле. Оно отвечает на обманчиво простой вопрос: являются ли эти две строки одной и той же вещью? Когда ответ «да» по многим источникам, вы можете объединить их в одну авторитетную запись; когда записи внутри одного источника оказываются одинаковыми, вы удаляете дубликат.
Причина, по которой это сложно, заключается в том, что реальные данные грязны. Данные, полученные парсингом, особенно, потому что они приходят со страниц, созданных разными людьми для разной аудитории без общей схемы. Один и тот же адрес может быть сокращён одним способом на листинговом сайте и написан полностью на собственной странице компании. Имена содержат опечатки, акценты, отчества и переупорядочивание. Даты, валюты и единицы измерения различаются. Сопоставление существует, чтобы видеть сквозь всё это поверхностное разнообразие до сущности под ним, и хорошее сопоставление, это то, что отделяет набор данных, который можно анализировать, от того, который тихо двойной подсчёт всего.
Почему спарсенным записям нужно сопоставление
Несколько паттернов приводят почти к каждой задаче сопоставления. Первый, сбор из нескольких источников: когда вы парсите один тип сущности с нескольких сайтов, каждый источник описывает её в своём формате, поэтому нужно сопоставление для их выравнивания. Второй, дублирование внутри источника: один сайт может перечислять один и тот же продукт под двумя URL или еженедельно повторно публиковать объявление о вакансии, оставляя дубликаты, которые нужно схлопнуть. Третий, обогащение: у вас есть частичная запись и вы хотите добавить к ней атрибуты из другого набора данных, что работает только если вы можете уверенно связать их. Во всех трёх случаях базовая проблема одна: много шумных записей, одна реальная сущность и решение о том, какая есть какая.
Основные концепции сопоставления
Прежде чем рассматривать конвейер, полезно зафиксировать словарь. Сопоставление строится из небольшого набора идей, которые по-разному комбинируются: вы очищаете данные, чтобы сравнения были справедливыми, решаете, насколько строгим должно быть сравнение, измеряете, насколько похожи два значения, когда они не совпадают точно, и устанавливаете правило того, что считается совпадением. Разделы ниже рассматривают каждое по очереди.
Нормализация и стандартизация
Сопоставление начинается с очистки, потому что сравнение сырых спарсенных полей почти всегда несправедливо. Нормализация (иногда называемая стандартизацией) переписывает каждое значение в последовательную каноническую форму, чтобы поверхностные различия перестали маскировать реальные совпадения. На практике это означает перевод текста в нижний регистр, обрезку пробелов, удаление знаков препинания, расширение или сокращение аббревиатур («ул.» в «улица»), разбор имён и адресов на компоненты и преобразование дат, валют и единиц в один согласованный формат. Две записи, которые выглядели по-разному, «Acme Inc.» и «ACME, Incorporated», могут свестись к одной нормализованной строке после применения последовательных правил.
Этот шаг окупается больше, чем любой другой. Его пропуск вынуждает вашу логику сопоставления поглощать каждый форматный курьёз, что и медленнее, и менее точно. Инвестирование в нормализацию в первую очередь, часть более широкой дисциплины подготовки спарсенного вывода для использования нижестоящими, подробно описанной в структурировании и очистке данных, спарсенных с веба, для AI и ML. Чем чище входные данные, тем проще и надёжнее всё, что следует.
Точное сопоставление
Точное сопоставление, это простейшая техника: две записи совпадают, только если выбранные поля идентичны. Оно прекрасно работает, когда записи имеют надёжный уникальный идентификатор, SKU товара, ISBN, верифицированный email-адрес или государственный ID, потому что эти ключи созданы однозначными. Сравните ключи, и равный означает ту же сущность.
Ограничение в том, что точное сопоставление хрупко перед вариациями. Одна опечатка, лишний пробел, другая капитализация или отсутствующее отчество заставляют две записи, описывающие одно и то же, не совпасть. Оно хорошо работает на хорошо структурированных данных с чистыми ключами и плохо на грязных текстовых полях, которые доминируют в спарсенных данных. Вот почему большинство реальных конвейеров используют точное сопоставление там, где есть надёжный ключ, и прибегают к нечёткому сопоставлению везде остальном.
Нечёткое сопоставление
Нечёткое сопоставление обрабатывает несовершенные данные, на которых точное сопоставление задыхается. Вместо требования идентичных значений оно измеряет, насколько похожи два значения, и производит оценку сходства, часто выражаемую в процентах, а не «да» или «нет». Эта оценка позволяет принимать градуированные решения: рассматривать 95% сходство как уверенное совпадение, 60% как возможное, заслуживающее проверки, и 20% как несовпадение. Допуск, это суть, потому что он позволяет опечаткам, аббревиатурам, переупорядоченным словам и частичным значениям всё же разрешаться к одной сущности.
Нечёткое сопоставление, это место, где живёт большинство ценности для спарсенных данных, поскольку имена, местоположения, названия продуктов и описания, это именно те типы полей, которые дрейфуют между источниками. Компромисс заключается в том, что теперь у вас есть регулятор для настройки. Установите планку слишком высоко, и вы упустите реальные совпадения; установите слишком низко, и вы объедините записи, которые должны оставаться отдельными. Метрики в следующем разделе, это то, что производит оценки сходства, от которых зависит нечёткое сопоставление.
Метрики сходства
Метрика сходства, это формула, которая превращает два значения в число, описывающее их схожесть. Разные метрики подходят для разных типов полей, и хороший сопоставитель выбирает правильную для каждого поля, а не использует единую меру везде.
- Расстояние Левенштейна (редактирования) подсчитывает минимальное количество однобуквенных правок (вставок, удалений, замен), необходимых для преобразования одной строки в другую. «Crawlbase» в «Crawbase», одно удаление, поэтому расстояние равно 1. Оно превосходно для отлова опечаток и небольших орфографических вариаций в коротких полях, таких как имена и коды товаров.
- Сходство Жаккара сравнивает два значения как множества, деля размер их пересечения на размер их объединения. Применённое к словам или символьным n-граммам строки, оно измеряет перекрытие независимо от порядка, что делает его сильным для сравнения многословных полей, где одни и те же токены появляются в разной последовательности.
- Косинусное сходство представляет каждое значение как вектор (счётчиков слов, n-граммов или эмбеддингов) и измеряет угол между двумя векторами. Оно оценивает, насколько два куска текста указывают в одном направлении независимо от длины, что подходит для более длинного текста, такого как описания продуктов или адреса.
Если однострочная иллюстрация помогает, идея расстояния редактирования, это просто подсчёт небольших изменений между двумя строками:
# "Crawlbase" -> "Crawbase": delete one 'l' from rapidfuzz import distance d = distance.Levenshtein.distance("Crawlbase", "Crawbase") print(d) # 1
Ни одна из этих метрик не является универсально лучшей. Навык, в сопоставлении метрики с полем: расстояние редактирования для коротких строк, склонных к опечаткам, перекрытие множеств для текста с переупорядоченными токенами, векторное сходство для более длинного свободного текста.
Блокировка и индексирование
Сравнение каждой записи со всеми остальными не масштабируется. Два набора данных по 100 000 строк каждый подразумевают десять миллиардов сравнений, что безнадёжно. Блокировка (также называемая индексированием), это техника, которая делает сопоставление управляемым: вместо сравнения всех пар вы группируете записи в блоки, имеющие какой-то дешёвый в вычислении ключ, и сравниваете только записи внутри одного блока.
Ключ блокировки, это грубый сигнал, который реальные совпадения, вероятно, разделяют, например, первые три символа почтового индекса, первое слово названия компании или фонетическое кодирование имени. Записи, не совпадающие по ключу блокировки, считаются несовпадениями и никогда не сравниваются, что сокращает количество сравнений на порядки. Искусство, выбрать достаточно широкий ключ, чтобы истинные совпадения попадали в один блок, но достаточно узкий, чтобы блоки оставались маленькими. Многие конвейеры используют несколько ключей блокировки в проходах, чтобы пара, упущенная одним ключом, всё равно имела шанс быть поймана другим.
Как работает процесс сопоставления
Имея концепции на руках, конвейер сопоставления, это последовательность этапов, каждый из которых сужает проблему. Данные поступают, очищаются, группируются для ограничения сравнений, сравниваются и оцениваются, и наконец разрешаются в дедуплицированные сущности. Порядок важен: каждый этап предполагает, что предыдущий выполнил свою работу.
Шаг 1: подготовка и нормализация данных
Начните с профилирования каждого источника для понимания его полей, форматов и особенностей, затем примените правила нормализации, описанные выше, чтобы каждая запись говорила на одном диалекте. Также помогает назначить или вывести стабильный уникальный идентификатор для каждой записи, будь то существующий ключ, сгенерированный или составной, построенный из нескольких полей, чтобы вы могли отслеживать записи через конвейер и ссылаться на совпадения позже. Согласованные схемы и соглашения об именовании между источниками, часть этого шага; чем более унифицированы входные данные, тем лучше ведёт себя всё нижестоящее.
Шаг 2: блокировка для создания пар-кандидатов
Запустите стратегию блокировки, чтобы превратить полный набор данных в гораздо меньший набор пар-кандидатов, пар записей, которые предположительно являются одной сущностью и, следовательно, заслуживают подробного сравнения. Это шаг, который делает остальную часть конвейера доступной, поэтому стоит настроить: проверьте, что ваши ключи блокировки не настолько узки, что очевидные совпадения разделяются между блоками, и рассмотрите несколько проходов для поимки пар, которые один ключ упустил бы.
Шаг 3: сравнение и оценка каждой пары
Для каждой пары-кандидата сравните соответствующие поля с использованием метрик сходства, подходящих для каждого, затем объедините поле-специфические оценки в единую итоговую оценку для пары. Объединение может быть простым взвешенным средним (придавая больший вес верифицированному email, чем текстовому описанию, например) или обученной моделью. Результат этого шага, оценка на пару-кандидат, выражающая вашу уверенность в том, что две записи являются одной сущностью.
Шаг 4: применение порогов для принятия решений о совпадениях
Оценка сама по себе ничего не решает, пока вы не установите порог: выше него пара, совпадение; ниже, несовпадение. Многие команды используют два порога с средней полосой, автоматически принимая высокие оценки, автоматически отклоняя низкие и направляя неопределённую середину на ручную проверку. Где вы устанавливаете эти границы, центральное решение по настройке в сопоставлении, и это прямой компромисс между двумя способами ошибиться, рассмотренными далее.
Шаг 5: дедупликация и разрешение сущностей
Наконец, действуйте на основе решений. Внутри одного источника совпавшие записи, это дубликаты, схлопываемые в одну. Между источниками совпавшие записи связываются и объединяются в одну каноническую сущность, шаг, часто называемый разрешением сущностей, объединяющий лучшие атрибуты из каждой в одну более богатую запись. Когда более двух записей транзитивно совпадают (A совпадает с B, B совпадает с C), они группируются в один кластер, представляющий сущность. Результат, то, чего вы добивались с самого начала: одна чистая, дедуплицированная запись на каждую реальную вещь, готовая для анализа.
Сопоставление значительно проще, когда каждый источник приходит в последовательной форме, и эта последовательность начинается при извлечении. Crawlbase Crawling API автоматически разбирает поддерживаемые страницы в чистые структурированные поля, так что названия товаров, цены и атрибуты возвращаются в предсказуемой схеме, а не в виде сырого HTML для обработки. Начало с унифицированного структурированного вывода означает меньше работы по нормализации и меньше ложных несовпадений ещё до запуска вашего конвейера сопоставления.
Обработка ложноположительных и ложноотрицательных результатов
Каждая система сопоставления делает два вида ошибок, и настройка, это по существу их балансировка. Ложноположительный результат, неверное слияние: две разные сущности, оцениваемые как одинаковые и объединённые, что загрязняет запись данными другой сущности. Ложноотрицательный результат, упущенное совпадение: две записи, являющиеся одной сущностью, остаются отдельными, что оставляет дубликаты в наборе данных. Понижение порога улавливает больше истинных совпадений, но приглашает больше ложноположительных; повышение избегает плохих слияний, но пропускает больше истинных совпадений. Нет настройки, устраняющей оба, только баланс, подходящий для вашего случая использования.
Какую ошибку предпочитать, зависит от её стоимости. Для дедупликации маркетингового списка случайное неверное слияние дёшево, а упущенные дубликаты, большее неудобство, поэтому вы можете склоняться к разрешительному режиму. Для слияния финансовых или медицинских записей неверное слияние серьёзно, поэтому вы склоняетесь к консервативному и проверяете неопределённую полосу вручную. Практические инструменты, двухпороговая полоса проверки, описанная ранее, придание большего веса надёжным полям в оценке, и валидация выборки совпадений (вручную или с помощью модели) для измерения реальных частот ошибок и корректировки. Сопоставление итеративно: вы настраиваете пороги и веса, измеряете и уточняете.
Инструменты и подходы
Вам не нужно строить всё это с нуля. Библиотека с открытым исходным кодом Dedupe для Python обрабатывает нечёткое сопоставление, дедупликацию и разрешение сущностей, обучая правила сопоставления на небольшом наборе размеченных примеров. Для извлечения сущностей и связей из свободного текста перед сопоставлением распространёнными вариантами являются библиотеки обработки естественного языка, такие как spaCy и NLTK. Тяжёлые или регулируемые рабочие нагрузки иногда оправдывают коммерческие платформы управления основными данными, которые объединяют сопоставление, очереди проверки и управление.
При выборе подхода взвесьте несколько факторов: объём и сложность ваших данных, необходимая точность сопоставления, ваш бюджет, внутренняя экспертиза для запуска и настройки системы, чувствительность данных, и насколько хорошо инструмент интегрируется с вашим существующим стеком и масштабируется по мере роста. Сопоставление также редко живёт в одиночку; это один этап в более широком потоке от извлечения к хранению и анализу. Для окружающей архитектуры смотрите руководство по архитектуре конвейера данных, а поскольку совпавший вывод часто потребляется моделями, практики в парсинге для машинного обучения являются полезным дополнением. Формат сериализации, в который вы согласовываете данные, тоже важен; JSON против CSV охватывает компромиссы между вложенным и плоским выводом для объединённых записей.
Ключевые выводы
- Сопоставление согласовывает множество записей в одну сущность. Спарсенные данные из нескольких источников описывают одни и те же вещи в разных форматах, и сопоставление решает, какие строки относятся к одной реальной сущности.
- Нормализация, прежде всего. Перевод в нижний регистр, обрезка, расширение аббревиатур и стандартизация дат и единиц делают сравнения справедливыми и окупаются больше, чем любой другой шаг.
- Точное, для ключей, нечёткое, для всего остального. Используйте точное сопоставление, где есть надёжный уникальный идентификатор, и нечёткое сопоставление с метриками сходства (Левенштейн, Жаккар, косинус) для грязных текстовых полей.
- Блокировка делает сопоставление масштабируемым. Группировка записей по дешёвому общему ключу и сравнение только внутри блоков сокращает невозможное сравнение всех пар до выполнимого.
- Пороги балансируют две ошибки. Где вы устанавливаете границу совпадения, компромисс между ложноположительными (неверные слияния) и ложноотрицательными (упущенные совпадения); настройте его по стоимости каждого в вашем случае использования.
Часто задаваемые вопросы
Что такое сопоставление данных в парсинге веб-страниц?
Сопоставление данных, это процесс сравнения спарсенных записей и принятия решения о том, какие из них относятся к одной реальной сущности, даже когда они не совпадают поле в поле. Оно позволяет объединять записи, описывающие одно и то же, из разных источников и удалять дубликаты внутри источника, превращая кучу непоследовательных строк в один согласованный набор данных для анализа.
В чём разница между точным и нечётким сопоставлением?
Точное сопоставление требует, чтобы сравниваемые поля были идентичны, что хорошо работает, когда записи имеют надёжный уникальный ключ, как SKU или верифицированный email, но ломается на опечатках и форматных различиях. Нечёткое сопоставление измеряет, насколько похожи два значения, и возвращает градуированную оценку сходства вместо «да» или «нет», поэтому оно допускает опечатки, аббревиатуры и вариации, распространённые в спарсенных текстовых полях.
Какую метрику сходства следует использовать?
Зависит от поля. Расстояние Левенштейна (редактирования) хорошо для коротких строк, склонных к опечаткам, таких как имена и коды товаров. Сходство Жаккара сравнивает значения как множества токенов и обрабатывает переупорядоченный многословный текст. Косинусное сходство оценивает более длинный текст, например описания или адреса, рассматривая каждое значение как вектор. Хорошие сопоставители выбирают метрику для каждого поля, а не используют одну везде.
Что такое блокировка и почему она важна?
Блокировка группирует записи по дешёвому общему ключу, например, префиксу почтового индекса или первому слову имени, и сравнивает только записи внутри одного блока. Она важна, потому что сравнение каждой записи со всеми остальными не масштабируется: два набора по 100 000 строк подразумевают десять миллиардов сравнений. Блокировка сокращает это на порядки, при этом улавливая пары, вероятно являющиеся истинными совпадениями.
Как справляться с ложноположительными и ложноотрицательными результатами?
Оба сводятся к тому, где вы устанавливаете порог совпадения. Более низкий порог улавливает больше истинных совпадений, но вызывает больше ложноположительных (неверных слияний); более высокий избегает плохих слияний, но вызывает больше ложноотрицательных (упущенных совпадений). Выберите баланс, основанный на стоимости каждой ошибки в вашем случае использования, используйте двухпороговую полосу, направляющую неопределённые пары на ручную проверку, придайте больший вес надёжным полям, и валидируйте выборку для измерения и уточнения реальных частот ошибок.
Какие инструменты можно использовать для сопоставления спарсенных данных?
Библиотека с открытым исходным кодом Dedupe для Python обрабатывает нечёткое сопоставление, дедупликацию и разрешение сущностей на основе нескольких размеченных примеров. Библиотеки обработки естественного языка, такие как spaCy и NLTK, помогают извлекать сущности из свободного текста перед сопоставлением. Более крупные или регулируемые рабочие нагрузки могут оправдывать коммерческие платформы управления основными данными. Начало с чисто структурированного извлекаемого вывода, например автоматически разобранных полей, сокращает работу по нормализации, которую должен выполнять ваш инструмент сопоставления.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
