Создайте приложение для резюмирования новостных статей с Hugging Face и Gradio

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

Хотите узнать краткое содержание всех отложенных публикаций, чтобы понять суть каждой из них?

С Hugging Face🤗 это возможно!

В этой статье я расскажу, как использовать библиотеку Newspaper3k для извлечения текстов из ссылок на статьи и обобщения их с помощью предварительно обученных в Hugging Face моделей-обобщителей. В завершение я поделюсь своим опытом создания простого пользовательского интерфейса с Gradio, позволяющего извлекать краткое содержание любой статьи из ее URL-адреса!

Код к этой статье:

Установка зависимостей

Перед загрузкой библиотек придется установить необходимые зависимости, которые по умолчанию не установлены в Google Colab.

!pip install newspaper3k transformers gradio --quiet 

Загрузка библиотек

from newspaper import Article
from newspaper import Config
import nltk
nltk.download('punkt')

from transformers import pipeline
import gradio as gr
from gradio.mix import Parallel, Series

[nltk_data] Downloading package punkt to /root/nltk_data... [nltk_data] Package punkt is already up-to-date!

  • newspaper3k — извлечение метаданных из новостей, документов и статей в Python 3.
  • nlkt — предоставление newspaper3k функции токенизации.
  • transformers — доступ к тысячам современных предварительно обученных моделей для различных задач обработки естественного языка (NLP).
  • Gradio — настраиваемый графический интерфейс для моделей машинного обучения или произвольных функций Python.

Создание объекта статьи с помощью Newspaper3k

Прежде чем инициализировать объект статьи, чтобы получить ее контент, вам нужно настроить пользовательского агента. Он поможет получать информацию с определенных веб-сайтов без HTTP ошибок, таких как HTTP 403 Forbidden client error.

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Firefox/78.0'

config = Config()
config.browser_user_agent = USER_AGENT
config.request_timeout = 10

url = 'https://www.technologyreview.com/2021/07/09/1028140/ai-voice-actors-sound-human/'
article = Article(url, config=config)

Код для конфигурации взят отсюда

Настроив конфигурацию, можно инициализировать статью, передав ее URL-адрес и конфигурацию.

В качестве примера будем использовать статью “Голоса актеров озвучания ИИ более похожи на человеческие, чем когда-либо, — и они готовы наниматься на работу”, опубликованную на MIT Technology Review.

Скачивание статьи

Чтобы скачать подробную информацию о статье, нужно просто вызвать функцию article.download().

article.download() 

После скачивания вы сможете просмотреть HTML-контент статьи, вызвав функцию article.html.

Теперь можно приступить к извлечению полезной информации из загруженной статьи путем ее анализа.

Анализ статьи

article.parse() 

authors = ", ".join(author for author in article.authors)
title = article.title
date = article.publish_date
text = article.text
image = article.top_image
videos = article.movies
url = article.url

Путем доступа к значениям внутри объекта статьи с помощью .точечного метода вы получаете следующую информацию:

  • название статьи;
  • дата публикации;
  • URL-адрес статьи;
  • используемые изображения;
  • ссылки на видео;
  • текст статьи.
print("Information about the article")
print("=" * 30)
print(f"Title: {title}")
print(f"Author(s): {authors}")
print(f"Publish date: {date}")
print(f"Image: {image}")
print(f"Videos: {videos}")
print(f"Article link: {url}")
print(f"Content: {text[:100] + '...'}")

Information about the article ============================== Title: AI voice actors sound more human than ever—and they’re ready to hire Author(s): Karen Hao Publish date: 2021-07-09 00:00:00 Image: https://wp.technologyreview.com/wp-content/uploads/2021/07/AIAudioActor-2.jpg?resize=1200,600 Videos: [] Article link: https://www.technologyreview.com/2021/07/09/1028140/ai-voice-actors-sound-human/ Content: The company blog post drips with the enthusiasm of a ’90s US infomercial. WellSaid Labs describes wh...

Выше приведена распечатанная информация.

Выполнение NLP статьи

Библиотека newspaper3k откроет вам доступ к некоторым свойствам текста на естественном языке. Для этого надо вызвать функцию nlp.

Два вида информации, которые вы сможете получить:

  • ключевые слова статьи;
  • краткое изложение статьи.
