Riepilogo automatico del testo utilizzando l'algoritmo TextRank

Contenuti

introduzione

Il riepilogo del testo è una di quelle applicazioni dell'elaborazione del linguaggio naturale (PNL) che avrà sicuramente un grande impatto sulle nostre vite. Con i media digitali in crescita e le pubblicazioni in costante crescita, Chi ha tempo per rivedere gli articoli / documenti / libri completi per decidere se sono utili o meno? fortunatamente, questa tecnologia è qui.

Ti sei imbattuto nell'app mobile?? in pantaloncini? È un'applicazione di notizie innovativa che converte gli articoli di notizie in un riepilogo di 60 parole. Ed è proprio quello che impareremo in questo articolo.: Riepilogo testo automatico.

pantaloncini-2246262

Il riepilogo automatico del testo è uno dei problemi più impegnativi e interessanti nel campo dell'elaborazione del linguaggio naturale. (PNL). È un processo di generazione di un riepilogo di testo conciso e significativo da più risorse di testo, come i libri, articoli di notizie, i post del blog, articoli di ricerca, e-mail e tweet.

La domanda di sistemi di sintesi del testo automatizzati è in aumento in questi giorni grazie alla disponibilità di grandi quantità di dati testuali.

Attraverso questo articolo, esploreremo i domini del testo sommario. Capiremo come funziona l'algoritmo TextRank e lo implementeremo anche in Python. Allaccia la tua cintura di sicurezza, Sarà un viaggio divertente!

Sommario

  1. Approcci di sintesi del testo
  2. Comprendere l'algoritmo TextRank
  3. Comprendere l'affermazione del problema
  4. Implementazione dell'algoritmo TextRank
  5. Qual è il prossimo?

Approcci di sintesi del testo

immagine_1-2831872

Il riepilogo automatico del testo ha attirato l'attenzione già nel decennio del 1950. UN lavoro di ricerca, pubblicato da Hans Peter Luhn alla fine degli anni '90. 1950, intitolato “Creazione automatica di abstract di letteratura”, ha utilizzato caratteristiche come la frequenza delle parole e la frequenza delle frasi per estrarre frasi importanti dal testo a fini di sintesi.

Altro importante indagare, interpretato da Harold P. Edmundson alla fine 1960, metodi usati come la presenza di parole chiave, le parole usate nel titolo che compaiono nel testo e la disposizione delle frasi, estrarre frasi significative per il riepilogo del testo. Da allora, sono stati pubblicati molti studi importanti ed entusiasmanti per affrontare la sfida del riepilogo automatico del testo.

TIl riepilogo dell'estensione può essere suddiviso in due categorie: Riepilogo estrattivo e Astratto astratto.

  1. Riepilogo estrattivo: Questi metodi si basano sull'estrazione di più parti, come frasi e frasi, un pezzo di testo e impilali per creare un riassunto. Perciò, Identificare le frasi corrette da riassumere è della massima importanza in un metodo estrattivo.
  2. Astratto astratto: Questi metodi utilizzano tecniche avanzate di PNL per generare un riassunto completamente nuovo.. Alcune parti di questo sommario potrebbero non apparire nemmeno nel testo originale.

In questo articolo, ci concentreremo sul riassunto estrattivo tecnica.

Comprendere l'algoritmo TextRank

Prima di iniziare con l'algoritmo TextRank, c'è un altro algoritmo con cui dovremmo familiarizzare: l'algoritmo PageRank. Infatti, Questo TextRank davvero ispirato! PageRank viene utilizzato principalmente per classificare le pagine Web nei risultati di ricerca online. Capiamo rapidamente le basi di questo algoritmo con l'aiuto di un esempio.

Algoritmo PageRank

pagerank11-8257511

Fonte: http://www.scottbot.net/HIAL/

Supponiamo di avere 4 siti web: w1, w2, w3 e w4. Queste pagine contengono collegamenti che puntano a vicenda. Alcune pagine potrebbero non avere alcun collegamento; si chiamano pagine sospese.

pagine web-8826241

  • La pagina web w1 ha collegamenti a w2 e w4
  • w2 ha collegamenti per w3 e w1
  • w4 ha collegamenti solo per la pagina web w1
  • w3 non ha collegamenti e, così, si chiamerà pagina sospesa

