Рубрики
Без рубрики

Суммирование текста с помощью NLTK в Python

Автор оригинала: Usman Malik.

Суммирование текста с помощью NLTK в Python

Вступление

Когда я пишу эту статью, в Интернете активно работает 1 907 223 370 веб-сайтов и в секунду отправляется 2 722 460 электронных писем. Это невероятно огромный объем данных. Для пользователя невозможно получить представление о таких огромных объемах данных. Кроме того, большая часть этих данных либо избыточна, либо не содержит много полезной информации. Наиболее эффективный способ получить доступ к наиболее важным частям данных без необходимости просеивать избыточные и незначительные данные-это суммировать данные таким образом, чтобы они содержали только не избыточную и полезную информацию. Данные могут быть в любой форме, такой как аудио, видео, изображения и текст. В этой статье мы рассмотрим, как можно использовать методы автоматического суммирования текста для суммирования текстовых данных.

Суммирование текста-это субдомен обработки естественного языка (НЛП), который занимается извлечением резюме из огромных кусков текста. Существует два основных типа техник, используемых для обобщения текста: техники, основанные на НЛП, и техники, основанные на глубоком обучении. В этой статье мы рассмотрим простую технику обобщения текста, основанную на НЛП. В этой статье мы не будем использовать библиотеку машинного обучения. Скорее всего, мы просто будем использовать библиотеку NLTK Python для обобщения статей Википедии.

Этапы Суммирования Текста

Я объясню шаги, связанные с обобщением текста с использованием техник НЛП, на примере.

Ниже приведен абзац из одной из знаменитых речей Дензела Вашингтона на 48-й церемонии вручения премии NAACP Image Awards:

Так что продолжайте работать. Продолжайте стремиться. Никогда не сдавайся. Падай семь раз, вставай восемь. Легкость – это большая угроза прогрессу, чем трудности. Легкость – это большая угроза прогрессу, чем трудности. Так что продолжайте двигаться, продолжайте расти, продолжайте учиться. Увидимся на работе.

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

Преобразование абзацев в предложения

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

  1. Так что продолжайте работать
  2. Продолжайте стремиться
  3. Никогда не сдавайся
  4. Падай семь раз, вставай восемь
  5. Легкость – большая угроза прогрессу, чем трудности
  6. Легкость – большая угроза прогрессу, чем трудности
  7. Так что продолжайте двигаться, продолжайте расти, продолжайте учиться
  8. Увидимся на работе

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

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

  1. продолжайте работать
  2. продолжайте стремиться
  3. никогда не давать
  4. падай семь раз получай восемь
  5. облегчение большая угроза прогресс трудности
  6. облегчение большая угроза прогресс трудности
  7. продолжайте двигаться продолжайте расти продолжайте учиться
  8. см. работу

Маркировка предложений

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

['keep',
 'working',
 'keep',
 'striving',
 'never',
 'give',
 'fall',
 'seven',
 'time',
 'get',
 'eight',
 'ease',
 'greater',
 'threat',
 'progress',
 'hardship',
 'ease',
 'greater',
 'threat',
 'progress',
 'hardship',
 'keep',
 'moving',
 'keep',
 'growing',
 'keep',
 'learning',
 'see',
 'work']

Найти Взвешенную частоту встречаемости

Далее нам нужно найти взвешенную частоту встречаемости всех слов. Мы можем найти взвешенную частоту каждого слова, разделив его частоту на частоту наиболее встречающегося слова. В следующей таблице приведены взвешенные частоты для каждого слова:

легкость 2 0.4
восемь 1 0.2
падать 1 0.2
получить 1 0.2
дать 1 0.2
более значительный 2 0.4
растущий 1 0.2
трудность 2 0.4
держать 5 1.0
познающий 1 0.2
движущийся 1 0.2
никогда 1 0.2
прогресс 2 0.4
видеть 1 0.2
семь 1 0.2
устремление 1 0.2
угроза 2 0.4
время 1 0.2
работа 1 0.2
работающий 1 0.2

