Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Экстрактор контента из вэб-документов

Anna | 16.06.2014 | нет комментариев
Здравствуйте, Прогр!

Это мой 1-й пост, в котором я хочу поделиться своей наработкой в решении такой задачки, как выделение контента на странице. Собственно, задачка давным-давно висела в голове в фоновом режиме. Но так сложилось, что именно теперь мне самому потребовался инструмент, помимо того наткнулся на статейку на прогре: habrahabr.ru/company/mailru/blog/200394 и решил — пора. Хорошо, поехали.

Ход мыслей

Собственно, к чему такая картинка в начале статьи? Дело в том, что задачу решать дозволено абсолютно по-различному. Не буду ударяться в длинные рассуждения о допустимых методах решения, их плюсах и минусах. Основное то, что в этом посте к задаче я подхожу как к задаче систематизации. Выходит, вот ход мысли:

  • Придумываем комплект факторов, Дабы всякий элемент в DOM дозволено было векторизовать.
  • Каким то образом собираем пачку документов.
  • В всяком документе векторизуем все элементы в DOM ниже BODY в дереве. Вновь же как-то.
  • Для всякого из векторизованных элементов назначаем класс 1 либо 0. 0 — не целевой, 1 — целевой.
  • Бьём выборку на две части в пропорции 50/50 либо около того.
  • На одном куске обучаем наш классификатор, на ином его тестируем, получаем итог в виде полноты, точности. Ну либо всякий метрики типа F-score тысячи их.

Проникновенный читатель наверно скажет, что взамен последних 2-х пунктов отменнее сделать, скажем,кросс-валидацию и будет прав. В целом это не значимо в данном случае, т.к. статья в первую очередь посвящена инструменту, а не сопряжённым математико/алгоритмическим деталям.

Про идейную сторону дела как бы бы всё ясно. Посмотрим на технологическую сторону.

  • В качестве языка предпочел python. В основном потому что он мне нравится (:
  • В качестве математической библиотеки для обучения сразу же был выбран sklearn.
  • От того что я отчего-то решил что javascript-страницы обязаны также удачно обрабатываться, в качестве движка для парсинга был выбран PyQt4. Как окажется дальше — это дюже верный выбор.

Решение

Как обыкновенно, оказалось что идея не рассматривает каждые неприятные «мелочи». А дело в том, что звучит всё здорово в предыдущем пункте, но абсолютно не ясно как размечать выборку? Т.е. как выбирать целевые элементы в DOM для последующего обучения? И вот тогда в голову пришла верная мысль: а давайте пускай это будет интерактивный браузер. Выбирать целевые блоки будем при помощи мыши и клавиатуры. Этакий визуализированный процесс разметки не выходя из браузера.

Задумывалось следущее: есть браузер, в котором дозволено водить мышкой, и элемент под мышкой «подсвечивается». Когда выбран необходимый элемент, пользователь нажимает определённый хоткей. В итоге страница парсится, DOM векторизуется, а выделенный элемент получает класс 1, в то время как остальные — класс 0.

Итоги

Я не хочу копипасить сюда портянки из кода — всё в открытом виде и доступно в репозитории. Кому нужно — почитаете там. Да, кому лень, дозволено ставить с поддержкой pip, но учтите, писал и тестировал только на Ubuntu >=12.04.

В результате получилась библиотечка с треми основными вероятностями:

  • Интерактивное обучение распознаванию контента в браузере. Полученная модель классификатора сериализуется в файлик.
  • Интерактивное тестирование распознавания контента в браузере. Элементы, которые на странице были проклассифицированы как целевые — «подсвечиваются».
  • Консольная тулза, умеющая выдрать html целевого элемента DOM по заданному URL и файлику с моделькой.

Кстати, позже установки пакетика constractor— станут доступны для запуска два скриптика:

  • constractor_train.py — это интерактивная обучалка/тестилка. Тулза может подсвечивать элемент под указателем мыши, векторизовать страницу по нажатию хоткея, обучиться на основе данных полученных с различных страниц, сберечь факторы и модельку в файлики, загрузить их из файликов, подсветить элемент на основании нынешней модельки.
  • constractor_predict.py — это консольная выдиралка html целевых элементов. В целом это всё что тулза может (:

Картинки

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

1) Наводим мышку на шапку. Когда надобная область выделена (чёрным бэкграундом), нажимаем Ctrl S. Тем самым добавили векторизованные элементы в выборку.

Повторяем процедуру несколько раз.

2) Дальше нажимаем Ctrl T для обучения. Заходим на произвольную страницу с нашей шапкой. Нажимаем Ctrl P для прогноза.

Завершение

Библиотечка пока дюже сырая и требует много доработок, умоляю не гнать тапком осуждать сурово — всё писалось в подлинно сжатые сроки.

Из планов по доработкам: растяжение множества дефолтных факторов, добавление встроенных моделек для распознавания различных типов блоков и многое другое. Безусловно же я всё это буду понемногу пилить в свободное время. Впрочем буду дюже благодарен, если найдутся прогровольцы, готовые также в свободное время поконтрибьютить в библиотечку.

Спасибо за внимание!

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB