Обобщение текста с помощью NLTK в Python

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

Вступление

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

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

Шаги обобщения текста

Я объясню этапы реферирования текста с помощью методов НЛП на примере.

Ниже приводится отрывок из одного из знаменитых выступлений Дензела Вашингтона на 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,40 восемь 1 0,20 Осень 1 0,20 получать 1 0,20 дайте 1 0,20 больше 2 0,40 растущий 1 0,20 невзгоды 2 0,40 хранить 5 1,00 обучение 1 0,20 движущийся 1 0,20 никогда 1 0,20 прогресс 2 0,40 видеть 1 0,20 Семь 1 0,20 стремление 1 0,20 угроза 2 0,40 время 1 0,20 Работа 1 0,20 за работой 1 0,20

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

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

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

Приговор Сумма взвешенных частот


Итак, продолжайте работать 1 + 0,20 = 1,20 Продолжай стремиться 1 + 0,20 = 1,20 Никогда не сдавайся 0,20 + 0,20 = 0,40 Семь раз падай, восемь вставай 0,20 + 0,20 + 0,20 + 0,20 + 0,20 = 1,0 Легкость - большая угроза для прогресса, чем трудности 0,40 + 0,40 + 0,40 + 0,40 + 0,40 = 2,0 Легкость - большая угроза для прогресса, чем трудности 0,40 + 0,40 + 0,40 + 0,40 + 0,40 = 2,0 Итак, продолжайте двигаться, продолжайте расти, продолжайте учиться 1 + 0,20 + 1 + 0,20 + 1 + 0,20 = 3,60 Увидимся на работе 0,20 + 0,20 = 0,40

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

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

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

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

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

Эти два предложения довольно хорошо резюмируют сказанное в абзаце.

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

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

Получение статей из Википедии

Прежде чем мы сможем обобщить статьи Википедии, нам нужно получить их из Интернета. Для этого мы воспользуемся парочкой библиотек. Первая библиотека, которую нам нужно скачать, - это прекрасный суп, который является очень полезной утилитой 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

В статьях Википедии весь текст статьи заключен в теги <p> Чтобы получить текст, нам нужно вызвать 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 библиотеку и вызовите его nlargest функцию , чтобы получить лучшие 7 предложений с самыми высокими баллами.

Итоги вывода выглядят так:

Искусственный интеллект (ИИ), иногда называемый машинным интеллектом,

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

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

Заключение

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

comments powered by Disqus