Поскольку слово “держать” имеет самую высокую частоту 5, следовательно, взвешенная частота всех слов была рассчитана путем деления их числа встречаемости на 5.

Замените слова взвешенной частотой в исходных предложениях

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

Так что продолжайте работать 1 +.20
Продолжайте стремиться 1 +.20
Никогда не сдавайся 0.20 +.40
Падай семь раз, вставай восемь 0.20 + 0.20 + 0.20 + 0.20 +.0
Легкость – большая угроза прогрессу, чем трудности 0.40 + 0.40 + 0.40 + 0.40 +.0
Легкость – большая угроза прогрессу, чем трудности 0.40 + 0.40 + 0.40 + 0.40 +.0
Так что продолжайте двигаться, продолжайте расти, продолжайте учиться 1 + 0.20 + 1 + 0.20 + 1 +.60
Увидимся на работе 0.20 +.40

Короткие предложения в порядке убывания суммы

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

Так что продолжайте двигаться, продолжайте расти, продолжайте учиться

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

Так что продолжайте двигаться, продолжайте расти, продолжайте учиться. Легкость – это большая угроза прогрессу, чем трудности.

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

Обобщение статей Википедии

Теперь мы знаем, как работает процесс обобщения текста с помощью очень простой техники НЛП. В этом разделе мы будем использовать библиотеку NLTK Python для обобщения статьи Википедии.

Извлечение статей из Википедии

Прежде чем мы сможем обобщить статьи Википедии, нам нужно извлечь их из Интернета. Для этого мы воспользуемся несколькими библиотеками. Первая библиотека, которую нам нужно скачать, – это beautiful soup , которая является очень полезной утилитой Python для веб-скрейпинга. Выполните следующую команду в командной строке, чтобы загрузить утилиту Beautiful Soup.

$ pip install beautifulsoup4

Еще одна важная библиотека, которая нам нужна для анализа XML и HTML, – это библиотека lxml . Выполните следующую команду в командной строке, чтобы загрузить lxml :

$ pip install lxml

Теперь давайте немного кода Python для очистки данных из Интернета. Статья, которую мы собираемся наскрести, – это статья Википедии об Искусственном интеллекте . Выполните следующий сценарий:

import bs4 as bs
import urllib.request
import re

scraped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')
article = scraped_data.read()

parsed_article = bs.BeautifulSoup(article,'lxml')

paragraphs = parsed_article.find_all('p')

article_text = ""

for p in paragraphs:
    article_text += p.text

В приведенном выше сценарии мы сначала импортируем важные библиотеки, необходимые для очистки данных из Интернета. Затем мы используем функцию urlopen из утилиты urllib.request для очистки данных. Далее нам нужно вызвать функцию read для объекта, возвращаемого функцией urlopen , чтобы прочитать данные. Для анализа данных мы используем объект BeautifulSoup и передаем ему очищенный объект данных, т. е. article и парсер lxml .

В статьях Википедии весь текст статьи заключен в теги . Чтобы получить текст, нам нужно вызвать функцию find_all для объекта, возвращаемого функцией BeautifulSoup . Имя тега передается в качестве параметра функции. Функция find_all возвращает все абзацы статьи в виде списка. Все абзацы были объединены, чтобы воссоздать статью.

Как только статья будет очищена, нам нужно будет сделать некоторую предварительную обработку.

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

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

# Removing Square Brackets and Extra Spaces
article_text = re.sub(r'\[[0-9]*\]', ' ', article_text)
article_text = re.sub(r'\s+', ' ', article_text)

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

Чтобы очистить текст и вычислить взвешенные частоты, мы создадим еще один объект. Взгляните на следующий сценарий:

# Removing special characters and digits
formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text )
formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)

Теперь у нас есть два объекта article_text , который содержит исходную статью, и formatted_article_text , который содержит отформатированную статью. Мы будем использовать formatted_article_text для создания гистограмм взвешенных частот для слов и заменим эти взвешенные частоты словами в объекте article_text .

Преобразование Текста В Предложения

