Что найти?

Библиотека NLTK в Python

/
/

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

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

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

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

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

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

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

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

Как преобразовать абзацы в предложения?

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

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

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

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

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

Токенизация предложений

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

['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']

Как найти взвешенную частоту?

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

Слово Частота Взвешенная частота
ease 2 0.40
eight 1 0.20
fall 1 0.20
get 1 0.20
give 1 0.20
greater 2 0.40
growing 1 0.20
hardship 2 0.40
keep 5 1.00
learning 1 0.20
moving 1 0.20
never 1 0.20
progress 2 0.40
see 1 0.20
seven 1 0.20
striving 1 0.20
threat 2 0.40
time 1 0.20
work 1 0.20
working 1 0.20

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

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

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

Выражение Сумма взвешенных частот
So, keep working 1 + 0.20 = 1.20
Keep striving 1 + 0.20 = 1.20
Never give up 0.20 + 0.20 = 0.40
Fall down seven times, get up eight 0.20 + 0.20 + 0.20 + 0.20 + 0.20 = 1.0
Ease is a greater threat to progress than hardship 0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0
Ease is a greater threat to progress than hardship 0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0
So, keep moving, keep growing, keep learning 1 + 0.20 + 1 + 0.20 + 1 + 0.20 = 3.60
See you at work 0.20 + 0.20 = 0.40

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

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

So, keep moving, keep growing, keep learning

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

So, keep moving, keep growing, keep learning. Ease is a greater threat to progress than hardship.

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

Обобщение статей

Теперь мы знаем, как работает процесс реферирования текста с помощью очень простой техники НЛП. В этом разделе мы будем использовать библиотеку 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 для очистки данных. Затем нам нужно вызвать функцию чтения для объекта, возвращаемого функцией urlopen, чтобы прочитать данные. Для анализа данных мы используем объект BeautifulSoup и передаем ему очищенный объект данных, то есть статью и парсер lxml.

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

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

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

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

# 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.

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

На этом этапе мы предварительно обработали данные. Затем нам нужно разделить статью на предложения. Мы будем использовать объект rticle_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 в переменную стоп-слов. Затем мы перебираем все предложения, а затем соответствующие слова, чтобы сначала проверить, являются ли они стоп-словами.

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

Затем мы проверяем, существует ли слово в словаре word_frequencies. Эта проверка выполняется, так как мы создали список proposition_list из объекта article_text. С другой стороны, частота слов рассчитывалась с использованием объекта formatted_article_text, который не содержит стоп-слов, чисел и т. д.

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

Затем мы проверяем, существует ли предложение в словаре phrase_scores или нет. Если предложение не существует, мы добавляем его в словарь фразеологизмов в качестве ключа и присваиваем ему взвешенную частоту первого слова в предложении в качестве его значения. Напротив, если предложение существует в словаре, мы просто добавляем взвешенную частоту слова к существующему значению.

Получение резюме

Теперь у нас есть словарь proposition_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-х годов стал возможен доступ к цифровым компьютерам, исследования ИИ начали изучать возможность того, что человеческий интеллект можно свести к манипулированию символами. Одно из предложений по решению этой проблемы — сделать так, чтобы первым в целом интеллектуальным ИИ был «Дружественный ИИ», а затем он мог управлять ИИ, создаваемыми впоследствии.

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

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

Заключение

В этой статье объясняется процесс реферирования текста с помощью библиотеки NLTK в Python. В статье также кратко описан процесс парсинга статей с использованием библиотеки BeautifulSoap.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

This div height required for enabling the sticky sidebar