Per classificare queste pagine, dovremmo calcolare un punteggio chiamato Punteggio PageRank. Questo punteggio è la probabilità che un utente visiti quella pagina.

Per catturare le probabilità che gli utenti navighino da una pagina all'altra, creeremo un quadrato matrice M, che ha n righe e n colonne, dove Nord è il numero di pagine web.

m_matrix-5295882

Ogni elemento di questa matrice denota la probabilità che un utente passi da una pagina web all'altra. Ad esempio, la cella evidenziata sotto contiene la probabilità di transizione da w1 a w2.

transizione_probabilità-2705698

L'inizializzazione delle quote è spiegata nei seguenti passaggi:

  1. Probabilità di passare dalla pagina i alla j, vale a dire, m[ io ][ J ], è inizializzato con 1 / (numero di link univoci sul sito web wi)
  2. Se non c'è alcun collegamento tra la pagina i e j, allora la probabilità sarà inizializzata con 0
  3. Se un utente è atterrato su una pagina sospesa, si presume che abbia la stessa probabilità di passare a qualsiasi pagina. Perciò, m[ io ][ J ] sarà inizializzato con 1 / (numero di pagine web)

Perciò, nel nostro caso, l'array M verrà inizializzato come segue:

final_matrix-3250029

Finalmente, i valori in questo array verranno aggiornati in modo iterativo per raggiungere le classifiche della pagina web.

Algoritmo dell'intervallo di testo

Comprendiamo l'algoritmo TextRank, ora che conosciamo il PageRank. Ho elencato le somiglianze tra questi due algoritmi di seguito:

  • Invece di pagine web, usiamo frasi.
  • La somiglianza tra due frasi qualsiasi è usata come equivalente alla probabilità di transizione della pagina web.
  • I punteggi di somiglianza sono memorizzati in una matrice quadrata, simile alla matrice M usata per PageRank

TextRank è una tecnica di sintesi del testo estrattiva e non supervisionata. Diamo un'occhiata al flusso dell'algoritmo TextRank che seguiremo:

block_3-5794578

  • Il primo passo sarebbe concatenare tutto il testo contenuto negli articoli.
  • Quindi dividere il testo in singole frasi
  • Nel prossimo passo, troveremo la rappresentazione vettoriale (intarsi di parole) per ogni frase.
  • Le somiglianze tra i vettori di frase vengono calcolate e memorizzate in una matrice.
  • Dopo, la matrice di somiglianza viene convertita in un grafico, con frasi come vertici e punteggi di somiglianza come bordi, per calcolare l'intervallo di frasi.
  • Finalmente, un certo numero di frasi meglio classificate formano il riassunto finale.

Quindi, senza più preamboli, Accendi i nostri taccuini Jupyter e iniziamo a programmare!!

Nota: Se vuoi saperne di più sulla teoria dei grafi, Ti consiglio di controllare questo Articolo.

Comprendere l'affermazione del problema

Essere un grande appassionato di tennis, Cerco sempre di tenermi aggiornato su ciò che sta accadendo in questo sport controllando religiosamente il maggior numero possibile di aggiornamenti sul tennis online. tuttavia, Questo si è rivelato un lavoro piuttosto difficile!! Ci sono troppe risorse e il tempo è un limite.

Perciò, Ho deciso di progettare un sistema che potesse prepararmi un riepilogo puntato scansionando più articoli. Come fare questo? Questo è quello che ti mostrerò in questo tutorial. Applicheremo l'algoritmo TextRank su un set di dati di articoli raschiati per creare un riassunto carino e conciso.

t_collage-2875834

Nota che questo è essenzialmente un singolo dominio, attività di riepilogo multi-documento, vale a dire, prenderemo più articoli come input e genereremo un singolo riepilogo puntato. Il riepilogo del testo multidominio non è trattato in questo articolo, ma sentiti libero di provarlo alla fine.

Puoi scaricare il set di dati che utilizzeremo da qui.

Implementazione dell'algoritmo TextRank

Quindi, senza più preamboli, accendi i tuoi notebook Jupyter e implementiamo ciò che abbiamo imparato finora.

Importa le librerie richieste

Primo, importare le librerie che sfrutteremo per questa sfida.

