Como sumarizar textos usando Python

Como sumarizar textos usando Python

Nesse artigo você vai aprender como sumarizar textos em python, para isso você vai precisar de um ambiente completamente configurado e funcional, conhecimento na linguagem e também alguma familiaridade com os conceitos de Processamento de linguagem natural.

Uma das funções do Processamento de Linguagem Natural é realizar a sumarização automática de textos utilizando algum critério de relevância. É claro que a sumarização automática de textos é uma função bastante genérica e pode ser empregada em qualquer contexto.
 
Imagine que você têm 500 textos de 10 páginas para realizar a leitura. No entanto, você não tem certeza se determinado texto está dentro do escopo que você precisa abordar na pesquisa. É possível que a realização de uma sumarização automática forneça um texto mais compacto e possa agilizar no processo de seleção dos melhores candidatos a serem lidos na íntegra.
 
O exemplo supracitado é na verdade apenas uma aplicação de muitas outras que a sumarização pode beneficiar. Nesta seção iremos implementar um exemplo de sumarização feito em python. É claro que devemos salientar que essa área é bastante grande e existem diversas técnicas para realizar a sumarização.
 

Resumo da abordagem

 
Esta abordagem utilizará como fonte de dados a Wikipedia. Esse repositório muito conhecido possui “toneladas” de texto e podem ser utilizados gratuitamente. A seguir, um breve passo a passo da abordagem:
 
 
Obtendo dados da Web – como obter dados de um artigo da wikipedia utilizando o python
Parse usando Soup – realizando a conversão do formato soup para texto plano
Tokenização de texto em sentenças – processando o texto utilizando o NLTK
Construindo um histograma  – construindo a estrutura para realizar a avaliação dos parágrafos.
Calculando a pontuação – calculando a pontuação com base na relevância de cada parágrafo
 
Obtendo o resumo – selecionando os melhores parágrafos.

O primeiro passo para construirmos nossa aplicação é importar as bibliotecas necessárias para obter os dados que serão sumarizados e realizar ainda o pré-processamento do texto.

import bs4 as bs
import urllib.request
import re
import nltk
import heapq

bs4  – biblioteca é utilizada para lidar com o protocolo SOUP (XML) dentro do Python. 
urllib.request – biblioteca para realizar um request utilizando o Python.
re – biblioteca que interpreta expressões regulares
nltk – biblioteca python para Processamento de Linguagem Natural
heapq – biblioteca para ordenação de arrays.

A seguir utilizaremos um link qualquer da wikipedia e faremos um request para “pegarmos” estes dados:

Usamos esse link

# pegando dados da wikipedia

source = urllib.request.urlopen("https://en.wikipedia.org/wiki/France").read()

A biblioteca BeaultifulSoup torna possível localizar um elemento dentro do arquivo e concatena-lo em uma só string.

 soup = bs.BeautifulSoup(source,‘lxml’)

text = ""

for paragraph in soup.find_all('p'):
text += paragraph.text

O pré-processamento deverá ocorrer removendo números, espaços extras e toda sequência de caracteres que não serão utilizados. 

 # preprocessing the text

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

clean_text = text.lower()
clean_text = re.sub(r'W', ' ', clean_text)
clean_text = re.sub(r'd', ' ', clean_text)
clean_text = re.sub(r's+', ' ', clean_text)

sentences = nltk.sent_tokenize(text)

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

O próximo passo é utilizar os dados pré-processados para separar o texto em sentenças (ps: lembrar de não remover a pontuação no pré-processamento). Os dados obtidos serão submetidos a uma contagem da frequência das palavras e posteriormente a frequência será convertida em porcentagem utilizando a maior frequência possível como parâmetro.

 word2count = {}
 for word in nltk.word_tokenize(clean_text):
   if word not in stop_words:
      if word not in word2count.keys():
         word2count[word] = 1 
      else:
         word2count[word] += 1 #conta a frequência das palavras 
         for key in word2count.keys(): 
            word2count[key] = word2count[key] /max(word2count.values()) #transforma em porcentagem

O próximo passo é realizar a pontuação das frases utilizando um critério. O critério utilizado é se a frase analisada possui as palavras do histograma criado.

sent2score = {}

for sentence in sentences:
for word in nltk.word_tokenize(sentence.lower()):
if word in word2count.keys():
if len(sentence.split(' ')) < 30:
if sentence not in sent2score.keys():
sent2score[sentence] = word2count[word]
else:
sent2score[sentence] += word2count[word]

As sentenças com o Score mais alto serão selecionadas utilizando a ordenação:

best_sentences = heapq.nlargest(10, sent2score,key=sent2score.get)

print("-------------------------------------------------------------n")
for sentence in best_sentences:
print(sentence)

Considerações importantes

É claro que essa forma de sumarizar textos em python e construir resumos automáticos não é absoluta e não gera resultados perfeitos. Existem diversas outras abordagens interessantes que merecem atenção em diversos artigos publicados na área .

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Deixe uma resposta