Привет, Хабр!

Сегодня с вами участник профессионального сообщества NTA Пётр Гончаров.

Иногда, в процессе работы, появляются новые задачи, для которых у меня и моих коллег нет готовых решений или каких‑то наработок. Например, не так давно у меня возникла необходимость автоматизированного анализа текстовой информации в публикациях на Хабре для составления отчётов. Для решения подобных задач обычно используют богатый набор инструментов искусственного интеллекта для обработки естественного языка. В посте мой личный опыт в указанной сфере и последовательность действий, оказавшихся полезными при решении задачи.

Факультативно расскажу о своём опыте погружения в тему искусственного интеллекта и немного о самой библиотеке DeepPavlov.

О том, как я погружался в тему AI и искал решение

Приступая к решению задачи, я провёл небольшое исследование по данной теме начав с ответов на максимально общие вопросы, чтобы узнать «где я нахожусь» и какую терминологию следует использовать. Я понял, что NLP — одно из направлений ИИ, цель которого научить компьютеры понимать человеческие языки. Сложность этой области знаний обусловлена необходимостью учёта большого количества разнородного контекста, без которого невозможно было добиться хоть какой‑то однозначной интерпретации информации из обрабатываемых сообщений. Искусственные нейронные сети (ИНС) и другие методы машинного обучения нашли широкое применение в этой области знаний.

Затем пришло время определиться с конкретной моделью и на этом этапе стало понятно, что это не так‑то просто. Действительно, разнообразие архитектур моделей ИНС и использование их в различных комбинациях, даже без учёта того, что на итоговый результат влияют данные на которых, эти модели обучались, приводит к огромному «зоопарку» различных моделей ИНС. К счастью, появляются инструменты (библиотеки, фреймворки, web‑сервисы, приложения, чат‑боты) агрегирующие наборы моделей ИНС и предоставляющие удобный и эффективный способ взаимодействия с ними для пользователей с различными потребностями и опытом в этой сфере.

Одним из таких инструментов является открытая библиотека для разработки и применения различных моделей и систем ИИ, включая модели глубокого обучения, для решения задач в области NLP — DeepPavlov.

О DeepPavlov

Библиотека DeepPavlov разработана на языке Python и предоставляет удобный интерфейс для обучения и использования различных моделей машинного обучения в задачах обработки текстов. Библиотека включает в себя реализацию различных алгоритмов, таких как Word2Vec, BERT, GPT-2, и других.

Библиотека может использоваться для создания различных систем, включая чат‑ботов, систем распознавания речи, систем анализа тональности текстов и других приложений в области NLP, и конечно, он будет полезен при решении задачи автоматизированного анализа текстовой информации в публикациях на сайте habr.com для составления отчётов. Я рассмотрю задачу, которая позволяет находить в заданном тексте ответы на вопросы.

Решение задачи

В процессе работы над решением задачи оказался полезным сервис HuggingFace, предлагающий множество мультиязычных передобученных NLP моделей. Данный ресурс является популярной платформой для взаимодействия специалистов в области машинного обучения, агрегатором обучающих выборок, топологий ИНС и передобученных моделей для различных задач. Кроме того, HuggingFace представляет универсальный интерфейс для работы с ИНС transformers. Однако, при обработке текстов статей на русском языке предпочтение было отдано российскому инструменту DeepPavlov, специализирующемуся на задачах NLP. Тем более, что DeepPavlov позволяет работать с NLP‑моделями, представленными на HuggingFace «из коробки».

После этого я перешёл к решению задачи автоматизированного анализа текстовой информации в публикациях на сайте habr.com для составления отчётов, разбив её на три этапа:

  • загрузить текст публикации с сайта habr.com;

  • подготовить набор вопросов из ответов, на которые будут формироваться отчёты;

  • настроить deepPavlov для решения задачи поиска в заданном тексте ответы на вопросы (Context Question Answering или CQA).