importa numpy come np
importa panda come pd
import nltk
nltk.download('Punto') # esecuzione una tantum
importare re

Leggi i dati

Ora leggiamo il nostro set di dati. Ho fornito il link per scaricare i dati nella sezione sopra (nel caso te lo fossi perso).

df = pd.read_csv("tennis_articles_v4.csv")

Ispeziona i dati

Diamo una rapida occhiata ai dati.

df.head()

testa_1-6168465
Ho 3 colonne nel nostro set di dati: 'id_articolo', "testo_articolo"’ y "fonte". Siamo più interessati alla colonna "testo_articolo"’ in quanto contiene il testo degli articoli. Imprimamos algunos de los valores de la variabile solo para ver cómo se ven.

df['testo_articolo'][0]

Produzione:

"Maria Sharapova non ha praticamente amici come tenniste nel WTA Tour. Il giocatore russo
non ha problemi a parlarne apertamente e in una recente intervista ha detto: 'Io non davvero
nascondi troppo i sentimenti. Penso che tutti sappiano che questo è il mio lavoro qui. Quando sono in campo
o quando sono in campo a giocare, Sono un concorrente e voglio battere ogni singola persona se
sono negli spogliatoi o dall'altra parte della rete...
df['testo_articolo'][1]
BASILEA, Svizzera (AP), Roger Federer è arrivato alla 14a finale di Swiss Indoors della sua carriera battendo
Daniil Medvedev, settimo seme 6-1, 6-4 di sabato. Alla ricerca del nono titolo all'evento della sua città natale, e un 99°
globale, Federer will play 93th-ranked Marius Copil on Sunday. Federer dominated the 20th-ranked Medvedev and had 
his first match-point chance to break serve again at 5-1...
df['testo_articolo'][2]
Roger Federer ha rivelato che gli organizzatori della rilanciata e condensata Coppa Davis gli hanno concesso tre giorni per
decidere se si sarebbe impegnato nella controversa competizione. Parlando al torneo Swiss Indoors dove lo farà
gioca la finale di domenica contro il qualificato rumeno Marius Copil, il numero tre del mondo ha detto che dato il
lasso di tempo incredibilmente breve per prendere una decisione, ha rinunciato a qualsiasi impegno...

Ora abbiamo 2 opzioni: possiamo riassumere ogni articolo singolarmente o possiamo generare un unico riassunto per tutti gli articoli. Per il nostro scopo, andremo avanti con quest'ultimo.

Dividi il testo in frasi

Ora il prossimo passo è dividere il testo in singole frasi. Useremo il send_tokenize () funzione di nltk libreria per farlo.

da nltk.tokenize import sent_tokenize
frasi = []
per s in df['testo_articolo']:
  frasi.append(send_tokenize(S))

frasi = [y per x nelle frasi per y in x] # appiattire la lista

Stampiamo alcuni elementi dalla lista. frasi.

frasi[:5]

Produzione:

['Maria Sharapova non ha praticamente amici come tenniste nel WTA Tour.',
"Il giocatore russo non ha problemi a parlarne apertamente e in un recente
intervista ha detto: 'In realtà non nascondo troppo i sentimenti.",
"Penso che tutti sappiano che questo è il mio lavoro qui.",
"Quando sono in campo o quando sono in campo a giocare,
Sono un concorrente e voglio battere ogni singola persona che sia nel
spogliatoio o attraverso la rete. Quindi non sono io quello di cui iniziare una conversazione
il tempo e sappi che nei prossimi minuti devo andare a cercare di vincere una partita di tennis.",
"Sono una ragazza abbastanza competitiva."]

Descarga GloVe Word Embeddings

Guanto Gli intarsi di parole sono rappresentazioni vettoriali di parole. Questi intarsi di parole verranno utilizzati per creare vettori per le nostre frasi. Avremmo anche potuto usare gli approcci Bag-of-Words o TF-IDF per creare caratteristiche per le nostre frasi, ma questi metodi ignorano l'ordine delle parole (e il numero di funzioni è solitamente abbastanza grande).

Useremo il pre-addestrato Wikipedia 2014 + Gigaword 5 Vettori di guanti disponibili qui. Avviso: la dimensione di questi incorporamenti di parole è 822 MB.

