Einführung
Textzusammenfassung ist eine dieser Anwendungen der natürlichen Sprachverarbeitung (PNL) das wird sicherlich einen großen Einfluss auf unser Leben haben. Mit wachsenden digitalen Medien und stetig wachsenden Publikationen, Wer hat Zeit, Artikel zu rezensieren / Unterlagen / komplette Bücher, um zu entscheiden, ob sie nützlich sind oder nicht? Glücklicherweise, diese technologie ist da.
Sind Sie auf die mobile App gestoßen?? in Shorts? Es ist eine innovative Nachrichtenanwendung, die Nachrichtenartikel in eine Zusammenfassung von 60 Wörter. Und genau das werden wir in diesem Artikel lernen.: Automatische Textzusammenfassung.
Die automatische Textzusammenfassung ist eines der anspruchsvollsten und interessantesten Probleme im Bereich der Verarbeitung natürlicher Sprache. (PNL). Es ist ein Prozess, bei dem aus mehreren Textressourcen eine prägnante und aussagekräftige Textzusammenfassung generiert wird, wie Bücher, Zeitungsartikel, Blogeinträge, Forschungsartikel, E-Mails und Tweets.
Die Nachfrage nach automatisierten Textzusammenfassungssystemen steigt heutzutage dank der Verfügbarkeit großer Textdatenmengen.
Durch diesen Artikel, wir werden die Domänen der Textzusammenfassung erkunden. Wir werden verstehen, wie der TextRank-Algorithmus funktioniert und wir werden ihn auch in Python implementieren. Schnall dich an, Das wird eine lustige Reise!
Inhaltsverzeichnis
- Textzusammenfassungsansätze
- Den TextRank-Algorithmus verstehen
- Problembeschreibung verstehen
- Implementierung des TextRank-Algorithmus
- Was kommt als nächstes?
Textzusammenfassungsansätze
Die automatische Textzusammenfassung erregte bereits im Jahrzehnt des 20 1950. EIN Forschungsarbeit, herausgegeben von Hans Peter Luhn Ende der 1990er Jahre. 1950, betitelt “Automatische Erstellung von Literaturzusammenfassungen”, verwendet Merkmale wie Worthäufigkeit und Phrasenhäufigkeit, um wichtige Sätze aus dem Text für zusammenfassende Zwecke zu extrahieren.
Weitere wichtige untersuchen, gespielt von Harold P. Edmundson im späten 1960, verwendete Methoden wie das Vorhandensein von Schlüsselwörtern, die im Titel verwendeten Wörter, die im Text vorkommen, und die Platzierung der Sätze, um aussagekräftige Sätze für die Textzusammenfassung zu extrahieren. Seit damals, Viele wichtige und spannende Studien wurden veröffentlicht, um sich der Herausforderung der automatischen Textzusammenfassung zu stellen.
TDie Erweiterungszusammenfassung kann in zwei Kategorien unterteilt werden: Extraktive Zusammenfassung Ja Abstrakte Zusammenfassung.
- Extraktive Zusammenfassung: Diese Methoden basieren auf dem Extrahieren mehrerer Teile, wie Phrasen und Sätze, ein Stück Text und stapeln Sie sie, um eine Zusammenfassung zu erstellen. Deswegen, Die Identifizierung der richtigen zusammenzufassenden Sätze ist bei einer extraktiven Methode von größter Bedeutung.
- Abstrakte Zusammenfassung: Diese Methoden verwenden fortschrittliche NLP-Techniken, um eine völlig neue Zusammenfassung zu generieren.. Einige Teile dieser Zusammenfassung erscheinen möglicherweise nicht einmal im Originaltext.
In diesem Artikel, wir werden uns auf die konzentrieren extraktive Zusammenfassung Technik.
Den TextRank-Algorithmus verstehen
Bevor Sie mit dem TextRank-Algorithmus beginnen, es gibt einen anderen Algorithmus, mit dem wir uns vertraut machen sollten: der PageRank-Algorithmus. Eigentlich, Das hat TextRank wirklich inspiriert! PageRank wird hauptsächlich verwendet, um Webseiten in Online-Suchergebnissen zu ranken. Lassen Sie uns die Grundlagen dieses Algorithmus anhand eines Beispiels schnell verstehen.
PageRank-Algorithmus
Quelle: http://www.scottbot.net/HIAL/
Angenommen, wir haben 4 Webseiten: w1, w2, w3 und w4. Diese Seiten enthalten Links, die aufeinander verweisen. Einige Seiten haben möglicherweise keine Links; heißen hängende Seiten.
- Die w1-Webseite enthält Links zu w2 und w4
- w2 hat Links für w3 und w1
- w4 hat nur Links für die Webseite w1
- w3 hat keine Links und, Daher, es wird hängende Seite heißen
Um diese Seiten zu ranken, wir müssten eine Punktzahl namens berechnen PageRank-Score. Diese Punktzahl ist die Wahrscheinlichkeit, dass ein Nutzer diese Seite besucht.
Um die Wahrscheinlichkeit zu erfassen, dass Benutzer von einer Seite zur anderen navigieren, Wir werden ein Quadrat erstellen matriz M, mit n Zeilen und n Spalten, wo Norden ist die Anzahl der Webseiten.
Jedes Element dieser Matrix gibt die Wahrscheinlichkeit an, mit der ein Benutzer von einer Webseite zur anderen wechselt. Zum Beispiel, die hervorgehobene Zelle darunter enthält die Übergangswahrscheinlichkeit von w1 nach w2.
Die Odds-Initialisierung wird in den folgenden Schritten erklärt:
- Wahrscheinlichkeit, von Seite i zu j . zu gehen, nämlich, m[ ich ][ J ], wird initialisiert mit 1 / (Anzahl einzigartiger Links auf der Website wi)
- Wenn es keinen Link zwischen Seite i und j gibt, dann wird die Wahrscheinlichkeit mit initialisiert 0
- Wenn ein Benutzer auf einer hängenden Seite gelandet ist, Es wird davon ausgegangen, dass der Übergang zu einer beliebigen Seite mit gleicher Wahrscheinlichkeit erfolgt. Deswegen, m[ ich ][ J ] wird initialisiert mit 1 / (Anzahl der Webseiten)
Deswegen, in unserem Fall, Array M wird wie folgt initialisiert:
Schließlich, die Werte in diesem Array werden iterativ aktualisiert, um die Webseiten-Rankings zu erreichen.
Textbereichsalgorithmus
Lassen Sie uns den TextRank-Algorithmus verstehen, jetzt kennen wir den PageRank. Ich habe die Ähnlichkeiten zwischen diesen beiden Algorithmen unten aufgelistet:
- Statt Webseiten, wir verwenden Sätze.
- Die Ähnlichkeit zwischen zwei beliebigen Sätzen wird als Äquivalent zur Übergangswahrscheinlichkeit der Webseite verwendet.
- Ähnlichkeitsbewertungen werden in einer quadratischen Matrix gespeichert, ähnlich der Matrix M, die für PageRank verwendet wird
TextRank ist eine extraktive und unbeaufsichtigte Textzusammenfassungstechnik. Werfen wir einen Blick auf den Ablauf des TextRank-Algorithmus, dem wir folgen werden:
- Der erste Schritt wäre, den gesamten in den Artikeln enthaltenen Text zu verketten.
- Dann teile den Text in einzelne Sätze auf
- Im nächsten Schritt, wir finden die Vektordarstellung (Worteinlagen) für jeden einzelnen Satz.
- Ähnlichkeiten zwischen Satzvektoren werden berechnet und in einer Matrix gespeichert.
- Später, die Ähnlichkeitsmatrix wird in einen Graphen umgewandelt, mit Sätzen als Knoten und Ähnlichkeitswerten als Kanten, zur Berechnung des Satzbereichs.
- Schließlich, eine bestimmte Anzahl der bestplatzierten Sätze bilden die abschließende Zusammenfassung.
Dann, ohne weitere Präambeln, Starten Sie unsere Jupyter Notebooks und fangen wir an zu programmieren!!
Notiz: Wenn Sie mehr über die Graphentheorie erfahren möchten, Ich empfehle Ihnen, dies zu überprüfen Artikel.
Problembeschreibung verstehen
Ein großer Tennisfan sein, Ich versuche immer, über das Geschehen im Sport auf dem Laufenden zu bleiben, indem ich religiös so viele Tennis-Updates wie möglich online checke. Aber trotzdem, Dies hat sich als ziemlich schwierige Aufgabe erwiesen!! Es gibt zu viele Ressourcen und die Zeit ist eine Begrenzung.
Deswegen, Ich beschloss, ein System zu entwickeln, das mir eine Zusammenfassung mit Aufzählungszeichen erstellen kann, indem ich mehrere Artikel scanne. Wie macht man das? Das zeige ich dir in diesem Tutorial. Wir werden den TextRank-Algorithmus auf einen Datensatz von gekratzten Artikeln anwenden, um eine schöne und prägnante Zusammenfassung zu erstellen.
Beachten Sie, dass dies im Wesentlichen eine Sammelaufgabe mit einer einzigen Domäne und mehreren Dokumenten ist, nämlich, Wir werden mehrere Artikel als Eingabe verwenden und eine einzelne Zusammenfassung mit Aufzählungszeichen erstellen. Textzusammenfassung für mehrere Domains wird in diesem Artikel nicht behandelt, aber am ende kannst du es gerne ausprobieren.
Sie können den Datensatz, den wir verwenden, herunterladen von hier.
Implementierung des TextRank-Algorithmus
Dann, ohne weitere Präambeln, Schalten Sie Ihre Jupyter Notebooks ein und lassen Sie uns das bisher Gelernte umsetzen.
Importieren Sie erforderliche Bibliotheken
Zuerst, Importieren Sie die Bibliotheken, die wir für diese Herausforderung einsetzen werden.
numpy als np importieren Pandas als pd importieren nltk importieren nltk.download('punkt') # einmalige Ausführung Importieren
Daten lesen
Lesen wir nun unseren Datensatz. Den Link zum Herunterladen der Daten habe ich oben im Abschnitt bereitgestellt (Falls Du es verpasst hast).
df = pd.read_csv("tennis_articles_v4.csv")
Überprüfen Sie die Daten
Werfen wir einen kurzen Blick auf die Daten.
df.kopf()
Verfügen über 3 Spalten in unserem Datensatz: 'artikel_id', 'artikel_text’ y "Quelle". Uns interessiert mehr die Spalte ‚article_text’ da es den Text der Artikel enthält. Lassen Sie uns einige der Variablenwerte drucken, nur um zu sehen, wie sie aussehen.
df['artikel_text'][0]
Produktion:
"Maria Sharapova hat als Tennisspielerin auf der WTA Tour im Grunde keine Freunde. Der russische Spieler hat keine Probleme, offen darüber zu sprechen, und in einem kürzlichen Interview sagte sie: 'Ich nicht wirklich verstecke alle Gefühle zu sehr. Ich glaube, jeder weiß, dass das hier mein Job ist. Wenn ich auf dem Platz bin oder wenn ich auf dem Platz spiele, Ich bin ein Konkurrent und ich möchte jeden einzelnen schlagen, egal ob sie sind in der Umkleidekabine oder über das Netz...
df['artikel_text'][1]
BASEL, Schweiz (AP), Roger Federer erreichte mit einem Sieg das 14. Swiss Indoors Finale seiner Karriere
der siebtsamte Daniil Medvedev 6-1, 6-4 am Samstag. Auf der Suche nach einem neunten Titel bei seiner Heimatveranstaltung, und ein 99
Gesamt, Federer trifft am Sonntag auf den an Position 93 gesetzten Marius Copil. Federer dominated the 20th-ranked Medvedev and had
his first match-point chance to break serve again at 5-1...
df['artikel_text'][2]
Roger Federer hat bekannt gegeben, dass ihm die Organisatoren des neu aufgelegten und komprimierten Davis Cups drei Tage Zeit gegeben haben entscheiden, ob er sich dem umstrittenen Wettbewerb anschließt. Er spricht beim Swiss Indoors-Turnier, wo er sein wird spielen im Sonntagsfinale gegen den rumänischen Qualifikanten Marius Copil, die Nummer drei der Welt sagte, dass angesichts der Unmöglich kurzer Zeitrahmen, um eine Entscheidung zu treffen, er hat sich von jeder Verpflichtung abgemeldet...
Jetzt haben wir 2 Optionen: wir können jeden Artikel einzeln zusammenfassen oder wir können eine einzelne Zusammenfassung für alle Artikel erstellen. Für unseren Zweck, wir machen mit letzterem weiter.
Text in Sätze aufteilen
Nun ist der nächste Schritt, den Text in einzelne Sätze aufzuteilen. Wir werden die verwenden gesendet_tokenize () Funktion der nltk Bibliothek, um dies zu tun.
von nltk.tokenize import sent_tokenize Sätze = [] für s in df['artikel_text']: Sätze.anhängen(gesendet_tokenize(S)) Sätze = [y für x in Sätzen für y in x] # Liste glätten
Lassen Sie uns einige Elemente aus der Liste drucken. Sätze.
Sätze[:5]
Produktion:
["Maria Sharapova hat als Tennisspielerin auf der WTA-Tour im Grunde keine Freunde.", "Der russische Spieler hat keine Probleme, offen darüber zu sprechen und in einem kürzlich veröffentlichten Interview sagte sie: „Ich verstecke keine Gefühle wirklich zu sehr.", "Ich glaube, jeder weiß, dass dies mein Job hier ist.", "Wenn ich auf dem Platz bin oder wenn ich auf dem Platz spiele, Ich bin ein Konkurrent und ich möchte jede einzelne Person schlagen, egal ob sie in der Umkleidekabine oder über das Internet.Ich bin also nicht diejenige, die ein Gespräch anfängt das Wetter und weiß, dass ich in den nächsten Minuten gehen und versuchen muss, ein Tennismatch zu gewinnen.", "Ich bin ein ziemlich konkurrenzfähiges Mädchen."]
Descarga GloVe Worteinbettungen
Handschuh Wortinlays sind Vektordarstellungen von Wörtern. Diese Worteinlagen werden verwendet, um Vektoren für unsere Sätze zu erstellen. Wir hätten auch die Bag-of-Words- oder TF-IDF-Ansätze verwenden können, um Merkmale für unsere Sätze zu erstellen, aber diese Methoden ignorieren die Wortreihenfolge (und die Anzahl der Funktionen ist normalerweise ziemlich groß).
Wir werden die vortrainierten Wikipedia 2014 + Gigawort 5 Handschuhvektoren verfügbar hier. Notiz: Die Größe dieser Worteinbettungen beträgt 822 MB.
!wget http://nlp.stanford.edu/data/glove.6B.zip !Handschuh entpacken*.zip
Lassen Sie uns die eingebetteten Wörter oder Wortvektoren extrahieren.
# Wortvektoren extrahieren word_embeddings = {} f = offen('handschuh.6B.100d.txt', Kodierung='utf-8') für Zeile in f: Werte = line.split() Wort = Werte[0] coefs = z.B. asarray(Werte[1:], dtyp="float32") word_embeddings[Wort] = coefs f.schließen()
len(word_embeddings)
400000
Wir haben jetzt Wortvektoren für 400.000 verschiedene im Wörterbuch gespeicherte Begriffe: 'word_embeddings'.
Textvorverarbeitung
Es ist immer eine gute Praxis, Ihre Textdaten so weit wie möglich rauschfrei zu machen. Dann, Lassen Sie uns eine grundlegende Textbereinigung durchführen.
# Satzzeichen entfernen, Zahlen und Sonderzeichen clean_sentences = pd.Series(Sätze).str.ersetzen("[^ a-zA-Z]", " ") # Alphabete klein schreiben saubere_sätze = [Langsamer() für s in sauberen_sätzen]
Eliminiere leere Wörter (häufig verwendete Wörter einer Sprache: es ist, bin, das, von, In, etc.) in Gebeten anwesend. Wenn Sie nicht heruntergeladen haben nltk-stopwords, dann führe die folgende Codezeile aus:
nltk.download('Stoppwörter')
Jetzt können wir die leeren Wörter importieren.
aus nltk.corpus importieren Stoppwörter stop_words = stopwords.words('Englisch')
Lassen Sie uns eine Funktion definieren, um diese Stoppwörter aus unserem Datensatz zu entfernen.
# Funktion zum Entfernen von Stoppwörtern def remove_stopwords(es ist): sen_new = " ".beitreten([ich für i in sen wenn ich nicht in stop_words]) sen_new zurückgeben
# Stoppwörter aus den Sätzen entfernen saubere_sätze = [remove_stopwords(r.split()) für r in sauberen_sätzen]
wir werden verwenden saubere_sätze um Vektoren für Sätze in unseren Daten mit Hilfe von GloVe-Wortvektoren zu erstellen.
Vektordarstellung von Sätzen
# Wortvektoren extrahieren word_embeddings = {} f = offen('handschuh.6B.100d.txt', Kodierung='utf-8') für Zeile in f: Werte = line.split() Wort = Werte[0] coefs = z.B. asarray(Werte[1:], dtyp="float32") word_embeddings[Wort] = coefs f.schließen()
Jetzt, Lass uns Vektoren für unsere Gebete erstellen. Wir suchen zuerst nach Vektoren (jedes der größen einzelteile 100) für die konstituierenden Wörter in einem Satz und dann nehmen wir den Mittelwert / Durchschnitt dieser Vektoren, um einen konsolidierten Vektor für den Satz zu erhalten.
Satz_Vektoren = [] für i in clean_sentences: wenn len(ich) != 0: v = Summe([word_embeddings.get(w, np.null((100,))) für w in i.split()])/(len(Ich teile())+0.001) anders: v = np.null((100,)) Satz_Vektoren.append(v)
Notiz: Weitere Best Practices für die Textvorverarbeitung, Sie können unseren Videokurs konsultieren, Verarbeitung natürlicher Sprache (NLP) mit Python.
Erstellung der Ähnlichkeitsmatrix
Der nächste Schritt besteht darin, Ähnlichkeiten zwischen den Sätzen zu finden, und wir werden den Cosinus-Ähnlichkeitsansatz für diese Herausforderung verwenden. Lassen Sie uns für diese Aufgabe eine leere Ähnlichkeitsmatrix erstellen und mit Kosinusähnlichkeiten aus den Sätzen füllen.
Definieren wir zunächst ein nulldimensionales Array (n * n). Wir werden diese Matrix mit Kosinus-Ähnlichkeitswerten der Sätze initialisieren. Hier, Norden ist die Anzahl der Sätze.
# Ähnlichkeitsmatrix sim_mat = np.null([len(Sätze), len(Sätze)])
Wir verwenden Cosinus-Ähnlichkeit, um die Ähnlichkeit zwischen einem Satzpaar zu berechnen.
aus sklearn.metrics.pairwise import cosine_similarity
Und initialisieren Sie die Matrix mit Kosinus-Ähnlichkeitswerten.
für mich in Reichweite(len(Sätze)): für j im Bereich(len(Sätze)): wenn ich != j: sim_mat[ich][J] = cosine_similarity(Satz_Vektoren[ich].umformen(1,100), Satz_Vektoren[J].umformen(1,100))[0,0]
Anwendung des PageRank-Algorithmus
vor dem Fortfahren, wandle die Ähnlichkeitsmatrix um sim_mat auf einer Grafik. Die Knoten dieses Graphen repräsentieren die Sätze und die Kanten repräsentieren die Ähnlichkeitsbewertungen zwischen den Sätzen. In dieser Grafik, Wir werden den PageRank-Algorithmus anwenden, um die Klassifizierung der Sätze zu erhalten.
import networkx als nx nx_graph = nx.from_numpy_array(sim_mat) Scores = nx.pagerank(nx_graph)
Zusammenfassende Extraktion
Schließlich, Es ist an der Zeit, die Top-N-Sätze basierend auf ihren Rankings für die Zusammenfassungsgenerierung zu extrahieren.
rangierte_sätze = sortiert(((Partituren[ich],S) für ich,s aufzählen(Sätze)), reverse=Wahr)
# Extrahieren nach oben 10 Sätze als Zusammenfassung für mich in Reichweite(10): drucken(rangierte_sätze[ich][1])
Wenn ich auf dem Platz bin oder wenn ich auf dem Platz spiele, Ich bin ein Konkurrent und möchte jede einzelne Person schlagen Egal ob in der Umkleidekabine oder im Netz. Ich bin also nicht derjenige, der ein Gespräch über die Wetter und weiß, dass ich in den nächsten Minuten gehen und versuchen muss, ein Tennismatch zu gewinnen. Wichtige Spieler sind der Meinung, dass ein großes Ereignis Ende November in Kombination mit einem im Januar vor den Australian Open stattfinden wird bedeuten zu viel Tennis und zu wenig Ruhe. Er spricht beim Swiss Indoors-Turnier, bei dem er am Sonntag im Finale gegen den rumänischen Qualifikanten Marius . spielt Copil, die Nummer drei der Welt sagte, dass angesichts des unglaublich kurzen Zeitrahmens, um eine Entscheidung zu treffen, er hat sich abgemeldet jede Verpflichtung. "Ich hatte das Gefühl, die besten Wochen, in denen ich Spieler kennenlernen musste, wenn ich spielte, waren die Fed-Cup-Wochen oder die Olympische Wochen, nicht unbedingt während der Turniere. Aktuell auf Platz neun, Nishikori mit einem Sieg könnte nach innen ziehen 125 Punkte des Cuts für das Acht-Mann-Event nächsten Monat in London. Er nutzte seinen ersten Breakpoint, um den ersten Satz zu beenden, bevor er nach oben ging 3-0 in der zweiten und einpacken der gewinnt mit seinem ersten Matchball. Der Spanier brach Anderson zweimal im zweiten, bekam aber keine weitere Chance auf den Aufschlag des Südafrikaners im letzter Satz. "Wir hatten auch den Eindruck, dass es in dieser Phase vielleicht besser ist, Spiele zu spielen als zu trainieren. Der Wettbewerb wird vorgestellt 18 Länder im November 18-24 Finale in Madrid nächstes Jahr, und wird ersetzen die klassischen Heim- und Auswärtsspiele wurden jahrzehntelang viermal im Jahr gespielt. Federer sagte Anfang dieses Monats in Shanghai, dass seine Chancen, den Davis Cup zu spielen, so gut wie nicht existent seien.
Und es geht los! Eine tolle Zusammenfassung, ordentlich, prägnant und nützlich für unsere Artikel.
Was kommt als nächstes?
Automatische Textzusammenfassung ist ein heißes Thema der Forschung und, In diesem Artikel, Wir haben nur die Spitze des Eisbergs abgedeckt. In der Zukunft, Wir werden die abstrakte Textzusammenfassungstechnik untersuchen, bei der Deep Learning eine wichtige Rolle spielt. Was ist mehr, wir können auch die folgenden zusammenfassenden Aufgaben prüfen:
Spezifisch für das Problem
- Textzusammenfassung für mehrere Domains
- Zusammenfassung eines einzelnen Dokuments
- Textzusammenfassung in mehreren Sprachen (Quelle in einer Sprache und Zusammenfassung in einer anderen Sprache)
Algorithmusspezifisch
- Textzusammenfassung mit RNN und LSTM
- Zusammenfassung des Textes mit Reinforcement Learning
- Textzusammenfassung mittels konfrontativer generativer Netzwerke (GAN)
Abschließende Anmerkungen
Ich hoffe, dieser Beitrag hat Ihnen geholfen, das Konzept der automatischen Textzusammenfassung zu verstehen. Es hat eine Vielzahl von Anwendungsfällen und hat äußerst erfolgreiche Anwendungen hervorgebracht. Entweder um von Ihrem Geschäft zu profitieren oder einfach für Ihr eigenes Wissen, Textzusammenfassung ist ein Ansatz, mit dem alle NLP-Enthusiasten vertraut sein sollten.
Ich werde versuchen, die abstrakte Textzusammenfassungstechnik mit fortgeschrittenen Techniken in einem zukünftigen Artikel zu behandeln.. in der Zwischenzeit, Zögern Sie nicht, den Kommentarbereich unten zu verwenden, um mir Ihre Meinung mitzuteilen oder Fragen zu diesem Artikel zu stellen..