Machine Learning, NLP

Резюмированние текста NLP

Время прочтения: 4 мин.

Резюмирование текста — это метод NLP (обработка естественного языка), который извлекает текст из большого количества данных. Это помогает в создании более короткой версии имеющегося большого текста, а также:

  • Сокращает время чтения;
  • Помогает улучшить исследовательскую работу;
  • Увеличивает объем информации, который может уместиться в области.

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

 Этапы обработки статьи:

  • Получение данных;
  • Первоначальная обработка текста;
  • Преобразование абзацев;
  • Токенизация (разбиение\разделение на слова) предложений;
  • Вычисление взвешенных частот появления;
  • Замена слов в предложениях взвешенной частотой;
  • Сортировка предложений по убыванию веса;
  • Вывод резюме.

Получение данных для обработки.

Для примера возьмём статью Википедии, которую хотим резюмировать, и получим её URL-адрес. Данные из URL-адреса получаем, используя концепцию веб-скрейпинга. Для обработки WEB-страницы нам необходима библиотека Вeautifuls, применим её для получения данных с WEB-страницы в различных тегах HTML. Для синтаксического анализа HTML-тегов нам потребуется пакет lxml, для обработки текста будем использовать Re, библиотеку регулярных выражений. В “википедийной” статье текст присутствует в тегах <р>, для извлечения такого текста используем функцию find_all.

Код Python для получения данных:

imрort bs4
imрort lxml
imрort requests
imрort re
imрort nltk
nltk.download('stopwоrds')
nltk.download('punkt')
from nltk.tokenize imрort sent_tokenize
from bs4 imрort BeautifulSoup
url = 'https://ru.wikipedia.org/wiki/Искусственный_интеллект’ 
req = requests.get(url) 				
pars_in = BeautifulSoup(req.text,"lxml")	
p_res = pars_in.find_all('p')
in_txt = ""
for ip in p_res:
    in_txt += ip.text

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

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

in_txt = re.sub (r'[[0-9] *]', '', in_txt)
in_txt = re.sub (r's + ',' ', in_txt)

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

red_in_txt = re.sub ('[^ а-яА-Я]', '', in_txt)
red_in_txt = re.sub (r's + ',' ', in_txt)

Здесь red_in_txt содержит отформатированную статью, используем далее red_in_txt для вычисления взвешенных частот и замены их словами в объекте in_txt.

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

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

Токенизируем полученный in_txt, поскольку это нефильтрованные данные, в то время как объект red_in_txt имеет отформатированные данные без знаков препинания:

sentok_txt = sent_tokenize(in_txt, language="russian")

Нахождение взвешенных частот появления.

Stop-слова из библиотеки nltk хранятся в переменной stopwоrds. Stop-слова, это в основном слова, не имеющие сильных значимых коннотаций, например, «и», «а», «это», «они» и т.д. Переберем все предложения и проверим принадлежность слов к Stop-словам. Если слово не является таковым, проверим его наличие в словаре nostop_slov:

from nltk.corpus imрort stopwоrds
stop_slova = stopwоrds.wоrds("russian")
nostop_slov = {}
for wd in nltk.wоrd_tokenize(red_in_txt, language="russian"):
    if wd not in stop_slova:
        if wd not in nostop_slov.keys():
            nostop_slov[wd] = 1
        else:
            nostop_slov[wd] += 1

Получим взвешенную частоту, разделив частоту слова на частоту наиболее встречающегося слова:

max_int = max(nostop_slov.values())
for wd in nostop_slov.keys():
    nostop_slov[wd] = (nostop_slov[wd]/max_int)

Подсчитаем оценки предложения.

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

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

sent_dict = {}
for sd in sentok_txt:
    for wd in nltk.wоrd_tokenize(sd.lower()):
        if wd in nostop_slov.keys():
            if len(sent.split(' ')) < 25:
                if sent not in sent_dict.keys():
                    sent_dict[sd] = nostop_slov[wd]
                else:
                    sent_dict[sd] += nostop_slov[wd]

Покажем несколько значений словаря sent_dict (здесь оригинальный текст заменен на отформатированный):

{‘ИИ связан со сходной задачей использования компьютеров для понимания человеческого интеллекта, но не обязательно ограничивается биологически правдоподобными методами[.’: 1.9097744360902253, ‘Существующие на сегодня интеллектуальные системы имеют достаточно узкие области применения.’: 0.6898496240601504, ‘Например, программы, способные обыграть человека в шахматы, не могут отвечать на вопросы и\xa0т.\xa0д.[.’: 5.103383458646618

Резюме статьи.

Словарь sent_dict состоит из предложений вместе с их оценками. Теперь можно использовать первые предложения для формирования резюме статьи.
Используя библиотеку heapq, берем 5 лучших предложений для резюмирования статьи:

imрort heapq
itog_sent = heapq.nlargest(5, sent_dict, key=sent_dict.get)
itog = ' '.join(itog_sent)
print(itog) 

В итоге получаем:

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

Более того, такие инициативы, как Google Magenta, проводимые командой Google Brain, хотят

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

систему можно сказать, что у неё есть чувства («боль» — реакция на срабатывание датчика удара, «голод» — реакция на низкий заряд аккумулятора, и т. п.). Философы, занимающиеся данной

проблематикой, решают вопросы, схожие с теми, которые решаются инженерами ИИ о том, как

лучше представлять и использовать знания и информацию.

Для получения наиболее оптимальных обобщений можно использовать и методы более высокого глубокого обучения.

Советуем почитать