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

В этом уроке мы рассмотрим, как использовать Python для создания сводного текста. Мы будем использовать популярный набор инструментов под названием NLTK (Natural Language Toolkit), который предлагает множество инструментов для обработки и анализа текста.

Установить NLTK

Прежде чем мы сможем начать, необходимо установить NLTK. Запустите следующую программу в своем терминале, чтобы выполнить это:

pip install nltk

Импорт библиотек и загрузка данных

После загрузки NLTK мы можем начать с импорта необходимых библиотек и загрузки данных для сводки. В этом упражнении мы будем использовать набор данных новостных статей NLTK.

import nltk
from nltk.corpus import reuters

nltk.download('reuters')

articles = reuters.fileids()

Набор данных Reuters загружается с использованием приведенного выше кода, а идентификаторы файлов затем загружаются в переменную «статьи». Затем можно использовать метод reuters.raw() для получения содержимого каждой статьи.

Токенизировать предложения

Следующим этапом является разбиение текста на отдельные предложения. Для выполнения этой работы можно использовать функцию sent_tokenize() из NLTK.

from nltk.tokenize import sent_tokenize

sentences = []

for article in articles:
    sentences.extend(sent_tokenize(reuters.raw(article)))

Упомянутый выше код разделяет каждую статью на предложение и добавляет его в список «предложений».

Предварительно обработать текст

Контент должен быть предварительно обработан, чтобы избавиться от любой посторонней информации, такой как стоп-слова, знаки препинания и специальные символы, прежде чем мы сможем обобщить его. Для этой работы мы можем использовать встроенные функции NLTK.

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from string import punctuation

stop_words = set(stopwords.words('english') + list(punctuation))

def preprocess(text):
    tokens = word_tokenize(text.lower())
    tokens = [token for token in tokens if token not in stop_words]
    return " ".join(tokens)
    
processed_sentences = [preprocess(sentence) for sentence in sentences]

Стоп-слова и метки в NLTK загружаются первыми в приведенном выше коде. Затем текст токенизируется, стоп-слова и знаки препинания удаляются, а функция preprocess() возвращает обработанный текст в виде строки. Затем обработанные предложения сохраняются в списке обработанных предложений после того, как каждое предложение в списке предложений было подвергнуто функции preprocess().

Хотите узнать, как работает Comet? Посмотрите наш сценарий PetCam, чтобы увидеть MLOps в действии.

Создайте частоты слов

Второй этап заключается в создании словаря частот слов каждого предложения. Для этого мы можем использовать метод FreqDist() NLTK.

from nltk.probability import FreqDist

word_frequencies = {}

for sentence in processed_sentences:
    for word in word_tokenize(sentence):
        if word not in word_frequencies:
            word_frequencies[word] = 1
        else:
            word_frequencies[word] += 1
            
maximum_frequency = max(word_frequencies.values())

for word in word_frequencies.keys():
    word_frequencies[word] = (word_frequencies[word]/maximum_frequency)

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

Подсчет баллов за предложения

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

sentence_scores = {}

for sentence in processed_sentences:
    for word in word_tokenize(sentence):
        if sentence not in sentence_scores:
            sentence_scores[sentence] = word_frequencies[word]
        else:
            sentence_scores[sentence] += word_frequencies[word]

Вышеприведенный код генерирует словарь под названием «Оценка предложения», в котором хранится значение каждого предложения. Мы обновляем число для каждого предложения в словаре sent_scores, перебирая в цикле каждое предложение и каждое слово в каждом предложении_scores.

Выберите лучшие предложения

Чтобы сделать краткое изложение текста, мы можем выбрать n лучших предложений с наибольшим количеством баллов. Мы выберем пять лучших предложений для этого примера.

import heapq

summary_sentences = heapq.nlargest(5, sentence_scores, key=sentence_scores.get)

summary = " ".join(summary_sentences)
print(summary)

Лучшие 5 предложений с наивысшими баллами выбираются с помощью функции heapq.nlargest() в приведенном выше коде. Окончательное резюме получается путем объединения этих предложений.

Проверка средства суммирования текста

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

text = """
World number one Novak Djokovic said he will compete at the Miami Open after skipping the tournament last year due to the COVID-19 pandemic.
The 33-year-old Serbian has been in top form this year, winning the Australian Open for the ninth time and reaching the final of the ATP Cup.
"I'm very excited to confirm my participation at Miami Open this year," Djokovic, who has won the Miami tournament six times, said on Twitter.
"It's been a while since I played in Miami and I can't wait to be back in front of the fans," he added.
The tournament, which features both men's and women's events, runs from March 22 to April 4.
"""

processed_text = preprocess(text)

sentences = sent_tokenize(text)
processed_sentences = [preprocess(sentence) for sentence in sentences]

word_frequencies = {}
for sentence in processed_sentences:
    for word in word_tokenize(sentence):
        if word not in word_frequencies:
            word_frequencies[word] = 1
        else:
            word_frequencies[word] += 1
            
maximum_frequency = max(word_frequencies.values())

for word in word_frequencies.keys():
    word_frequencies[word] = (word_frequencies[word]/maximum_frequency)
    
sentence_scores = {}
for sentence in processed_sentences:
    for word in word_tokenize(sentence):
        if sentence not in sentence_scores:
            sentence_scores[sentence] = word_frequencies[word]
        else:
            sentence_scores[sentence] += word_frequencies[word]
            
summary_sentences = heapq.nlargest(2, sentence_scores, key=sentence_scores.get)
summary = " ".join(summary_sentences)

print(summary)

Выход:

"I'm very excited to confirm my participation at Miami Open this year," Djokovic, who has won the Miami tournament six times, said on Twitter. The tournament, which features both men's and women's events, runs from March 22 to April 4.

Выбрав самые важные фразы из новостной статьи, наш составитель сводных данных эффективно подготовил резюме. Изменяя количество, передаваемое в heapq.nlargest, мы можем изменить количество предложений, которые мы хотим включить в наше резюме ().

Заключение

Подводя итог, можно сказать, что NLTK предлагает обширный набор инструментов для обработки естественного языка, и, используя эти инструменты, мы можем использовать Python для создания средства суммирования текста. Показанный выше метод является лишь одним из многих, которые можно использовать, и вы можете изменить его в соответствии со своими требованиями. Резюме текста может быть полезно в различных ситуациях, в том числе при обобщении новостей, научных статей и юридических документов. Мы можем ускорить поиск информации и сэкономить время, автоматизировав процесс обобщения.

Примечание редактора. Heartbeat — это интернет-издание и сообщество, созданное участниками и посвященное предоставлению лучших образовательных ресурсов для специалистов по науке о данных, машинному обучению и глубокому обучению. Мы стремимся поддерживать и вдохновлять разработчиков и инженеров из всех слоев общества.

Независимая от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и командам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим нашим авторам и не продаем рекламу.

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение нашего еженедельного информационного бюллетеня (Еженедельник глубокого обучения), заглянуть в блог Comet, присоединиться к нам в Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и многое другое, что поможет вам быстрее создавать лучшие модели машинного обучения.