Вступление
Извлечение контента - это задача отделения шаблонов, таких как комментарии, панели навигации, ссылки в социальных сетях, реклама и т. Д., От основного текста статьи, отформатированной как HTML. Основное содержание обычно составляет лишь небольшую часть исходного кода страницы (выделена красным на изображении ниже). Извлечение обычно является первым шагом любого анализа данных, основанного на данных HTML, поскольку ошибки на раннем этапе имеют тенденцию распространяться ниже по течению и влияют на остальную часть исследования. Высокое качество извлечения имеет решающее значение для успеха проектов с данными. Однако извлечение может быть на удивление сложным, потому что HTML можно творчески использовать для достижения того же эффекта.
В этом посте рассказывается, как работает экстрактор контента Skim Technologies, и сравнивается наша модель с двумя установленными пакетами. Наша модель более точна, чем у обоих конкурентов, без использования какой-либо внешней информации о стиле.
Фон
На сегодняшний день предложены два основных подхода к извлечению контента. Методы, основанные на правилах, обычно принимают дерево DOM в качестве входных данных и используют правила, чтобы решить, какие элементы являются шаблонными. Традиционные блокировщики рекламы - простейший экземпляр такой системы. Элементы DOM, которые ссылаются на домены из черного списка, помечаются как шаблонные. Расширяя эту идею, можно использовать более широкий набор простых правил для присвоения оценок элементам DOM в зависимости от того, насколько вероятно, что они будут содержаться. Одним из когда-то популярных таких алгоритмов является Читаемость, в котором используются следующие правила:
- Добавьте по 1 баллу за каждую запятую в этом абзаце.
- За каждые 100 символов в этом абзаце прибавляйте 1 балл до 3 баллов.
- Добавьте 5 баллов, если имя тега элемента - div.
- Вычтите 5 баллов, если имя тега элемента - ol / ul
- Установите нулевое значение, если длина абзаца меньше 25 символов.
Эта система фактически является линейным классификатором с произвольными весами признаков. Человек должен решить, сколько очков добавить или вычесть для каждого правила. Если явно не запрограммировано, сложно включать комбинации функций, такие как «добавить 1 балл, если элемент является div и содержит более 25 символов». Кроме того, отслеживать все взаимодействия между правилами становится практически невозможно по мере роста количества правил. С практической точки зрения разработчикам сложно расширить систему, основанную на правилах, поскольку ее сложность резко возрастает с увеличением количества правил.
Чтобы смягчить недостатки методов, основанных на правилах, в недавней работе использовалось машинное обучение (ML). Основное преимущество перед правилами состоит в том, что функция принятия решения может быть изучена автоматически на примере. Вместо того, чтобы создавать правила вручную, разработчики предоставляют алгоритм обучения со страницами ввода, где каждая часть страницы помечена либо как контент, либо как шаблон. В долгосрочной перспективе такую систему легче обслуживать и расширять.
В извлечении контента на основе машинного обучения появились два основных подхода. Первый основан на изображениях, когда страница отображается, а методы компьютерного зрения используются для анализа визуального макета страницы. Одна из таких известных систем - Diffbot. Однако Diffbot является частной собственностью, поэтому мало подробностей о том, как он работает, общедоступно.
Второе семейство экстракторов контента ML работает с деревьями DOM, подобно моделям на основе правил. Однако контролируемое машинное обучение используется, чтобы узнать, сколько баллов следует назначить каждому элементу. Это позволяет комбинировать функции более сложными способами, чем человек когда-либо может написать от руки. Известной ранней системой, основанной на этом подходе, является Dragnet. Экстрактор Skim Technologies также основан на дереве DOM. Преимущество перед визуальными методами состоит в том, что система меньше зависит от внешних файлов CSS / JS. Это означает более быстрое время загрузки, так как нет необходимости извлекать сторонние ресурсы по сети (кроме HTML-кода страницы). Что еще более важно, внешние сети доставки контента (CDN), как правило, отключаются. Таким образом, вероятность того, что страница будет отображаться одинаково, со временем значительно снижается.
Наш подход
Обучение нашего экстрактора контента состоит из четырех основных этапов. Во-первых, мы получаем образец веб-страниц для использования в качестве входных данных для модели машинного обучения. Затем мы разбиваем HTML-страницы на «блоки», которые являются наименьшими единицами, с которыми работает наша модель. Для каждого блока в наборе данных мы просим человека предоставить шаблонный тег / тег содержимого. Наконец, мы используем знания предметной области для извлечения информативных функций для каждого блока, которые вводятся в алгоритм машинного обучения вместе с человеческими тегами. Более подробная информация о каждом шаге приведена ниже.
Упрощение DOM
Упрощение DOM жизненно важно, потому что среднее дерево DOM очень натянуто: в конечном итоге в нем могут быть узлы, содержащие только один символ. Нам нужен способ сопоставления элементов DOM, которые имеют смысл для браузера, с элементами, полезными для людей (предложения, абзацы и т. Д.). Например, рассмотрим следующий наивный способ реализации буквицы с помощью CSS:
<div> <span style=”font-size: 200%;”>H</span> <span>ello<span> </div>
В этом случае дерево DOM имеет три элемента - родительский блок и два дочерних участка, но только один логический блок - слово «привет». Поэтому мы упрощаем дерево, среди прочего, путем слияния или удаления незначительных дочерних элементов. Результирующая структура данных представляет собой «дерево блоков». Подобно дереву DOM, оно имеет иерархическую структуру, но шире, неглубоко и имеет меньше листьев. Листы семантически более значимы и обычно соответствуют абзацам. Листья - это то, что мы обрабатываем ниже по потоку.
Помеченные данные
Мы собираем данные для обучения, помечая каждый блок на данной странице либо как контент, либо как контент. Четыре аннотатора отметили в общей сложности ~ 400 тыс. Блоков на ~ 2100 страницах. Две трети этих страниц - это исходные данные Dragnet, помеченные заново для исправления некоторых случайных ошибок. Остальные страницы представляют собой случайную выборку реальных страниц, которые были обработаны нашей системой в декабре 2016 года. Мы создали простой веб-инструмент, который помогает нам собирать теги для каждого блока. Мы загружаем набор данных, сначала маркируя небольшой набор данных и обучая модель прототипа, которую затем используем для предварительной маркировки блоков, чтобы сэкономить время аннотатора.
Модельное обучение
Чтобы достичь хорошего компромисса между скоростью и точностью в производстве, мы извлекаем относительно небольшой набор мелких элементов и классифицируем блоки независимо друг от друга. Наш конвейер извлечения признаков генерирует более 40 объектов на блок. Они вдохновлены Dragnet и включают:
- Мелкие текстовые функции, такие как количество слов, плотность текста / ссылок / ключевых слов, средняя длина слова / предложения, оценка удобочитаемости
- Структурные особенности, например расстояние до названия.
- Наши запатентованные стили и групповые функции
Мы учитываем контекст, также добавляя дополнительные функции из соседних блоков. Все функции, которые мы в настоящее время извлекаем, не зависят от языка, поэтому наш экстрактор одинаково хорошо работает со страницами, написанными на любом человеческом языке.
Наш последний шаг - бинарная классификация (контент против шаблона) с деревьями решений с градиентным усилением.
Оценка
Чтобы оценить производительность нашей модели, мы сравниваем ее с Dragnet и Diffbot. Мы приложили все усилия, чтобы сравнение было справедливым. Сначала мы разделили наш набор данных на 80–20. И наша модель, и драгнет обучены на 80%, а все три модели оцениваются на оставшихся 20%. Окончательный набор тестов включает 427 страниц, 275 из которых взяты из драгнета, а 153 - из наших данных. Подробная информация о данных обучения Diffbot не является общедоступной.
Мы используем процесс оценки Dragnet, в котором извлечение контента оценивается аналогично системе извлечения информации. Если в качестве входных данных используется HTML-страница, задача состоит в том, чтобы вывести основную часть статьи в виде обычного текста. Эта оценка учитывает, насколько хороша модель при извлечении основного текста, и не зависит от того, как страницы разбиты на блоки. Обратите внимание, что этот пост посвящен исключительно удалению шаблонов и игнорирует другие функции как Diffbot, так и нашего экстрактора, такие как извлечение названия или автора. Они будут рассмотрены в отдельном посте.
Точность на уровне токенов, отзыв и F1 для всех трех моделей:
Dragnet: .847 / .921 / .876
Diffbot: .917 / .943 / .921
Skim Tech: .956 / .925 / . 926
Средство извлечения контента Skim Technologies выходит в лидеры, значительно опережая Dragnet и Diffbot на полпроцента. Эти результаты показывают, что тщательная предварительная обработка данных и разработка функций приводят к значительному повышению точности извлечения даже без доступа к внешней информации о стилях. Это, в свою очередь, улучшает производительность последующих моделей, таких как текстовые сумматоры.
Качественно и Skim Tech, и Diffbot хорошо работают на страницах с традиционным макетом, где основная часть находится в центре страницы, а шаблон - по краям. Такие страницы обычно извлекаются очень хорошо, лишь изредка появляются ложные срабатывания или ложноотрицания. Skim Tech лучше работает на динамически изменяемых страницах, например, на тех, где платный доступ создается с помощью JS [1] [2] [3]. Вероятно, это связано с тем, что в настоящее время мы не выполняем JS-код на страницах.
Dragnet работает лучше, чем сообщают его авторы, возможно потому, что в исходной статье использовался классификатор логистической регрессии, тогда как в последней версии используется более мощная модель (чрезвычайно рандомизированные деревья).
Наше сравнение Diffbot не в идентичных условиях, потому что тестовые данные не включают файлы JS / CSS. Страницы могут отображаться иначе, чем при первом сборе данных. Ручная проверка 20 страниц Dragnet (с 2012 г.) и 20 наших страниц (с 2016 г.) показывает, что половина отрисовывается так, как было бы изначально. Модель Diffbot использует компьютерное зрение, поэтому различия в отображении страниц могут снизить ее точность. Однако мы рассматриваем чрезмерную зависимость от стиля и визуальной информации как ограничение. Должна быть возможность извлекать контент со страниц при отсутствии внешнего CSS, потому что такая информация со временем теряется.
Что касается скорости, Dragnet - самый быстрый, обрабатывая десятки документов в секунду (когда документы находятся на диске). Наш экстрактор в среднем обрабатывает один документ в секунду. Однако это включает в себя ряд других моделей, помимо контента. Кроме того, наш код в настоящее время оптимизирован для обеспечения точности, во-вторых, производительности разработчика и в последнюю очередь скорости. Большая часть нашего конвейера извлечения функций написана на чистом Python и поэтому намного медленнее, чем могла бы быть (по сравнению с Dragnet, который почти исключительно на C / C ++ / Cython).
Мы не можем представить точные цифры скорости для Diffbot, потому что мы можем получить доступ к их коду только через HTTP API. Такие факторы, как задержка в сети, сбои API, кеширование запросов и ограничение скорости, значительно повлияли на нашу воспринимаемую пропускную способность. По нашему субъективному опыту, когда мы не были ограничены по скорости, скорость Diffbot была на том же уровне, что и скорость нашей системы.
Дорожная карта
Хотя мы довольны текущей точностью нашей модели, мы также воодушевлены тем, как может выглядеть будущее, поскольку мы обращаем наше внимание на повышение ее скорости. Мы планируем заново реализовать критически важные части нашего экстрактора в Cython, чтобы он работал быстро. Попутно мы также будем добавлять новые функции и больше обучающих данных для повышения точности.
Мы намерены расширить это сравнение на другие экстракторы, такие как Embedly, Boilerpipe или Goose, а также на другие веб-страницы. Мы также хотели бы провести сравнение скорости в идентичных условиях. Наконец, как Skim Techonologies, так и API Diffbot предлагают больше способов структурирования страницы, которые выходят за рамки извлечения контента. Недавно мы оценили ряд API-интерфейсов реферирования текста. Мы также хотели бы сравнить другие модели, такие как автор, дата и извлечение заголовка.
Если у вас есть какие-либо вопросы по поводу этой оценки или вы хотите протестировать наши API, свяжитесь с нами по адресу [email protected].