article.nlp()

keywords = article.keywords
keywords.sort()
print(keywords)

['actors', 'ai', 'audio', 'certainly', 'clients', 'companies', 'different', 'everand', 'hire', 'human', 'ready', 'sound', 'theyre', 'voice', 'voices']

После вызова .keywords и сортировки ключевых слов в алфавитном порядке вы увидите, что наиболее значимыми словами в этой статье являются:

  • actors (актеры);
  • ai (искусственный интеллект);
  • audio (аудио);
  • voice (голос) и так далее.

Для получения краткого содержания статьи вызовите функцию .summary.

print(f"Summary: \n{article.summary}")

Summary: 
Unlike a recording of a human voice actor, synthetic voices can also update their script in real time, opening up new opportunities to personalize advertising.
Human voice actors, in particular, have been left to wonder what this means for their livelihoods.
Part of what makes a human voice so human is its inconsistency, expressiveness, and ability to deliver the same lines in completely different styles, depending on the context.
Capturing these nuances involves finding the right voice actors to supply the appropriate training data and fine-tune the deep-learning models.
Many of its clients use the synthesized voices only in pre-production and switch to real voice actors for the final production.

Из исходного кода следует, что краткое содержание статьи явно получено путем оценки предложений с помощью определенного алгоритма.

Модели Hugging Face

Вместо использования функции .summary newspaper3k, попробуем обобщить наш текст с помощью моделей Hugging Face, точнее, моделей конвейера обобщения.

Если вы не слышали о Hugging Face, вот краткое описание этого ИИ-сообщества , взятое из его документации.

Что такое Hugging Face?

Hugging Face предоставляет доступ к тысячам предварительно обученных моделей. Вот перечень некоторых заданий, которые они выполняют с текстами, написанными на более чем 100 языках:

  • классификация;
  • извлечение информации;
  • ответы на вопросы;
  • обобщение;
  • перевод;
  • генерация текста.

Главная цель сообщества — сделать передовые NLP-технологии более легкими в использовании для каждого человека.

С помощью библиотеки transformers вы можете загрузить любую модель, написав всего несколько строк кода. Настройте ее под свои наборы данных и поделитесь ею в хабе моделей.

Примеры задач, которые вы можете выполнять с этими моделями:

Скриншот задач сделан со страницы “Модели Hugging Face”

В нашем случае следует сосредоточиться на задаче “Summarization” (“Обобщение”).

Кликнув на “Summarization”, получим список моделей, которые предназначены для решения данной задачи.

Скриншот моделей для обобщения на Hugging Face

Использование Gradio с Hugging Face

Для создания приложения будем использовать Gradio. Эта программа позволяет легко разрабатывать пользовательский интерфейс для модели Hugging Face.

Версией Gradio 2.0 позволит вам не только использовать одну модель, но и совмещать работу нескольких моделей Hugging Face с интерфейсами Gradio, загрузив их всего 1 строкой кода!

Для начала выберем подходящую модель для нашего приложения-обобщителя.

Сравнение моделей обобщения Hugging Face

Используя Gradio, мы можем параллельно запускать несколько моделей и сравнивать результаты их работы.

Вот 4 модели (выбранные как топ загрузок), которые мы будем использовать:

Просмотрите весь список моделей обобщения Hugging Face.

Сначала загрузим все модели в интерфейс, а затем можем инициализировать параллельный интерфейс, передавая каждую из выбранных моделей.

io1 = gr.Interface.load('huggingface/sshleifer/distilbart-cnn-12-6')
io2 = gr.Interface.load("huggingface/facebook/bart-large-cnn")
io3 = gr.Interface.load("huggingface/google/pegasus-xsum")  
io4 = gr.Interface.load("huggingface/sshleifer/distilbart-cnn-6-6")                   

iface = Parallel(io1, io2, io3, io4,
                 theme='huggingface', 
                 inputs = gr.inputs.Textbox(lines = 10, label="Text"))

iface.launch()
Интерфейс Gradio в Google Colab

Реализовав запуск, увидим этот интерфейс в Google Colab:

Если вы хотите открыть его в новой вкладке в своем браузере, нажмите на внешний URL https://<some_numbers>.gradio.app

Теперь все, что нужно для интерфейса, — это текст нашей статьи.