!wget http://nlp.stanford.edu/data/glove.6B.zip
!decomprimi il guanto*.zip

Estraiamo le parole o i vettori di parole incorporati.

# Estrai vettori di parole
word_embeddings = {}
f = aperto('guanto.6B.100d.txt', codifica='utf-8')
per linea in f:
    valori = riga.split()
    parola = valori[0]
    coefs = es asarray(valori[1:], dtype="float32")
    word_embeddings[parola] = coefs
f.chiudi()
len(word_embeddings)
400000

Ora abbiamo vettori di parole per 400.000 diversi termini memorizzati nel dizionario: 'parole_incorporamenti'.

Pre-elaborazione del testo

È sempre una buona pratica rendere i tuoi dati testuali il più possibile privi di rumore. Quindi, facciamo un po' di pulizia di base del testo.

# rimuovi le punteggiature, numeri e caratteri speciali
clean_sentences = pd.Serie(frasi).str.replace("[^ a-zA-Z]", " ")

# fare alfabeti minuscoli
frasi_pulite = [Più lentamente() per s in clean_sentences]

Elimina le parole vuote (parole di uso comune di una lingua: è, sono, il, di, in, eccetera.) presente nelle preghiere. Se non l'hai scaricato nltk-stopwords, quindi esegui la seguente riga di codice:

nltk.download('stopword')

Ora possiamo importare le parole vuote.

da nltk.corpus importa parole non significative
stop_words = stopwords.parole('inglese')

Definiamo una funzione per rimuovere queste stopword dal nostro set di dati.

# funzione per rimuovere le stopword
def remove_stopwords(suo):
    sen_new = " ".aderire([io per io in sen se non in stop_words])
    return sen_new
# rimuovi le stopword dalle frasi
frasi_pulite = [remove_stopwords(r.split()) per r in clean_sentences]

noi useremo frasi_pulite per creare vettori per le frasi nei nostri dati con l'aiuto dei vettori di parole GloVe.

Rappresentazione vettoriale di frasi

# Estrai vettori di parole
word_embeddings = {}
f = aperto('guanto.6B.100d.txt', codifica='utf-8')
per linea in f:
    valori = riga.split()
    parola = valori[0]
    coefs = es asarray(valori[1:], dtype="float32")
    word_embeddings[parola] = coefs
f.chiudi()

Ora, creiamo vettori per le nostre preghiere. Cercheremo prima i vettori (ciascuno degli articoli di dimensioni 100) per le parole costituenti in una frase e poi prenderemo la media / media di quei vettori per arrivare a un vettore consolidato per la frase.

vettori_frase = []
per i in clean_sentences:
  se len(io) != 0:
    v = somma([word_embeddings.get(w, np.zero((100,))) per w in i.split()])/(len(io.diviso())+0.001)
  altro:
    v = np.zero((100,))
  frase_vettori.append(v)

Nota: Per ulteriori best practice per la pre-elaborazione del testo, puoi consultare il nostro video corso, Elaborazione del linguaggio naturale (PNL) usando Python.

Preparazione della matrice di similarità

Il prossimo passo è trovare somiglianze tra le frasi, e useremo l'approccio della somiglianza del coseno per questa sfida. Creiamo una matrice di somiglianza vuota per questo compito e completiamo con le somiglianze coseno dalle frasi.

Definiamo prima un array a dimensione zero (n * n). Inizializzeremo questa matrice con i punteggi di similarità del coseno delle frasi. Qui, Nord è il numero di frasi.

# matrice di somiglianza
sim_mat = np.zero([len(frasi), len(frasi)])

Useremo la somiglianza del coseno per calcolare la somiglianza tra una coppia di frasi.

da sklearn.metrics.pairwise import cosene_similarity

E inizializza la matrice con i punteggi di similarità del coseno.

per io nel raggio d'azione(len(frasi)):
  per j nell'intervallo(len(frasi)):
    se io != j:
      sim_mat[io][J] = coseno_somiglianza(vettori_frase[io].rimodellare(1,100), vettori_frase[J].rimodellare(1,100))[0,0]

Applicazione dell'algoritmo PageRank

