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

Объем информации растет с каждым днем, умение быстро извлекать суть из больших массивов данных становится мастхэв навыком. Библиотека Sumy справляется с этой задачей на ура, предоставляя возможность получать сжатые и четкие версии длинных текстов.

Sumy — это инструмент для автоматического обобщения текстов на Python. В основе работы лежит задача резюмирования текста, которая позволяет получать краткие и четкие версии больших объемов информации.

Установим:

pip install sumy

Основные фичи Sumy:

  1. Sumy поддерживает несколько методов обобщения, включая LSA, TextRank и LexRank.

  2. С минимальным количеством кода можно начать обобщение текста довольно быстро.

  3. Sumy легко интегрируется с другими Python-библиотеками.

  4. Помимо английского, Sumy также предоставляет поддержку для русского языка.

Основной синтаксис

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

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lsa import LsaSummarizer
from sumy.summarizers.text_rank import TextRankSummarizer

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

В Sumy доступны четыре основных парсера для работы с текстом:

  1. PlaintextParser: для обработки простых текстов и строк. Хорош для работы с обычными текстовыми файлами.

  2. HtmlParser: для извлечения текста из HTML-документов и веб-страниц.

  3. JsonParser: для обработки текста из JSON-структур.

  4. DocxParser: для извлечения текста из документов Microsoft Word.

ПримерPlaintextParser:

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer

text = """Текст, который вы хотите резюмировать. Он может быть довольно длинным и содержать множество предложений."""
parser = PlaintextParser.from_string(text, Tokenizer("russian"))

Для работы с HTML-контентом:

from sumy.parsers.html import HtmlParser

url = "http://example.com"
parser = HtmlParser.from_url(url, Tokenizer("russian"))

Токенизаторы делят текст на предложения и слова. Для русского языка чаще всего используется Tokenizer("russian"). Однако можно юзать стандартные токенизаторы NLTK для большего контроля:

from sumy.nlp.tokenizers import Tokenizer

tokenizer = Tokenizer("russian")

Применение алгоритмов выглядит следующим образом, напомню, что поддерживаются эти: Latent Semantic Analysis, TextRank, LexRank и LsaSummarizer.

LSA:

from sumy.summarizers.lsa import LsaSummarizer

summarizer = LsaSummarizer()
summary = summarizer(parser.document, 3)  # получить 3 предложения

for sentence in summary:
    print(sentence)

TextRank:

from sumy.summarizers.text_rank import TextRankSummarizer

summarizer = TextRankSummarizer()
summary = summarizer(parser.document, 3)  # получить 3 предложения

for sentence in summary:
    print(sentence)

Можно также указать количество предложений, которые хочется получить в резюме. Это делается при вызове метода суммаризатора:

summary = summarizer(parser.document, 2)  # получить 2 предложения

Примеры применения

Обобщение новостных статей

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

from sumy.parsers.html import HtmlParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lsa import LsaSummarizer

# URL новостной статьи
url = "https://example-news-site.com/article"

# инициализация парсера и суммаризатора
parser = HtmlParser.from_url(url, Tokenizer("english"))
summarizer = LsaSummarizer()

# генерация резюме
summary = summarizer(parser.document, 3)  # получить 3 предложения

print("Краткое резюме статьи:")
for sentence in summary:
    print(sentence)

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

Анализ отчетов

Часто требуется быстро ознакомиться с длинными отчетами или теми же исследовательскими работами.

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.text_rank import TextRankSummarizer

# исходный текст научного отчета
text = """В этом исследовании мы анализируем влияние изменения климата на экосистемы.
Используются различные методы для оценки изменений температуры и уровня осадков.
Результаты показывают значительное влияние на растительность и животный мир."""

# инициализация парсера и суммаризатора
parser = PlaintextParser.from_string(text, Tokenizer("english"))
summarizer = TextRankSummarizer()

# генерация резюме
summary = summarizer(parser.document, 2)  # получить 2 предложения

print("Краткое резюме отчета:")
for sentence in summary:
    print(sentence)

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

Обработка отзывов пользователей

Sumy позволяет извлекать общие мнения и выявлять основные тенденции в отзывах.

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer

# исходные отзывы пользователей
text = """Этот продукт превосходен! Он оправдал все мои ожидания.
Мне не понравилось качество упаковки, но сам продукт отличного качества.
Рекомендую всем, кто ищет надежный товар."""

# инициализация парсера и суммаризатора
parser = PlaintextParser.from_string(text, Tokenizer("english"))
summarizer = LexRankSummarizer()

# генерация резюме
summary = summarizer(parser.document, 2)  # получить 2 предложения

print("Краткое резюме отзывов:")
for sentence in summary:
    print(sentence)

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


Подробнее с библиотекой можно ознакомиться здесь.

А напоследок хочу пригласить вас на бесплатный вебинар, где вы узнаете, что такое RAG, зачем это нужно в NLP сервисах и в каких областях применяется эта технология. Помимо этого мы рассмотрим типы RAG, методы оценки качества RAG сервиса и практический пример на задаче Question Answering (QA).

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


  1. titulusdesiderio
    08.08.2024 19:38
    +10

    А можно пожалуйста во все примеры ещё добавить результаты на выходе?


  1. Adgh
    08.08.2024 19:38

    В примерах для русскоязычного текста используется токенизатор английского (Tokenizer("english")). Это ошибка или так и задумано? Неужели нет разницы?


  1. Adgh
    08.08.2024 19:38

    И стоит добавить в примеры:

    import nltk
    nltk.download('punkt')


    без этого не завелось