На данный момент мы предварительно обработали данные. Далее нам нужно разделить статью на предложения. Мы будем использовать объект article_text для токенизации статьи в предложение, поскольку она содержит полные остановки. formatted_article_text не содержит знаков препинания и поэтому не может быть преобразован в предложения с использованием полной остановки в качестве параметра.

Следующий скрипт выполняет токенизацию предложений:

sentence_list = nltk.sent_tokenize(article_text)

Найти Взвешенную частоту встречаемости

Чтобы найти частоту встречаемости каждого слова, мы используем переменную formatted_article_text . Мы использовали эту переменную для определения частоты встречаемости, поскольку она не содержит знаков препинания, цифр или других специальных символов. Взгляните на следующий сценарий:

stopwords = nltk.corpus.stopwords.words('english')

word_frequencies = {}
for word in nltk.word_tokenize(formatted_article_text):
    if word not in stopwords:
        if word not in word_frequencies.keys():
            word_frequencies[word] = 1
        else:
            word_frequencies[word] += 1

В приведенном выше сценарии мы сначала сохраняем все английские стоп-слова из библиотеки nltk в переменную stopwords . Затем мы перебираем все предложения, а затем соответствующие слова, чтобы сначала проверить, являются ли они стоп-словами. Если нет, то мы переходим к проверке того , существуют ли слова в словаре word_frequency , то есть word_frequencies , или нет. Если слово встречается впервые, оно добавляется в словарь в качестве ключа и его значение устанавливается равным 1. В противном случае, если слово ранее существовало в словаре, его значение просто обновляется на 1.

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

maximum_frequncy = max(word_frequencies.values())

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

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

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

sentence_scores = {}
for sent in sentence_list:
    for word in nltk.word_tokenize(sent.lower()):
        if word in word_frequencies.keys():
            if len(sent.split(' ')) < 30:
                if sent not in sentence_scores.keys():
                    sentence_scores[sent] = word_frequencies[word]
                else:
                    sentence_scores[sent] += word_frequencies[word]

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

Затем мы проверяем, существует ли это слово в словаре word_frequencies . Эта проверка выполняется с тех пор, как мы создали список sentence_list из объекта article_text ; с другой стороны, частоты слов были вычислены с помощью объекта formatted_article_text , который не содержит стоп-слов, цифр и т. Д.

Нам не нужны очень длинные предложения в резюме, поэтому мы рассчитываем балл только для предложений с менее чем 30 словами (хотя вы можете настроить этот параметр для своего собственного варианта использования). Затем мы проверяем, существует ли предложение в словаре sentence_scores или нет. Если предложение не существует, мы добавляем его в словарь sentence_scores в качестве ключа и присваиваем ему взвешенную частоту первого слова в предложении в качестве его значения. Напротив, если предложение существует в словаре, мы просто добавляем взвешенную частоту слова к существующему значению.

Получение сводки

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

import heapq
summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)

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

В приведенном выше сценарии мы используем библиотеку heapq и вызываем ее функцию largest , чтобы получить 7 лучших предложений с самыми высокими баллами.

Итоговая сводка выглядит следующим образом:

Искусственный интеллект (ИИ), иногда называемый машинным интеллектом, – это интеллект, демонстрируемый машинами, в отличие от естественного интеллекта, демонстрируемого людьми и другими животными. В ИИ используется множество инструментов, включая варианты поиска и математической оптимизации, искусственные нейронные сети и методы, основанные на статистике, вероятности и экономике. Традиционные проблемы (или цели) исследования ИИ включают в себя рассуждение, представление знаний, планирование, обучение, обработку естественного языка, восприятие и способность перемещать объекты и манипулировать ими. Когда в середине 1950-х годов стал возможен доступ к цифровым компьютерам, исследователи ИИ начали изучать возможность того, что человеческий интеллект может быть сведен к манипулированию символами. Одно из предложений, чтобы справиться с этим, состоит в том, чтобы гарантировать, что первый в целом интеллектуальный ИИ является “дружественным ИИ”, а затем сможет контролировать впоследствии разработанные ИИ. В настоящее время подавляющее большинство современных исследователей ИИ работают вместо этого над сговорчивыми “узкими

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

Вывод

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