Upload
it-people
View
762
Download
12
Embed Size (px)
DESCRIPTION
Citation preview
Извлечение информации из веб-страницМихаил Коробов, ScrapingHub
PyCon RU 2014
План
• Скачать страницу
• Вытащить информацию
Скачать страницу• wget / curl
• urllib
• requests
• twisted / tornado / gevent / ...
• scrapy / ...
HTML<html> <head></head> <body> <div>TEXT-1</div> <div> TEXT-2 <b>TEXT-3</b> </div> <b>TEXT-4</b> </body> </html>
HTML
XPath
//b
XPath
//div/b
XPath
//div[2]/text()
XPath
//div[2]//text()
Получение информации из HTML
• re (регулярные выражения)
• XPath селекторы
• CSS3 селекторы
• jquery селекторы
• parsley селекторы
• ...
Не пишем селекторы
• Scrapely (https://github.com/scrapy/scrapely)
• Portia (https://github.com/scrapinghub/portia)
Portia: демо
Сложные случаи: много сайтов, все разные;
структура сайта неизвестна заранее.
Задачи
• Обход сайта
• Извлечение информации
Обход сайта: обычно - правила
• Переходить по ссылкам /contact, /about и т.д. (в зависимости от задачи);
• переходить по ссылкам, ведущим на тот же домен; • ограничения на глубину переходов; • ограничения на общее количество переходов; • ... • паджинация? • формы поиска?
Извлечение информации
• Правила / регекспы работают неплохо для телефонов, факсов и т.д.
• Правила работают хуже для более сложных задач: имена людей, названия организаций и т.д.
• В науке задача известна как Named Entity Recognition (NER).
Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения
1. Определяем, что именно хотим найти.
2. Размечаем веб-страницы вручную.
3. Тренируем модель на размеченных данных.
4. Извлекаем информацию из новых веб-страниц.
Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения
1. Определяем, что именно хотим найти.1
2. Размечаем веб-страницы вручную.
3. Тренируем модель на размеченных данных.
4. Извлекаем информацию из новых веб-страниц.
1. Примеры именованных сущностей
• название организации • имя человека • должность человека • адрес (дом, улица и т.д.) • город • штат, провинция, область • страна • телефон • факс • время работы
1. Примеры именованных сущностей
• название организации - ORG • имя человека - PER • должность человека - FUNC • адрес (дом, улица и т.д.) - STREET • город - CITY • штат, провинция, область - STATE • страна - COUNTRY • телефон - TEL • факс - FAX • время работы - HOURS
Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения
1. Определяем, что именно хотим найти.
2. Размечаем веб-страницы вручную.1
3. Тренируем модель на размеченных данных.
4. Извлекаем информацию из новых веб-страниц.
2. Инструменты для ручной разметки
• https://github.com/xtannier/WebAnnotator
• https://gate.ac.uk/
• http://brat.nlplab.org/
Разметка с помощью WebAnnotator
(расширение для Firefox)
Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения
1. Определяем, что именно хотим найти.
2. Размечаем веб-страницы вручную.
3. Тренируем модель на размеченных данных.1
4. Извлекаем информацию из новых веб-страниц.
3. Приводим задачу к виду, удобному для машинного обучения
• Веб-страница => последовательность токенов;
• для каждого токена сохраняем информацию о том, где он расположен в HTML;
• каждому токену присваиваем метку.
Инструмент: https://github.com/scrapinghub/webstruct
Одна именованная сущность - это один или
несколько токенов
ORG© Old Tea Cafe All Rights Reserved
Для машинного обучения - сложно и неудобно
IOB-кодирование
• Токенам "вне" именованных сущностей - тег O1• Первому токену сущности - тег B-ENTITY1• Всем остальным токенам сущности - тег I-ENTITY
I-ORG B-ORG
© Old Tea Cafe All Rights ReservedO O OOI-ORG
Свели задачу к "стандартной" задаче классификации
• Входные данные - информация о токене (фичи)
• Предсказание - метка, закодированная IOB
• ... + одна тонкость - чтоб улучшить качество предсказания, используют классификаторы, учитывающие последовательность меток (обычно это Conditional Random Fields)
Примеры фич• токен == "Cafe"?
• первая буква - заглавная?
• токен - это название месяца?
• предыдущие два токена - "© 2014"?
• токен - внутри html-элемента <title>?
• токен - последний в своем html-элементе?
Собираем все вместе (один из вариантов)
• Размечаем веб-странички с помощью WebAnnotator
• Используем WebStruct, чтобы загрузить тренировочные данные, закодировать сущности в IOB
• Пишем функции извлечения фич (и/или используем готовые из WebStruct)
• Тренируем CRF-модель с помощью python-crfsuite
• С помощью WebStruct соединяем все вместе
Недостатки
• Нужно достаточно много тренировочных данных (хорошо бы несколько сотен страниц)
• 100% точности достичь невозможно
• Если фичи извлекаются питоньими функциями, и их много, то это не очень быстро (5-20 страниц в секунду)
Достоинства• Работает;
• понятно, как улучшать;
• понятно, как адаптировать к новой предметной области;
• часть работы (разметка тренировочных данных) может быть выполнена непрограммистом.
Советы
• Понимать, что происходит внутри;
• не действовать "вслепую", не воспринимать все как черный ящик
• пройти курсы на Coursera / ...
• почитать книжки.