Как использовать фреймворк Web2Text для создания функций HTML и HuggingFace Transformers для массового извлечения контента

Найти автора больших объемов новостей непросто. Веб-страницы бывают разных форматов, и в идеальном решении во всех случаях должно указываться полное имя авторов. Иногда имя автора может быть прямо под заголовком, но иногда оно находится под статьей или почти полностью скрыто в другом столбце. Имя автора может быть на любом языке и может содержать или не содержать частицу, например английский предлог by. В некоторых случаях имеется несколько авторов, а имена разделяются запятыми или и-.

Во многих случаях хорошо подойдет анализатор на основе эвристики, т. Е. Использующий регулярные выражения и сценарии bash с условными выражениями. Тем не менее, хорошее решение должно распространяться на невидимые форматы. Например, в некоторых статьях есть списки заданных имен в документе (ссылки на другие статьи или другие элементы на веб-сайте), что может создать двусмысленность.

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

Получение обучающих примеров

Я использовал набор данных Эндрю Томпсона Все новости (в котором 73 000 статей из 15 американских изданий с URL-адресом и автором). Новостные статьи охватывают период 2015–2017 годов. Archive.org хранит около 27 000 новостных статей в их оригинальном формате, а остальные находятся в оригинальных новостных сайтах. Обработка всех ссылок заняла около трех дней (сжатые данные 4,1 ГБ).

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

Обзор

Конвейер состоит из трех этапов: Препроцессор, Классификатор и Распознавание именованных сущностей.

Препроцессор

Я использовал препроцессор из статьи Web2Text: Deep Structured Boilerplate Removal ³ (Github repo).

Web2Text может построить дерево DOM как для совместимого, так и для несовместимого HTML. У него есть логика для очистки узлов DOM, которые, как известно, содержат неинформативные данные, обхода дерева DOM вниз и сворачивания однопереходных узлов с соответствующими дочерними узлами.

Обучающими примерами модели являются узлы DOM файлов HTML. Каждый HTML-файл имеет в среднем 138 узлов DOM. Итак, всего набор данных содержит m = 73K * 138 = 101M обучающих примеров. В среднем код занимает 127 мс для преобразования каждого из файлов HTML в файл представления функции CSV, где каждая строка представляет функцию, а каждый столбец является узлом DOM (работает на двухъядерном процессоре i7 1,7 ГГц с памятью DDR3 8 ГБ). .

Основной класс ExtractPageFeatures принимает в качестве входных данных необработанный HTML-файл и создает CSV-файл с функциями для задачи удаления Boilerplate. Я изменил этот код и создал новые функции, которые лучше подходят для текущей задачи извлечения автора. После компиляции проекта Scala вы можете запускать любой HTML-файл:

> ./extract_page_features.sh  <input_html_file>

Давайте рассмотрим простой пример одного из текстов в нашем наборе данных:

Алгоритм достигает токена Politics (8 символов) по маршруту header -> div -> div -> h2 / a. Обратите внимание, как <h2> и <a> свернуты в один лист.

Для каждого узла свернутой модели DOM (CDOM) Web2Text создает вектор функций:

Web2Text имеет набор из 128 предопределенных функций:

Возможности существуют на следующих уровнях:

  • Лист
  • Родитель
  • Бабушка и дедушка
  • Корень

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

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

Функциональная инженерия

Задача «Извлечение автора» расширяет Web2Text некоторыми дополнительными функциями (из соображений производительности проверки выполняются, только если 2<=nWords<=5):

  • contains_popular_name: Истина, если узел CDOM содержит имя из набора данных из 1000 наиболее распространенных детских имен в США в год за период 1880–2008 годов. В любой год он охватывает 80% имен для мальчиков и 67% для девочек в США (6,8 тыс. Дедуплицированных записей). (Примечание: в этой конкретной части используется сравнение строк. Лучшее решение для этой функции будет включать в себя встраивание слов или, возможно, BERT или его преемников).
  • contains_author_particle: Истина, если узел CDOM содержит частицу by или и.
  • contains_author_url: Истина, если узел включает URL-адрес в формате http[s]://[something]/author/[something. Многие газеты содержат ссылки на страницу с биографией автора или страницу с другими статьями того же автора со ссылкой в ​​этом формате.

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

  • contains_two_capitalized_words: содержит как минимум два заглавных слова (John Doe, JOHN DOE) (функции Web2Text b20, b21, b22)
  • at_least_two_words: содержит как минимум два слова (захвачено функцией Web2Text b5)
  • contains_date: узел на разумном расстоянии содержит дату. Это фиксируется функцией contains_year (b19) на уровне родителей или бабушек и дедушек.

