33
Извлечение информации из веб-страниц Михаил Коробов, ScrapingHub PyCon RU 2014

Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Извлечение информации из веб-страницМихаил Коробов, ScrapingHub

PyCon RU 2014

Page 2: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

План

• Скачать страницу

• Вытащить информацию

Page 3: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Скачать страницу• wget / curl

• urllib

• requests

• twisted / tornado / gevent / ...

• scrapy / ...

Page 4: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

HTML<html> <head></head> <body> <div>TEXT-1</div> <div> TEXT-2 <b>TEXT-3</b> </div> <b>TEXT-4</b> </body> </html>

Page 5: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

HTML

Page 6: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

XPath

//b

Page 7: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

XPath

//div/b

Page 8: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

XPath

//div[2]/text()

Page 9: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

XPath

//div[2]//text()

Page 10: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Получение информации из HTML

• re (регулярные выражения)

• XPath селекторы

• CSS3 селекторы

• jquery селекторы

• parsley селекторы

• ...

Page 11: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Не пишем селекторы

• Scrapely (https://github.com/scrapy/scrapely)

• Portia (https://github.com/scrapinghub/portia)

Page 12: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Portia: демо

Page 13: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Сложные случаи: много сайтов, все разные;

структура сайта неизвестна заранее.

Page 14: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Задачи

• Обход сайта

• Извлечение информации

Page 15: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Обход сайта: обычно - правила

• Переходить по ссылкам /contact, /about и т.д. (в зависимости от задачи);

• переходить по ссылкам, ведущим на тот же домен; • ограничения на глубину переходов; • ограничения на общее количество переходов; • ... • паджинация? • формы поиска?

Page 16: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Извлечение информации

• Правила / регекспы работают неплохо для телефонов, факсов и т.д.

• Правила работают хуже для более сложных задач: имена людей, названия организаций и т.д.

• В науке задача известна как Named Entity Recognition (NER).

Page 17: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения

1. Определяем, что именно хотим найти.

2. Размечаем веб-страницы вручную.

3. Тренируем модель на размеченных данных.

4. Извлекаем информацию из новых веб-страниц.

Page 18: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения

1. Определяем, что именно хотим найти.1

2. Размечаем веб-страницы вручную.

3. Тренируем модель на размеченных данных.

4. Извлекаем информацию из новых веб-страниц.

Page 19: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

1. Примеры именованных сущностей

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

Page 20: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

1. Примеры именованных сущностей

• название организации - ORG • имя человека - PER • должность человека - FUNC • адрес (дом, улица и т.д.) - STREET • город - CITY • штат, провинция, область - STATE • страна - COUNTRY • телефон - TEL • факс - FAX • время работы - HOURS

Page 21: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения

1. Определяем, что именно хотим найти.

2. Размечаем веб-страницы вручную.1

3. Тренируем модель на размеченных данных.

4. Извлекаем информацию из новых веб-страниц.

Page 22: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

2. Инструменты для ручной разметки

• https://github.com/xtannier/WebAnnotator

• https://gate.ac.uk/

• http://brat.nlplab.org/

Page 23: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Разметка с помощью WebAnnotator

(расширение для Firefox)

Page 24: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Named Entity RecognitionДля английского языка часто решается с помощью машинного обучения

1. Определяем, что именно хотим найти.

2. Размечаем веб-страницы вручную.

3. Тренируем модель на размеченных данных.1

4. Извлекаем информацию из новых веб-страниц.

Page 25: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

3. Приводим задачу к виду, удобному для машинного обучения

• Веб-страница => последовательность токенов;

• для каждого токена сохраняем информацию о том, где он расположен в HTML;

• каждому токену присваиваем метку.

Инструмент: https://github.com/scrapinghub/webstruct

Page 26: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Одна именованная сущность - это один или

несколько токенов

ORG© Old Tea Cafe All Rights Reserved

Для машинного обучения - сложно и неудобно

Page 27: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

IOB-кодирование

• Токенам "вне" именованных сущностей - тег O1• Первому токену сущности - тег B-ENTITY1• Всем остальным токенам сущности - тег I-ENTITY

I-ORG B-ORG

© Old Tea Cafe All Rights ReservedO O OOI-ORG

Page 28: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Свели задачу к "стандартной" задаче классификации

• Входные данные - информация о токене (фичи)

• Предсказание - метка, закодированная IOB

• ... + одна тонкость - чтоб улучшить качество предсказания, используют классификаторы, учитывающие последовательность меток (обычно это Conditional Random Fields)

Page 29: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Примеры фич• токен == "Cafe"?

• первая буква - заглавная?

• токен - это название месяца?

• предыдущие два токена - "© 2014"?

• токен - внутри html-элемента <title>?

• токен - последний в своем html-элементе?

Page 30: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Собираем все вместе (один из вариантов)

• Размечаем веб-странички с помощью WebAnnotator

• Используем WebStruct, чтобы загрузить тренировочные данные, закодировать сущности в IOB

• Пишем функции извлечения фич (и/или используем готовые из WebStruct)

• Тренируем CRF-модель с помощью python-crfsuite

• С помощью WebStruct соединяем все вместе

Page 31: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Недостатки

• Нужно достаточно много тренировочных данных (хорошо бы несколько сотен страниц)

• 100% точности достичь невозможно

• Если фичи извлекаются питоньими функциями, и их много, то это не очень быстро (5-20 страниц в секунду)

Page 32: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Достоинства• Работает;

• понятно, как улучшать;

• понятно, как адаптировать к новой предметной области;

• часть работы (разметка тренировочных данных) может быть выполнена непрограммистом.

Page 33: Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014

Советы

• Понимать, что происходит внутри;

• не действовать "вслепую", не воспринимать все как черный ящик

• пройти курсы на Coursera / ...

• почитать книжки.