prima di continuare, convertire la matrice di somiglianza sim_mat su un grafico. I nodi di questo grafico rappresenteranno le frasi e i bordi rappresenteranno i punteggi di somiglianza tra le frasi. In questo grafico, applicheremo l'algoritmo PageRank per arrivare alla classificazione delle frasi.

importa networkx come nx

nx_graph = nx.from_numpy_array(sim_mat)
punteggi = nx.pagerank(nx_graph)

Estrazione riassuntiva

Finalmente, è ora di estrarre le prime N frasi in base alle loro classifiche per la generazione del riepilogo.

frasi_classificate = ordinate(((punteggi[io],S) per me,s in enumerare(frasi)), inverso=Vero)
# Estrai in alto 10 frasi come il riassunto
per io nel raggio d'azione(10):
  Stampa(frasi_classificate[io][1])
Quando sono in campo o quando sono in campo a giocare, Sono un concorrente e voglio battere ogni singola persona
che siano negli spogliatoi o dall'altra parte della rete. Quindi non sono io quello che inizia una conversazione sul
meteo e sappi che nei prossimi minuti devo andare a provare a vincere una partita di tennis.

I principali giocatori ritengono che un grande evento a fine novembre combinato con uno a gennaio prima dell'Australian Open lo farà
significa troppo tennis e troppo poco riposo.

Parlando al torneo Swiss Indoors dove giocherà la finale di domenica contro il qualificato rumeno Marius
Copil, il numero tre del mondo ha detto che dato il lasso di tempo incredibilmente breve per prendere una decisione, ha rinunciato
qualsiasi impegno.

"Mi sentivo come se le migliori settimane in cui dovevo conoscere i giocatori mentre giocavo fossero le settimane della Fed Cup o il
settimane olimpiche, non necessariamente durante i tornei.

Attualmente al nono posto, Nishikori con una vittoria potrebbe passare all'interno 125 punti del taglio per l'evento a otto
a Londra il mese prossimo.

Ha usato il suo primo break point per chiudere il primo set prima di salire 3-0 nel secondo e concludendo il
vincere al suo primo match point.
Lo spagnolo ha rotto Anderson due volte nel secondo, ma non ha avuto un'altra possibilità sul servizio del sudafricano nel
set finale.

"Abbiamo anche avuto l'impressione che in questa fase potrebbe essere meglio giocare delle partite che allenarsi.

Il concorso è impostato per caratterizzare 18 paesi nel novembre 18-24 finali a Madrid l'anno prossimo, e sostituirà
le classiche sfide casa-trasferta giocate quattro volte all'anno per decenni.

Federer ha detto all'inizio di questo mese a Shanghai che le sue possibilità di giocare la Coppa Davis erano quasi inesistenti.

Ed eccoci! Un riassunto straordinario, ordinato, conciso e utile per i nostri articoli.

Qual è il prossimo?

Il riepilogo automatico del testo è un tema caldo di ricerca e, in questo articolo, abbiamo coperto solo la punta dell'iceberg. Nel futuro, exploraremos la técnica de resumen de texto abstracto donde el apprendimento profondo juega un papel importante. Cosa c'è di più, possiamo anche esaminare le seguenti attività di riepilogo:

Specifico per il problema

  • Riepilogo testo multidominio
  • Riepilogo documento singolo
  • Riepilogo del testo in più lingue (fonte in una lingua e sommario in un'altra lingua)

Specifico dell'algoritmo

  • Riepilogo del testo utilizzando RNN e LSTM
  • Resumen de texto mediante Apprendimento per rinforzo
  • Riassunto del testo per mezzo di reti generative conflittuali (GAN)

Note finali

Spero che questo post ti abbia aiutato a capire il concetto di riepilogo automatico del testo. Ha una varietà di casi d'uso e ha generato applicazioni di grande successo. O per sfruttare la tua attività o semplicemente per la tua conoscenza, il riassunto del testo è un approccio con cui tutti gli appassionati di PNL dovrebbero avere familiarità.

Cercherò di trattare la tecnica di sintesi del testo astratto utilizzando tecniche avanzate in un prossimo articolo.. Intanto, sentiti libero di usare la sezione commenti qui sotto per farmi sapere i tuoi pensieri o porre qualsiasi domanda tu possa avere su questo articolo..

Trova il codice in questo Archivio GitHub.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.