Для получения текста публикации с сайта habr.com воспользуюсь существующими библиотеками urllib для загрузки html‑документа с сайта и bs4 для доступа к элементам. Библиотека urllib входит в состав предустановленных библиотек языка Python, а библиотеку bs4 можно установить с помощью команды:

pip install beautifulsoup4

Код для получения текста публикации с сайта по заданному url представлю в виде функций getHtmlDocument и getTextFromHtml:

from urllib import request
def getHtmlDocument(url):
    """ Получаем html-документ с сайта по url. """
    fp = request.urlopen(url)
    mybytes = fp.read()
    fp.close()
    return mybytes.decode('utf8')
from bs4 import BeautifulSoup
def getTextFromHtml(HtmlDocument):
    """ Получаем текст из html-документа. """
    soup = BeautifulSoup(HtmlDocument,
                                     features='html.parser')
    content = soup.find('div', {'id': 'post-content-body'})
    return content.text

Набор вопросов из ответов, на которые будут формироваться отчёты выглядит следующим образом:

questions = (
    'О чём статья?',
    'Какая цель статьи?',
    'Какая задача решалась?',
    'Что использовалось в работе?',
    'Какие выводы?',
    'Что использовалось?',
    'Какие алгоритмы использовалось?',
    'Какой язык программирования использовали?',
    'В чём отличия?',
    'Что особенного проявилось?',
    'Какова область применения?',
    'Что получено?',
    'Каков результат?',
    'Что получено в заключении?',
)

Далее перейду к настройке DeepPavlov для решения задачи СQA. Установлю библиотеку deeppavlov в соответствии с официальным сайтом проекта:

pip install deeppavlov, transformers

Импортирую объекты configs и build_model с помощью команд:

from deeppavlov import configs, build_model

Инициализирую загрузку модели squad_ru_bert командой:

model = build_model('squad_ru_bert', download=True)

Модель squad_ru_bert это модель глубокого обучения на основе архитектуры BERT (Bidirectional Encoder Representations from Transformers) обученная на наборе данных SQuAD‑Ru, который содержит пары вопрос‑ответ на русском языке.

Выберу, для примера, статьи с сайта habr.com:

paper_urls = (
'https://habr.com/ru/articles/339914/',
'https://habr.com/ru/articles/339915/',
'https://habr.com/ru/articles/339916/',
)

Воспользуюсь моделью squad_ru_bert для построения ответов на указанные выше вопросы questions для каждой статьи из списка paper_urls:

for url in paper_urls:
    content = getTextFromHtml(getHtmlDocument(url))
    for q in questions:
       answer = model([content], [q])
       if abs(answer[2] – 1) > 1e-6:
    print(q, ' ', answer[0])

Результатом работы модели является фрагмент текста, который является ответом на заданный вопрос на основании текста, позиция этого ответа в тексте и качество полученного результата. Примеры «удачных» ответов, по моему мнению, на вопросы отмечены зелёным цветом на рисунках 1 — 3.

Рисунок 1 — Результат, полученный для статьи https://habr.com/ru/articles/339914
Рисунок 1 — Результат, полученный для статьи https://habr.com/ru/articles/339914
Рисунок 2 — Результат, полученный для статьи https://habr.com/ru/articles/737312
Рисунок 2 — Результат, полученный для статьи https://habr.com/ru/articles/737312
Рисунок 3 — Результат, полученный для статьи https://habr.com/ru/articles/267733
Рисунок 3 — Результат, полученный для статьи https://habr.com/ru/articles/267733

Заключение

Автоматизированный анализ текстовой информации в публикациях на Хабре был использован мной при составлении отчётов.

В своём посте я представил последовательность действий, выполненных при решении задачи для которой у меня не было готовых решений или каких-то наработок на примере автоматизированного анализа текстовой информации в публикациях на сайте habr.com для составления отчётов. В итоге задача была решена мной с помощью библиотеки DeepPavlov и модели squad_ru_bert.

Комментарии (0)