Чтобы сравнить работу моделей по обобщению, надо сначала получить текст статьи, вызвав текстовый объект (который мы создали ранее), и скопировать выходные данные.

Нажмите кнопку “Копировать” в Google Colab, как указывает красная стрелка

Вставив текст в текстовое поле, нажмите кнопку “Отправить”.

Поскольку у нас в работе 4 модели, для запуска может потребоваться некоторое время.

Модели Hugging Face, работающие параллельно, создают 4 варианта краткого содержания текста

Судя по результатам, модель facebook/bart-large-cnn лучше справилась с обобщением текста. Она передала суть деятельности нового стартапа и рассказала о практическом применении голосов ИИ. Поэтому мы выберем эту модель для создания приложения.

Создание приложения для обобщения новостей

Удобство этого приложения заключается в том, что для получения краткого содержания статьи пользователю надо вставить не всю статью, а только ссылку на нее.

def extract_article_text(url):
  USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Firefox/78.0'
  config = Config()
  config.browser_user_agent = USER_AGENT
  config.request_timeout = 10

  article = Article(url, config=config)
  article.download()
  article.parse()
  text = article.text
  return text

Еще одна интересная особенность Gradio заключается в возможности последовательно запускать функции или модели. Это означает, что при запуске двух моделей — допустим, переводчика и обобщителя — Gradio сначала переведет переданный текст, а затем обобщит его.

Для создания интерфейса приложения нужно передать сначала функцию extract_article_text, а затем обобщитель (Summarizer) в класс Series.

Таким образом, весь поток будет следующим:

link -> extract_article_text -> text ->
summarizer_model -> summary

Чтобы предоставить вам больше примеров, я взял несколько статей из MIT Technology Review. Я также добавил их простые названия и описания для приложения.

extractor = gr.Interface(extract_article_text, 'text', 'text')
summarizer = gr.Interface.load("huggingface/facebook/bart-large-cnn")

sample_url = [['https://www.technologyreview.com/2021/07/22/1029973/deepmind-alphafold-protein-folding-biology-disease-drugs-proteome/'],
              ['https://www.technologyreview.com/2021/07/21/1029860/disability-rights-employment-discrimination-ai-hiring/'],
              ['https://www.technologyreview.com/2021/07/09/1028140/ai-voice-actors-sound-human/']]

desc =  '''
        Let Hugging Face models summarize articles for you. 
        Note: Shorter articles generate faster summaries.
        This summarizer uses bart-large-cnn model by Facebook
        '''

iface = Series(extractor, summarizer, 
  inputs = gr.inputs.Textbox(
      lines = 2,
      label = 'URL'
  ),
  outputs = 'text',
  title = 'News Summarizer',
  theme = 'huggingface',
  description = desc,
  examples=sample_url)

iface.launch()

После запуска вы увидите что-то вроде этого.

Перейдем по внешнему URL-адресу для более впечатляющего просмотра.

Представляем приложение для обобщения новостей

Гифка с примерами обобщаемых статей

Обратите внимание, что статьи с указанными URL-адресами обрабатываются довольно быстро, поскольку результаты кэшируются. Однако для передачи новых статей потребуется больше времени для обобщения, особенно если они длиннее.

Теперь все, что осталось сделать, — это весело провести время с приложением! Вы также можете поделиться ссылкой со своими друзьями. Но учтите: срок ее действия истекает через 24 часа.

Вы сами видели, как легко использовать модели Hugging Face и Gradio, чтобы создавать приложения для обобщения новостей. Даже если вы не знаете, как работают модели, у вас все получится.

Если хотите глубже погрузиться в архитектуру transformers, которая лежит в основе архитектуры моделей Hugging Face, я рекомендую вам прочитать популярную статью “Внимание: это все, что вам нужно” или посмотреть эти видео:

Чтобы узнать больше об экосистеме Hugging Face, можете пройти бесплатный Hugging Face курс от команды Hugging Face.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Benedict Neo, Build a News Article Summarizer App with Hugging Face 🤗 and Gradio

Предыдущая статьяКак разработать систему для 100 миллионов пользователей: руководство для начинающих
Следующая статьяТребования к Senior Developer: как стать старшим разработчиком и что нужно знать