Aula 02 - Implementando a sumarização de textos automática



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 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 :)






Aula 02 - Implementando a sumarização de textos automática Aula 02 - Implementando a sumarização de textos automática Reviewed by Vinicius dos Santos on 05:25:00 Rating: 5

Nenhum comentário

Escreve ai sua opinião!