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.
Resumo da abordagem
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:
# 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 .