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

Preview:

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 / ...

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

Recommended