И как создать свой собственный извлекающий текстовый сумматор

Представьте, что вам дали задание из школы или с работы, которое включает в себя БОЛЬШОЕ исследование. Вы тратите всю ночь на измельчение, чтобы получить знания, необходимые для получения высококачественного конечного продукта.

А теперь представьте, что вам дали точно такое же задание, и вы закончили с таким же высококачественным результатом, за исключением того, что на этот раз вы закончили с большим количеством свободного времени!

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

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

В этой статье будет рассказано, что такое НЛП и как вы можете создать свой собственный извлекающий текстовый сумматор! В Части 2 мы рассмотрим создание модели мешка слов для классификации темы статьи, которую вы выбрали для резюмирования. Давай займемся этим!

Что такое обработка естественного языка и чем она может помочь?

Обработка естественного языка - это подраздел в искусственном интеллекте, который занимается компьютерным пониманием человеческих языков. Он включает в себя все, от распознавания речи, распознавания текста и многого другого! Некоторые примеры внедрения этой технологии - Google Assistant от Google, Alexa от Amazon и т. Д.

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

Как создать сумматор экстрактивного текста (Python)

Репозиторий GitHub:

Https://github.com/Vedant-Gupta523/text-summarization-project

Обзор:

  1. Очистить статью из Интернета
  2. Оцените, как часто слова встречаются в тексте
  3. Разделите статью на предложения
  4. Присвойте каждому предложению значение на основе имеющихся в нем слов и частотности этих слов.
  5. Удалите предложения, значения которых не достигают определенного порога.

Получение вашего корпуса текста

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

from bs4 import BeautifulSoup
import requests
#Scrape the url for all paragraphs and create a collective string
result = requests.get(url)
c = result.content
soup = BeautifulSoup(c)
    
article_text = ''
article = soup.findAll('p')
for element in article:
    article_text += '\n' + ''.join(element.findAll(text = True))

Мы начали с импорта модулей BeautifulSoup и requests. Затем мы позволяем пользователю вводить URL-адрес, который он хочет очистить. Запросы принимают URL-адрес, затем мы используем BeautifulSoup для хранения контента. Затем мы используем BeautifulSoup, чтобы найти все элементы абзаца (p) на веб-сайте и сохранить их в «article». Наконец, мы используем цикл for, чтобы просмотреть все найденные нами элементы абзаца и добавить его в article_text, чтобы у нас была одна длинная строка, содержащая статью.

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

Очистка текста

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

import re
#Remove special characters, numbers, stopwords, etc. from the text
article_text = re.sub(r'\[[0-9]*\]', ' ', article_text)  
article_text = re.sub(r'\s+', ' ', article_text)  
    
formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text)  
formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)

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

Создание словаря частот слов

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

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize, sent_tokenize
words = word_tokenize(formatted_article_text) 
stopWords = nltk.corpus.stopwords.words('english')
#Tally word frequencies from the text
freqTable = dict()
for word in words:
    word = word.lower()
    if word in stopWords:
        continue
    if word in freqTable:
        freqTable[word] += 1
    else:
        freqTable[word] = 1

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

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

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

#Break text into sentences then assign values based on word frequencies
sentences = sent_tokenize(article_text)
sentenceValue = dict()
    
for sentence in sentences:
    for word, freq in freqTable.items():
        if word in sentence.lower():
             if sentence in sentenceValue:
                 sentenceValue[sentence] += freq
            else:
                 sentenceValue[sentence] = freq
    
    
sumValues = 0
for sentence in sentenceValue:
    sumValues += sentenceValue[sentence]

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

Удаление неважных предложений

Наконец-то пора убрать ненужные нам предложения, оставив нам окончательное резюме!

# Average value of a sentence from original text
average = int(sumValues / len(sentenceValue))
    
#If a sentence's value exceeds the average * 1.2, include it in the summary
summary = ''
for sentence in sentences:
    if (sentence in sentenceValue) and (sentenceValue[sentence] > (1.2 * average)):
        summary += " " + sentence
            
#Print summary and analytics
print("Original article URL: " + url + "\n")
print(summary + "\n")
print("Original word count: " + str(len(article_text.split())))
print("Summarized word count: " + str(len(summary.split())))
print("Percent reduction: " + str("%.2f" % (100 - len(summary.split()) * 100 / len(article_text.split()))) + "%")
print("Time reduction: " + str("%.0f" % (len(article_text.split()) / 225)) + " minutes to " + str("%.0f" % (len(summary.split()) / 225)) + " minutes")

Мы находим среднее значение предложения, разделив сумму всех значений на количество предложений. Затем мы создаем пустую строку «summary», в которую добавляем каждое предложение, значение которого больше среднего в 1,2 раза. Я обнаружил, что 1.2x работает хорошо, но не стесняйтесь поэкспериментировать с ним, чтобы увидеть, что работает для вас. Теперь у нас есть итоговый текст, хранящийся внутри «резюме»!

В качестве бонуса у меня была программа, выводящая мини-отчет, в котором печатается следующее:

  1. URL исходной статьи
  2. Резюме
  3. Исходное количество слов
  4. Суммарное количество слов
  5. Снижение в процентах
  6. Сокращение времени чтения

Примеры резюме

  1. Статья: https://goo.gl/Qfq8Ah Вывод: https://goo.gl/7RfXgq
  2. Статья: https://goo.gl/AfHLL5 Вывод: https://goo.gl/QqeMXA
  3. Статья: https://goo.gl/gE8rEX Вывод: https://goo.gl/Gfpbjk

Ключевые выводы

Обработка естественного языка добавляет еще один инструмент к текущему арсеналу компьютеров: понимание человеческих языков. Безумие думать обо всех способах, которыми НЛП влияет на нашу жизнь, от простых текстовых сумматоров до Google Duplex, назначающего встречи в парикмахерских. Понимание этой технологии очень важно. Теперь вы знаете, как сделать резюмирующий текст с извлечением текста, и можете рассчитывать на создание пакета классификаторов слов в Части 2!