Собираем данные для тренировки в решении NLP-задач
Выбор источника и инструментов реализации
В качестве источника информации я решил использовать habr.com – коллективный блог с элементами новостного сайта. На этом ресурсе все материалы делятся на категории (хабы), из которых только основных – 416 штук. Каждый материал может принадлежать к одной или нескольким категориям.
Код для сбора информации (парсинга) написан на языке python. Среда разработки – Jupyter notebook на платформе Google Colab. Основные библиотеки:
- BeautifulSoup – парсер для синтаксического разбора файлов html / xml;
- Requests – инструмент для составления и обработки http запросов;
- Re – модуль для работы с регулярными выражениями;
- Pandas – высокоуровневый инструмент для управления данными.
Также использовал модуль tqdm для визуализации прогресса обработки и модуль ratelim для ограничения количества запросов к данным (чтобы не превысить лимит и не создавать излишнюю нагрузку на сервер).
Подробности реализации
Каждая публикация на Хабре имеет свой номер, который отражается в адресной строке. Это позволит осуществить перебор всех материалов в цикле:
Однако следует иметь ввиду, что некоторые публикации могут быть удалены авторами, либо перенесены в черновики, поэтому доступа к ним не будет. Для обработки таких случаев удобно использовать блок try… except в связке с библиотекой requests. В общем виде процедура получения текста статьи может выглядеть так:
Первой строкой задается лимит на максимальное количество вызовов процедуры за промежуток времени – не более одного раза в секунду. В блоке try получаю результат запроса к странице – при положительном ответе переход к разбору страницы, в случае возникновения исключений пропуск адреса и переход к следующему.
В процедуре executePost описана обработка кода интернет-страницы для получения текста статьи и других необходимых параметров.
В ходе обработки использовалась библиотека BeautifulSoup для получения кода страницы в текстовом виде: soup = bs(page.text, ‘html.parser’). Затем использовал функции этой библиотеки find / findall и другие для поиска определенных участков в коде (например, по имени класса или по html-тегам). Получив текст статьи обработал его регулярными выражениями для того, чтобы очистить от html-тегов, гиперссылок, лишних знаков и др.
Оформив обработку отдельной страницы можно запустить ее в цикле по всем статьям (или по необходимой выборке), размещенным на ресурсе. Например, можно взять первые 10 тысяч статей. Библиотека tqdm отобразит текущий прогресс выполнения.
Данные записывал в датафрейм pandas и сохранял в файл:
В результате получил датасет, содержащий тексты статей ресурса habr.com, а также дополнительную информацию – заголовок, ссылка на статью, количество комментариев, рейтинг, количество добавлений в закладки, количество просмотров.
В дальнейшем полученный датасет можно обогатить дополнительными данными и использовать для тренировки в построении различных языковых моделей, классификации текстов и др.