Introdução
O resumo de texto é uma daquelas aplicações de processamento de linguagem natural (PNL) isso certamente terá um grande impacto em nossas vidas. Com a crescente mídia digital e publicações em constante crescimento, Quem tem tempo para revisar artigos / documentos / livros completos para decidir se são úteis ou não? Felizmente, esta tecnologia está aqui.
Você já encontrou o aplicativo móvel? Em calções? É um aplicativo de notícias inovador que converte artigos de notícias em um resumo de 60 palavras. E é exatamente isso que aprenderemos neste artigo.: Resumo de texto automático.
O resumo automático de texto é um dos problemas mais desafiadores e interessantes no campo do processamento de linguagem natural. (PNL). É um processo de geração de um resumo de texto conciso e significativo a partir de vários recursos de texto, como livros, novos artigos, postagens no blog, artigos de pesquisa, e-mails e tweets.
A demanda por sistemas de sumarização de texto automatizados está aumentando atualmente, graças à disponibilidade de grandes quantidades de dados textuais.
Através deste artigo, vamos explorar os domínios do resumo do texto. Vamos entender como funciona o algoritmo TextRank e também vamos implementá-lo em Python. Afivele seu cinto de segurança, Esta vai ser uma viagem divertida!
Tabela de conteúdo
- Abordagens de resumo de texto
- Compreendendo o algoritmo TextRank
- Compreendendo a declaração do problema
- Implementação do algoritmo TextRank
- Que segue?
Abordagens de resumo de texto
O resumo automático de texto ganhou atenção já na década de 1950. UMA trabalho de investigação, publicado por Hans Peter Luhn no final dos anos 1990. 1950, titulado “Criação automática de resumos de literatura”, usaram características como frequência de palavras e frequência de frases para extrair frases importantes do texto para fins de resumo.
Outro importante investigar, interpretada por Harold P. Edmundson no final 1960, métodos usados como a presença de palavras-chave, as palavras usadas no título que aparecem no texto e a colocação das frases, para extrair frases significativas para o resumo do texto. Desde então, muitos estudos importantes e interessantes foram publicados para enfrentar o desafio do resumo automático de texto.
TO resumo da extensão pode ser dividido em duas categorias: Resumo extrativo e Resumo abstrato.
- Resumo extrativo: Esses métodos são baseados na extração de várias partes, como frases e sentenças, um pedaço de texto e empilhá-los para criar um resumo. Portanto, Identificar as frases corretas para resumir é de extrema importância em um método extrativo.
- Resumo abstrato: Esses métodos usam técnicas avançadas de PNL para gerar um resumo completamente novo.. Algumas partes deste resumo podem nem mesmo aparecer no texto original.
Neste artigo, vamos nos concentrar no resumo extrativo técnica.
Compreendendo o algoritmo TextRank
Antes de começar com o algoritmo TextRank, há outro algoritmo com o qual devemos nos familiarizar: o algoritmo PageRank. De fato, Este TextRank realmente inspirou! O PageRank é usado principalmente para classificar páginas da web nos resultados de pesquisa online. Vamos entender rapidamente o básico deste algoritmo com a ajuda de um exemplo.
Algoritmo PageRank
Fonte: http://www.scottbot.net/HIAL/
Suponha que temos 4 páginas da web: w1, w2, w3 e w4. Estas páginas contêm links que apontam uns para os outros. Algumas páginas podem não ter links; são chamados de páginas suspensas.
- A página da web w1 possui links para w2 e w4
- w2 tem links para w3 e w1
- w4 tem links apenas para a página w1
- w3 não tem links e, portanto, será chamado de página suspensa
Para classificar essas páginas, teríamos que calcular uma pontuação chamada Pontuação do PageRank. Essa pontuação é a probabilidade de um usuário visitar essa página.
Para capturar as chances de usuários navegando de uma página para outra, vamos criar um quadrado matriz M, que tem n linhas e n colunas, Onde Norte é o número de páginas da web.
Cada elemento desta matriz denota a probabilidade de um usuário ir de uma página da web para outra. Por exemplo, a célula destacada abaixo contém a probabilidade de transição de w1 para w2.
A inicialização das probabilidades é explicada nas etapas a seguir:
- Probabilidade de ir da página i para j, quer dizer, M[ eu ][ j ], é inicializado com 1 / (número de links exclusivos no site wi)
- Se não houver link entre a página i e j, então a probabilidade será inicializada com 0
- Se um usuário foi parar em uma página suspensa, presume-se que a probabilidade de transição para qualquer página é igual. Portanto, M[ eu ][ j ] será inicializado com 1 / (número de páginas da web)
Portanto, no nosso caso, array M será inicializado da seguinte forma:
Finalmente, os valores nesta matriz serão atualizados iterativamente para alcançar as classificações da página da web.
Algoritmo de intervalo de texto
Vamos entender o algoritmo TextRank, agora que conhecemos o PageRank. Listei as semelhanças entre esses dois algoritmos abaixo:
- Em vez de páginas da web, nós usamos sentenças.
- A semelhança entre quaisquer duas sentenças é usada como equivalente à probabilidade de transição da página da web.
- Pontuações de similaridade são armazenadas em uma matriz quadrada, semelhante à matriz M usada para PageRank
TextRank é uma técnica de resumo de texto extrativa e não supervisionada. Vamos dar uma olhada no fluxo do algoritmo TextRank que seguiremos:
- O primeiro passo seria concatenar todo o texto contido nos artigos.
- Em seguida, divida o texto em frases individuais
- Na próxima etapa, vamos encontrar a representação vetorial (palavras embutidas) para cada frase.
- Semelhanças entre vetores de frases são calculadas e armazenadas em uma matriz.
- Mais tarde, a matriz de similaridade é convertida em um gráfico, com sentenças como vértices e pontuações de similaridade como arestas, para calcular a gama de sentenças.
- Finalmente, um certo número de frases melhor classificadas formam o resumo final.
Então, sem mais preâmbulos, Ligue nossos Notebooks Jupyter e vamos começar a programar!!
Observação: Se você quiser aprender mais sobre a teoria dos grafos, Eu recomendo que você verifique isso Artigo.
Compreendendo a declaração do problema
Ser um grande fã de tênis, Eu sempre tento me manter atualizado com o que está acontecendo no esporte, verificando religiosamente o máximo possível de atualizações on-line sobre tênis. Porém, Este é um trabalho bastante difícil!! Existem muitos recursos e o tempo é uma limitação.
Portanto, Decidi projetar um sistema que pudesse preparar um resumo com marcadores, digitalizando vários artigos. Como fazer isso? Isso é o que vou mostrar a vocês neste tutorial. Aplicaremos o algoritmo TextRank em um conjunto de dados de artigos copiados para criar um resumo conciso e agradável.
Observe que esta é essencialmente uma tarefa de resumo de vários documentos de domínio único, quer dizer, pegaremos vários artigos como entrada e geraremos um único resumo com marcadores. O resumo de texto de vários domínios não é abordado neste artigo, mas fique à vontade para tentar no final.
Você pode baixar o conjunto de dados que usaremos em aqui.
Implementação do algoritmo TextRank
Então, sem mais preâmbulos, ligue seus Jupyter Notebooks e vamos implementar o que aprendemos até agora.
Importar bibliotecas necessárias
Primeiro, importar as bibliotecas que vamos aproveitar para este desafio.
importar numpy como np importar pandas como pd importar nltk nltk.download('Apontar') # execução única importar re
Leia os dados
Agora vamos ler nosso conjunto de dados. Eu forneci o link para baixar os dados na seção acima (no caso de você ter perdido).
df = pd.read_csv("tennis_articles_v4.csv")
Inspecione os dados
Vamos dar uma olhada rápida nos dados.
df.head()
Tenho 3 colunas em nosso conjunto de dados: ‘Article_id’, ‘Artigo_texto’ y "fonte". Estamos mais interessados na coluna ‘article_text’ pois contém o texto dos artigos. Vamos imprimir alguns dos valores das variáveis apenas para ver como eles se parecem.
df['artigo_texto'][0]
Produção:
"Maria Sharapova basicamente não tem amigos como tenistas no WTA Tour. O jogador russo não tem problemas em falar abertamente sobre isso e em uma entrevista recente, ela disse: 'Eu realmente não esconda quaisquer sentimentos demais. Eu acho que todo mundo sabe que este é o meu trabalho aqui. Quando estou nas quadras ou quando estou na quadra jogando, Sou um competidor e quero vencer todas as pessoas, seja eles estão no vestiário ou do outro lado da rede ...
df['artigo_texto'][1]
BASEL, Suíça (AP), Roger Federer avançou para a 14ª final suíça dentro de casa de sua carreira ao vencer
sétimo semeado Daniil Medvedev 6-1, 6-4 no sábado. Em busca do nono título no evento de sua cidade natal, e um 99
geral, Federer jogará contra Marius Copil, 93º colocado no domingo. Federer dominated the 20th-ranked Medvedev and had
his first match-point chance to break serve again at 5-1...
df['artigo_texto'][2]
Roger Federer revelou que os organizadores da re-lançada e condensada Copa Davis deram a ele três dias para decidir se ele se comprometeria com a polêmica competição. Falando no torneio Swiss Indoors, onde ele jogar na final de domingo contra o eliminado romeno Marius Copil, o número três do mundo disse que dado o prazo impossivelmente curto para tomar uma decisão, ele desistiu de qualquer compromisso ...
Agora temos 2 opções: podemos resumir cada artigo individualmente ou podemos gerar um único resumo para todos os artigos. Para o nosso propósito, nós iremos em frente com o último.
Divida o texto em frases
Agora, a próxima etapa é dividir o texto em frases individuais. Nós vamos usar o sent_tokenize () função do nltk biblioteca para fazer isso.
from nltk.tokenize import sent_tokenize sentenças = [] para s em df['artigo_texto']: frases.append(sent_tokenize(s)) sentenças = [y para x em sentenças para y em x] # lista plana
Vamos imprimir alguns itens da lista. frases.
frases[:5]
Produção:
['Maria Sharapova basicamente não tem amigos como jogadores de tênis no WTA Tour.', "O jogador russo não tem problemas em falar abertamente sobre isso e em um recente entrevista ela disse: 'Eu realmente não escondo nenhum sentimento muito.", 'Acho que todo mundo sabe que este é o meu trabalho aqui.', "Quando estou nas quadras ou quando estou na quadra jogando, Sou um competidor e quero vencer todas as pessoas, estejam elas no vestiário ou através da rede. Portanto, não sou eu quem puxa conversa sobre o tempo e saber que nos próximos minutos terei que sair e tentar ganhar uma partida de tênis.", "Eu sou uma garota muito competitiva."]
Descarga GloVe Word Embeddings
Luva Os embutidos de palavras são representações vetoriais de palavras. Estas palavras embutidas serão usadas para criar vetores para nossas frases. Também poderíamos ter usado as abordagens Bag-of-Words ou TF-IDF para criar características para nossas frases, mas esses métodos ignoram a ordem das palavras (e o número de recursos geralmente é muito grande).
Usaremos o pré-treinado Wikipedia 2014 + Gigaword 5 Vetores GloVe disponíveis aqui. Perceber: o tamanho dessas palavras embeddings é 822 MB.
!wget http://nlp.stanford.edu/data/glove.6B.zip !unzip glove * .zip
Vamos extrair as palavras ou vetores de palavras incorporados.
# Extraia vetores de palavras word_embeddings = {} f = aberto('glove.6B.100d.txt', codificação = 'utf-8') para a linha em f: valores = linha.split() palavra = valores[0] coefs = por exemplo, asarray(valores[1:], dtype ="float32") word_embeddings[palavra] = coefs f.close()
len(word_embeddings)
400000
Agora temos vetores de palavras para 400.000 termos diferentes armazenados no dicionário: ‘Word_embeddings’.
Pré-processamento de texto
É sempre uma boa prática tornar seus dados textuais livres de ruído, tanto quanto possível. Então, vamos fazer uma limpeza básica de texto.
# remover pontuações, números e caracteres especiais clean_sentences = pd.Series(frases).str.replace("[^ a-zA-Z]", " ") # fazer letras minúsculas clean_sentences = [Mais devagar() para s em clean_sentences]
Elimine palavras vazias (palavras comumente usadas de um idioma: isto é, sou, a, do, no, etc.) presente nas orações. Se você não baixou nltk-stopwords, em seguida, execute a seguinte linha de código:
nltk.download('stopwords')
Agora podemos importar as palavras vazias.
de nltk.corpus import stopwords stop_words = stopwords.words('inglês')
Vamos definir uma função para remover essas palavras irrelevantes de nosso conjunto de dados.
# função para remover stopwords def remove_stopwords(Está): sen_new = " ".Junte([i for i in sen se não for stop_words]) voltar sen_new
# remova palavras irrelevantes das frases clean_sentences = [remove_stopwords(r.split()) para r em clean_sentences]
Usaremos clean_sentences para criar vetores para frases em nossos dados com a ajuda de vetores de palavras GloVe.
Representação vetorial de frases
# Extraia vetores de palavras word_embeddings = {} f = aberto('glove.6B.100d.txt', codificação = 'utf-8') para a linha em f: valores = linha.split() palavra = valores[0] coefs = por exemplo, asarray(valores[1:], dtype ="float32") word_embeddings[palavra] = coefs f.close()
Agora, vamos criar vetores para nossas orações. Vamos primeiro procurar vetores (cada um dos itens de tamanho 100) para as palavras constituintes de uma frase e então tomaremos a média / média desses vetores para chegar a um vetor consolidado para a frase.
sentença_vetores = [] para i em clean_sentences: se len(eu) != 0: v = soma([word_embeddings.get(C, np.zeros((100,))) para w em i.split()])/(len(i.split())+0.001) outro: v = np.zeros((100,)) frase_vetores.append(v)
Observação: Para mais práticas recomendadas para pré-processamento de texto, você pode consultar nosso vídeo-curso, Processamento de linguagem natural (PNL) usando Python.
Preparação da matriz de similaridade
A próxima etapa é encontrar semelhanças entre as frases, e usaremos a abordagem de similaridade de cosseno para este desafio. Vamos criar uma matriz de similaridade vazia para esta tarefa e preencher com similaridades de cosseno das sentenças.
Vamos primeiro definir uma matriz de dimensão zero (n * n). Iremos inicializar esta matriz com pontuações de similaridade de cosseno das sentenças. Aqui, Norte é o número de sentenças.
# matriz de similaridade sim_mat = np.zeros([len(frases), len(frases)])
Usaremos Cosine Similarity para calcular a similaridade entre um par de sentenças.
de sklearn.metrics.pairwise import cosine_similarity
E inicializar a matriz com pontuações de similaridade de cosseno.
para eu no alcance(len(frases)): para j no intervalo(len(frases)): se eu != j: sim_mat[eu][j] = cosine_similarity(sentença_vetores[eu].remodelar(1,100), sentença_vetores[j].remodelar(1,100))[0,0]
Aplicação do algoritmo PageRank
Antes de continuar, converter a matriz de similaridade sim_mat em um gráfico. Os nós deste gráfico irão representar as sentenças e as arestas irão representar as pontuações de similaridade entre as sentenças. Neste gráfico, vamos aplicar o algoritmo PageRank para chegar à classificação das sentenças.
importar networkx como nx nx_graph = nx.from_numpy_array(sim_mat) pontuações = nx.pagerank(nx_graph)
Extração de resumo
Finalmente, é hora de extrair as N frases principais com base em suas classificações para geração de resumo.
ranking_sentências = classificado(((pontuações[eu],s) para eu,s em enumerar(frases)), reverso = verdadeiro)
# Extrair topo 10 frases como o resumo para eu no alcance(10): imprimir(rank_sentences[eu][1])
Quando estou nas quadras ou quando estou na quadra jogando, Sou um competidor e quero vencer todas as pessoas estejam eles no vestiário ou do outro lado da rede. Portanto, não sou eu quem inicia uma conversa sobre o tempo e saber que nos próximos minutos tenho que ir e tentar ganhar uma partida de tênis. Jogadores importantes acham que um grande evento no final de novembro combinado com um em janeiro antes do Aberto da Austrália irá significa muito tênis e pouco descanso. Falando no torneio Swiss Indoors, onde jogará na final de domingo contra o Romeno qualificatório Marius Copil, o número três do mundo disse que, dado o prazo impossivelmente curto para tomar uma decisão, ele optou por sair de qualquer compromisso. "Senti que as melhores semanas que tive para conhecer jogadores quando estava jogando foram as semanas da Fed Cup ou o Semanas olímpicas, não necessariamente durante os torneios. Atualmente em nono lugar, Nishikori com uma vitória poderia se mover para dentro 125 pontos do corte para o evento de oito homens em Londres no próximo mês. Ele usou seu primeiro breakpoint para fechar o primeiro set antes de subir 3-0 no segundo e envolvendo o vitória em seu primeiro match point. O espanhol quebrou Anderson duas vezes no segundo, mas não teve outra chance no saque do sul-africano na conjunto final. "Também tivemos a impressão de que nesta fase talvez seja melhor jogar do que treinar. A competição está definida para apresentar 18 países em novembro 18-24 finais em Madrid no próximo ano, e irá substituir os clássicos jogos em casa e fora disputados quatro vezes por ano durante décadas. Federer disse no início deste mês em Xangai que suas chances de jogar a Copa Davis eram praticamente inexistentes.
E aqui vamos nós! Um resumo incrível, limpo, conciso e útil para nossos artigos.
Que segue?
O resumo automático de texto é um tema quente de pesquisa e, neste artigo, nós apenas cobrimos a ponta do iceberg. No futuro, vamos explorar a técnica de sumarização de texto abstrato, onde a aprendizagem profunda desempenha um papel importante. O que mais, também podemos examinar as seguintes tarefas de resumo:
Específico para o problema
- Resumo de texto de vários domínios
- Resumo de documento único
- Resumo do texto em vários idiomas (fonte em um idioma e resumo em outro idioma)
Algoritmo específico
- Resumo de texto usando RNN e LSTM
- Resumo do texto usando aprendizagem por reforço
- Resumo de texto por meio de redes geradoras de confronto (GAN)
Notas finais
Espero que esta postagem tenha ajudado você a entender o conceito de resumo automático de texto. Ele tem uma variedade de casos de uso e gerou aplicativos extremamente bem-sucedidos. Seja para tirar proveito do seu negócio ou simplesmente para seu próprio conhecimento, o resumo de texto é uma abordagem com a qual todos os entusiastas de PNL devem estar familiarizados.
Tentarei cobrir a técnica de sumarização de texto abstrativo usando técnicas avançadas em um artigo futuro.. Entretanto, sinta-se à vontade para usar a seção de comentários abaixo para me informar sua opinião ou fazer qualquer pergunta que você possa ter sobre este artigo..