Es versteht Ihre Sprachbefehle, durchsucht Nachrichten- und Wissensquellen und fasst Inhalte zusammen und liest sie Ihnen vor.
Schauen Sie sich das Demovideo an.
Das Chatbots Magazine hat meinen Delbot-Artikel in den Top 100 Artikeln des Chatbots Magazine vorgestellt.
python app.py
in die Eingabeaufforderung ein, um den Webdienst zu starten.Bots bleiben ein heißes Thema. Alle reden über sie.
Wie wäre es, eines von Grund auf neu zu bauen? Das einfache, das wir heute erstellen werden, wird Fragen verstehen und beantworten wie:
Unser Ziel ist es, einen Bot von Grund auf zu programmieren und dabei die natürliche Sprachverarbeitung (NLP) zu nutzen.
Darüber hinaus ist unser Bot sprachgesteuert und webbasiert, wenn Sie auch den Abschnitt zur Web-App ausfüllen. Das Beste daran ist, dass wir für die Spracherkennung und -synthese nichts Besonderes tun müssen: Wir nutzen eine integrierte Funktion moderner Webbrowser.
Auf hoher Ebene möchten wir in der Lage sein, zwei große Arten von Abfragen zu verstehen. Es folgt das Flussdiagramm.
Wir könnten nach Neuigkeiten fragen. Z.B:
Was gibt es Neues zu „Phantastische Tierwesen im Guardian“?
Der Bot fragt die API der angeforderten Nachrichtenquelle ab (New York Times, falls keine angegeben ist) und fasst die Ergebnisse zusammen:
[...] Der Vergleich des ersten Harry-Potter-Films (Harry Potter und der Stein der Weisen von 2001) mit dem letzten (Harry Potter und die Heiligtümer des Todes Teil Zwei von 2011) ähnelt in gewisser Weise dem Vergleich von Bambi mit Reservoir Dogs. Wir treffen ihn zum ersten Mal im New York der 1920er Jahre – fast 60 Jahre bevor Harry überhaupt geboren wird – wo er lebt und lebt.
(Quelle: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
Wir könnten eine Wissensfrage stellen. Z.B:
Was sind RDF-Tripel?
Und der Bot wird antworten:
Ein semantisches Triple, oder einfach Triple, ist die atomare Dateneinheit im Resource Description Framework.nDieses Format ermöglicht die maschinenlesbare Darstellung von Wissen. Insbesondere ist jeder Teil eines RDF-Triples einzeln über eindeutige URIs adressierbar. Beispielsweise könnte die zweite Anweisung oben in RDF als http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/ dargestellt werden. kennt http://example.name#JohnDoe34.
(Quelle: https://en.wikipedia.org/wiki/Semantic_triple)
Wir definieren eine einfache Regel zur Kategorisierung von Eingaben: Wenn die Abfrage eines der Wörter „news“ oder „latest“ enthält, handelt es sich um eine News-Abfrage . Ansonsten handelt es sich um eine Wissensabfrage .
Die predict
der QueryAnalyzer
-Klasse ist der Haupteinstiegspunkt für unseren Bot. Es führt die obige Kategorisierung durch. Es ruft andere Funktionen auf
Schließlich wird die Ausgabe und ein Flag zurückgegeben, das angibt, ob ein Fehler aufgetreten ist.
Wir gehen davon aus, dass die Eingabe eine der folgenden Formen hat.
Was sind die neuesten Nachrichten zu Star Wars in der New York Times?
Lesen Sie mir das Neueste zum Thema Brexit vor.
Informieren Sie mich über Neuigkeiten zu Marvel Cinematic Universe-Filmen im Jahr 2017 vom Guardian.
Token | Geben | Mich | Die | letzte | Nachricht | An | Donald | Trumpf | aus | Die | Neu | York | Mal | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS | VERB | PRON | DET | ADJ | SUBSTANTIV | ADP | PROPN | PROPN | ADP | DET | PROPN | PROPN | PROPN | PUNKT |
ETIKETT | VB | PRP | DT | JJS | NN | IN | NNP | NNP | IN | DT | NNP | NNP | NNP | . |
Es gibt ein Muster in Sätzen, die wie oben strukturiert sind. Und Präpositionen sind der Schlüssel.
Das Suchthema liegt zwischen der ersten und der letzten Präposition. Die gewünschte Quelle steht am Ende nach der letzten Präposition. Der letzte Nomenblock ist die Quelle.
Falls keine Quelle angegeben ist, wie im zweiten Beispiel, wird davon ausgegangen, dass alles nach der ersten Präposition Gegenstand der Suche ist.
Adpositionen sind, vereinfacht gesagt, Präpositionen und Postpositionen.
In einer Sprache mit Kopfanfang wie Englisch stehen Adpositionen normalerweise vor der Nominalphrase. ZB Charaktere aus dem Marvel Cinematic Universe. Während in einer Hauptsprache wie Gujarati Adpositionen der Nominalphrase folgen. Das sind Postpositionen. Zum Beispiel માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો, was Wort für Wort übersetzt in: Marvel Cinematic Universe of Characters.
Wir rufen get_news_tokens
aus der QueryExtractor
-Klasse auf, die die Quelle und die Abfrage aus der Eingabe extrahiert. Intern ruft es _split_text
auf, um Substantivblöcke, Wortarten und den vollständig analysierten Text aus der Eingabe zu extrahieren. Wir lemmatisieren Begriffe in der Abfrage.
Als Nächstes rufen wir die Funktion get_news
auf, indem wir eine der Aggregator
in media_aggregator.py basierend auf der Quelle abfragen . Dies gibt eine Liste der Nachrichtenartikel zurück, die als Antwort von der Nachrichten-API gesendet wurden. Wir unterstützen derzeit die The Guardian API und die New York Times API.
Schließlich wählen wir das erste Element (standardmäßig) aus der Antwortliste aus und fassen es mit der Funktion shorten_news
zusammen.
Wir gehen davon aus, dass die Eingabe eine der folgenden Formen hat.
John Deere
Jeanne d'Arc
Wer ist Donald Trump?
Wer war JRR Tolkien?
Was ist ein Subjekt-Prädikat-Objekt?
Erzähl mir etwas über Teilchenphysik.
Token | Was | Ist | ein | RDF | verdreifachen | ? |
---|---|---|---|---|---|---|
POS | SUBSTANTIV | VERB | DET | PROPN | SUBSTANTIV | PUNKT |
ETIKETT | WP | VBZ | DT | NNP | NN | . |
Token | Erzählen | Mich | um | Er | - | Mann | Und | Die | Meister | von | Die | Universum | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS | VERB | PRON | ADP | PRON | PUNKT | SUBSTANTIV | CONJ | DET | SUBSTANTIV | ADP | DET | SUBSTANTIV | PUNKT |
ETIKETT | VB | PRP | IN | PRP | HYPH | NN | CC | DT | NNS | IN | DT | NN | . |
Wenn wir ein Hilfsverb finden, behandeln wir alles nach seinem ersten Auftreten als Abfrage. In Beispiel 1 lautet die Abfrage also RDF-Triple .
Andernfalls behandeln wir alle Substantivblöcke nach dem ersten als Abfrage. In Beispiel 2 lautet die Abfrage also „he-man the masters the universe“ .
Wir rufen get_knowledge_tokens
aus der QueryExtractor
-Klasse auf, die die Abfrage extrahiert.
Wir übergeben dies an die Funktion get_gkg
, die die Wikipedia-API über das Wikipedia- Python-Paket abfragt und eine 5-Satz-Zusammenfassung des Top-Ergebnisses zurückgibt.
Ich habe die FrequencySummarizer
Klasse aus der Textzusammenfassung mit NLTK verwendet. Alternativ können Sie sumy verwenden.
Zusätzlich zu den Paketen re , bs4 , Anfragen , Operator , Sammlungen , Heapq , String und NLTK werden wir Folgendes verwenden.
spaCy : Bitte richten Sie es wie in den Installationsdokumenten für spaCy beschrieben ein. spaCy wird uns dabei helfen, schnelles NLP durchzuführen. Wir könnten NLTK verwenden, aber mit spaCy kommen Sie schneller voran. Wir verwenden spaCy in diesem Projekt.
Wikipedia : Dies hilft bei der Abfrage der Wikipedia-API. Sie können die Dokumentation des Wikipedia- Python-Pakets hier lesen.
Zusammenfassung : Die von mir verwendete Zusammenfassung stammt aus dem Blog „The Glowing Python“ von JustGlowing. Es fasst längere Inhalte zusammen. Alternativ können Sie sumy verwenden.
Flask-RESTful, Flask (optional) : Diese dienen zum Erstellen einer Web-App und zur Operationalisierung unseres Bots über einen RESTful-Webdienst.
Wir fügen eine coole Webseite hinzu, von der aus Sie Sprachanfragen absetzen und den Browser den Antwortinhalt vorlesen lassen können. Wir nutzen hierfür die Web Speech API.
Wir bringen unseren Flask-basierten REST-Webdienst in weniger als 20 Codezeilen zum Laufen. Die QueryService
Klasse verarbeitet Anfragen.
Ab sofort benötigen wir nur noch einen Serviceaufruf, um Eingaben von unserer Web-App an unseren Bot zu senden. Dies erfolgt über die post
Funktion der QueryService
-Klasse. post
wiederum ruft die predict
-Funktion auf, die wie oben erwähnt den Haupteinstiegspunkt darstellt.
Ich habe eine einfache Webseite erstellt, um den Bot zu demonstrieren. Es nutzt die Web Speech API, um Spracheingaben zu empfangen und Inhalte vorzulesen. Sie finden die Datei index.html im Vorlagenordner. Stellen Sie sicher, dass Sie alle erforderlichen Pakete und Bibliotheken installiert haben und dass der Webdienst betriebsbereit ist, bevor Sie die Website öffnen.
Unser einfacher Bot versteht eine begrenzte Anzahl von Anfragen. Es kann andere Arten von Anfragen wie die folgenden nicht verstehen.
Wissensanfragen mit einer anderen Struktur
Erklären Sie mir, was Bootstrap-Aggregation ist.
Erzählen Sie mir etwas über Computational Neuroscience.
Newsanfragen mit einer anderen Struktur
Was sagt die New York Times zum letzten Match von Roger Federer?
Was passiert in der Welt des Tennis?
Wissensanfragen anderer Art
Wie wird Käse hergestellt?
Wo wurde JK Rowling geboren?
Können wir eine Himmelsstadt auf der Venus bauen?
Wann fand die Französische Revolution statt?
Warum hat Jupiter den Großen Roten Fleck?
Anschlussfragen und Kontext
Erklären Sie mir, was Bootstrap-Aggregation ist.
und dann: Wie hängt es mit zufälligen Wäldern zusammen?
Zu verstehen, worauf es in der Folgefrage ankommt, fällt unter die sogenannte Anaphora-Auflösung. Es ist alles Teil des Verständnisses des Kontexts. Unterschiedliche Wörter bedeuten in unterschiedlichen Kontexten unterschiedliche Dinge. Während Menschen ein differenziertes Verständnis davon haben, ist es deutlich schwieriger, Maschinen dasselbe beizubringen.
Wir haben unser Ziel erreicht, einen Bot basierend auf einigen von uns definierten Regeln zu erstellen. Wir haben auch einige NLP-Techniken genutzt. Schließlich haben wir unseren Bot in einer Webanwendung bereitgestellt. Allerdings ist die Art der Anfragen, die unser Bot verstehen und beantworten kann, begrenzt. Warum ist sein Verständnisbereich so eng?
Im Allgemeinen ist es ein schwieriges KI-Problem, Computern Sprache wirklich verständlich zu machen. Innerhalb des NLP gibt es einen Bereich namens NLU (Natural Language Understanding), der diesem Thema gewidmet ist.
Wir könnten eine auf maschinellem Lernen basierende Lösung implementieren, damit unser Bot potenziell ein viel größeres Spektrum an Anfragen verstehen könnte.
Bitte lesen Sie unbedingt die Nutzungsbedingungen der hier verwendeten APIs.