Некоторые особенности, которые были бы очень интересны для расширения модели:

  • Размер отображаемого размера шрифта HTML
  • Узел-предок содержит ссылку на социальные сети
  • number_of_sibling_nodes: количество выходов одноуровневого CDOM. Фиксирует тот факт, что имя может быть частью списка ссылок, как в примере с Aftonbladet, рассмотренном ранее.
  • Определите язык, на котором написана статья, поскольку в модели используются заглавные буквы, английский формат даты и список англоязычных имен.

Классификация

В архитектуре Web2Text используются сверточные нейронные сети, за которыми следует скрытая марковская модель для вычисления унарного и попарного потенциалов на блоках и парах смежных блоков соответственно. В нашем случае, однако, мы хотим найти не более одного блока на странице, содержащего имя автора, поэтому я сформулировал проблему как двоичный классификатор с двумя классами: {contains_author, not_contains_author} и выбрал блок, минимизирующий двоичную кросс-энтропийную потерю. Фактическая модель представляет собой простую нейронную сеть (1 скрытый слой; 140 скрытых единиц).

Результаты классификации

Гиперпараметры

Количество проанализированных файлов HTML: 15 000 [717 414 обучающих примеров (DOM-узлы)]; Эпох: 50; Размер пакета: 50 файлов; Скорость обучения: 0,0001; Показатель отсева: 0,2; Разделение на обучение / разработку / тестирование: 60% / 20% / 20%.

Ключевые метрики

Точность: 99,93%; Точность: 91,30%; Напомним: 95,40%; F1-рейтинг: 93,31%.

Время тренировки: 8,3 часа

Матрица путаницы

Веса обученной модели хранятся в нашем репозитории по адресу /public/trained_model_all_the_news/.

Вывод

Во время логического вывода модель выполняет два шага:

1.- Запустите обученную нейронную сеть на HTML-документе, чтобы выбрать блок DOM с минимальной стоимостью.

2.- Запустите BERT Named-Entity Recognizer, чтобы извлечь все имена людей из блока. В этой модели используется реализация BERT (Large, Cased) ⁴ (ссылка на модель) в HuggingFace Transformer, и каждый токен в предложении будет помечен как принадлежащий к четырем типам. : Человек, MISC, Организация и Местоположение, используя стандартный формат IOB. Для задачи извлечения авторов актуальны только имена людей (теги PER). Модель настраивается с использованием набора данных CoNLL-2003 ⁵, стандартного набора данных для распознавания именованных сущностей.

Наконец, вы можете запустить следующую команду, чтобы предсказать имя автора новостной статьи:

> ./inference_from_url.sh https://www.theguardian.com/us-news/2016/jul/13/alton-sterling-son-cameron-protesters-baton-rouge
The Author Name is: Jessica Glenza.

Репозиторий

Https://github.com/canetcesc/AuthorExtractor

использованная литература

[1] Т. Фогельс, О. Ганеа и К. Эйкхофф. « Web2text: удаление шаблонов с глубокой структурой (2018) Европейская конференция по поиску информации. Спрингер, Чам.

[2] З. Чжоу и М. Машук. « Извлечение веб-контента с помощью машинного обучения (2014 г.) Стэнфордский университет.

[3] Дж. Яо и Х. Цзо. Подход машинного обучения к извлечению содержимого веб-страниц (2013 г.) S Танфордский университет.

[4] Дж. Девлин, М. В. Чанг, К. Ли и К. Тутанова. Берт: Предварительная подготовка глубоких двунаправленных преобразователей для понимания языка (2018) препринт arXiv arXiv: 1810.04805.

[5] Э. Ф. Санг и Ф. Де Мёльдер. Введение в общую задачу CoNLL-2003: независимое от языка распознавание именованных сущностей (2003) arXiv preprint cs / 0306050.

Благодарности

Большое спасибо Hypefactors за идею для этого поста. Hypefactors - это платформа для профессионалов СМИ, и одним из компонентов их конвейера является определение автора миллионов новостных статей каждый день. Этот пост мотивирован реальной деловой необходимостью, хотя реализация может отличаться.

Клипарт любезно предоставлен studiogstock.