Hallo. Dies ist Hironsan. Seit März-April haben Line, Facebook, Microsoft und andere Plattformen für die Bot-Entwicklung angekündigt. Eine explosive Anzahl von Bots ist erschienen. Selbst wenn es nur auf Facebook Messenger beschränkt ist mehr als 11.000 Bot sind ab Juli 2016 in Betriebtun.
Die meisten dieser Bot sind jedoch einfache Frage-und-Antwort-Systeme, keine interaktiven Systeme. Damit ist es nicht möglich, allmählich auf den Geschmack des Benutzers zu hören.
Daher möchte ich dieses Mal ein ** Restaurant-Suchdialogsystem ** erstellen, das die Geschichte des Dialogs berücksichtigt und es schließlich in Bot integriert. Als fertiges Bild können Sie so etwas wie die folgende Animation erstellen.
Erstellen Sie es insbesondere in den folgenden Schritten.
Neben der Suche nach Restaurants können Sie auch chatten. Durch die Erstellung dieser Bot soll verstanden werden, wie ein grundlegendes Interaktionssystem erstellt wird.
Das diesmal erstellte Dialogsystem wird mit dem Python3-System erstellt. Installieren Sie es daher nach dem Herunterladen der Python3-Serie von der offiziellen Website.
Wir werden von nun an ein praktisches Repository vorbereiten. Bitte bereiten Sie sich wie folgt vor.
$ git clone YOUR_FORK_REPOSITORY.git
$ cd HotPepperGourmetDialogue
$ git checkout -b tutorial origin/tutorial
Legen Sie außerdem PYTHONPATH direkt im Verzeichnis HotPepperGourmetDialogue für den Modulimport fest. Fügen Sie kein doppeltes Anführungszeichen "" hinzu.
$ export PYTHONPATH=`pwd`
Führen Sie in der Eingabeaufforderungsumgebung Folgendes aus.
$ set PYTHONPATH=%CD%
Führen Sie für Virtualenv den folgenden Befehl aus, um die virtuelle Umgebung zu erstellen und zu aktivieren.
$ pip install virtualenv
$ virtualenv env
$ source env/bin/activate
Führen Sie für Conda den folgenden Befehl aus, um die virtuelle Umgebung zu erstellen und zu aktivieren.
$ conda create -n env python
$ source activate env #Für die Eingabeaufforderung aktivieren Sie env
Erhalten Sie die folgenden zwei API-Schlüssel zur Verwendung im Interaktionssystem für die Restaurantsuche.
Die Docomo-Chat-Konversations-API wird zum Chatten mit Bot und die HotPepper-Gourmet-Such-API zum Suchen nach Restaurants verwendet. Als Leitfaden dauert es ungefähr 5 Minuten für den API-Schlüssel von HotPepper und ungefähr 1 Tag für die API des Docomo-Chat-Dialogs.
Erstellen Sie einen Bot, bis Sie ihn erhalten.
Dieses Mal werden wir einen Bot auf Slack erstellen. Wenn Sie kein Slack-Konto haben, erstellen Sie daher eines der folgenden. https://slack.com/
Bitte setzen Sie den Teamnamen usw. auf Yoshina.
Lassen Sie uns zunächst ein Slack Bot-Konto erstellen.
https://my.slack.com/services/new/bot
Es wird davon ausgegangen, dass das Team Slack bereits geöffnet und als autorisierter Benutzer angemeldet ist. Wenn Sie in diesem Zustand den obigen Link öffnen, wird der Bildschirm zur Erstellung des Bot-Kontos geöffnet. Geben Sie den Benutzernamen Ihres Bot-Kontos in das angezeigte Formular ein und klicken Sie auf "Bot-Integration hinzufügen".
Klicken Sie auf "Bot-Integration hinzufügen" und ein neues Formular wird angezeigt. Notieren Sie sich das darin enthaltene "API-Token", da es im Bot verwendet wird, der später erstellt wird.
Sie können den Namen und das Symbolbild des mit "Symbol anpassen" oder "Name anpassen" erstellten Bots ändern. Speichern Sie Ihre Änderungen mit "Integration speichern".
Erstellen wir einen privaten Kanal und registrieren den erstellten Bot anschließend für den Test. Speichern Sie den Inhalt nach dem Einstellen wie unten mit "Kanal erstellen".
Damit sind die Slack-Einstellungen abgeschlossen. Beginnen wir nun mit der Erstellung eines Bots.
Jetzt ist es Zeit, den Bot zu erstellen. Verwenden Sie die folgende Python-Bibliothek. lins05/slackbot
Die Installation erfolgt mit pip.
$ pip install slackbot
Wechseln Sie zunächst in das Verzeichnis für den Bot.
$ cd application
Beschreiben Sie nach dem Wechseln in das Anwendungsverzeichnis die Bot-Einstellungen in "slackbot_settings.py".
# -*- coding: utf-8 -*-
import os
API_TOKEN = os.environ.get('SLACK_API_KEY', '')
default_reply = "Suimasen. Das Wort Wakarimasen"
Hier liest API_TOKEN den zuvor angegebenen Wert aus der Umgebungsvariablen und verwendet ihn. Führen Sie daher den folgenden Befehl aus und legen Sie den Wert fest, den Sie zuvor in der Umgebungsvariablen notiert haben.
$ export SLACK_API_KEY=YOUR_API_KEY #Für die Eingabeaufforderung: set SLACK_API_KEY=YOUR_API_KEY
Schreiben Sie als Nächstes den Code zum Starten des Bot in "slack_bot.py".
# -*- coding: utf-8 -*-
from slackbot.bot import Bot
def main():
bot = Bot()
bot.run()
if __name__ == "__main__":
main()
Jetzt ist es Zeit, Bot zu starten.
$ python slack_bot.py
Reagieren Sie auf bestimmte Wörter in Erwähnungen oder auf Wörter, die auf dem Kanal veröffentlicht wurden.
Die hier gegebene Antwort ist auf das Standard-Plug-In der Slackbot-Bibliothek zurückzuführen. Dies allein ist nicht lecker, deshalb werde ich das Plug-In selbst registrieren und die Funktion erweitern. Lassen Sie uns das Plug-In als Nächstes selbst erstellen.
In Next erstellen wir einen Bot, um zum "Hallo" zum "Hallo" des Benutzers zurückzukehren. Die in diesem Artikel verwendete Python Slackbot-Bibliothek kann mit Plug-Ins erweitert werden. Indem Sie das Plug-In selbst implementieren, können Sie die Möglichkeit implementieren, auf bestimmte Wörter in direkten Nachrichten und Posts innerhalb des Kanals zu antworten, an dem der Bot teilnimmt.
Wechseln Sie zunächst in das Plug-In-Platzierungsverzeichnis im erstellten Bot-Verzeichnis.
$ cd plugins
Dieses Plugins-Verzeichnis enthält "\ _ \ _ init \ _ \ _. Py". Der Grund, warum diese Datei erforderlich ist, besteht darin, dass das als Slackbot-Plug-In zu ladende Verzeichnis ein Python-Paket sein muss. Daher ist "\ _ \ _ init \ _ \ _. Py" enthalten, damit es als Paket erkannt wird. Der Inhalt kann übrigens leer sein.
Nachdem Sie in das Plugin-Bereitstellungsverzeichnis gewechselt sind, erstellen wir das Plugin-Skript. Schreiben Sie den folgenden Code in "slack.py".
from slackbot.bot import respond_to
@respond_to('Hallo')
@respond_to('heute')
def hello(message):
message.reply('Hallo!')
Ein Dekorator namens "reply_to" wird der Funktion "Hallo" hinzugefügt.
Durch Angabe eines Schlüsselworts, das dem Argument des Dekorators "reply_to" entspricht, wird die Funktion registriert, um beim Laden des Plug-Ins auf Erwähnungen an den Bot zu reagieren. Schlüsselwörter können auch mit regulären Ausdrücken angegeben werden. Es ist auch möglich, mehrere Schlüsselwörter zu unterstützen, indem Sie mehrere Dekoratoren wie in diesem Beispiel hinzufügen.
Fügen Sie abschließend Folgendes zu "slackbot_settings.py" hinzu, damit das Plug-In geladen wird.
PLUGINS = [
'plugins',
]
Starten Sie Slackbot und senden Sie eine Erwähnung. Bitte fügen Sie @ hinzu. </ font>
$ python slack_bot.py
Sie können sehen, dass der diesmal erstellte Bot wie beabsichtigt reagiert.
Als nächstes verwenden wir reguläre Ausdrücke, um zu erfahren, was der Benutzer sagt. Versuchen Sie, "slack.py" wie folgt zu ändern.
# -*- coding: utf-8 -*-
from slackbot.bot import respond_to, listen_to
@listen_to('ich(.*)ist')
@listen_to('ich(.*)ist')
def hello(message, something):
message.reply('Hallo!{0}Herr.'.format(something))
Starten Sie Slackbot und lassen Sie uns posten. Bitte fügen Sie nicht @ hinzu. </ font>
$ python slack_bot.py
Sie können sehen, dass die Anmerkungen des Benutzers erfasst wurden.
Es gibt zwei Hauptunterschiede zwischen der vorherigen Hallo-Funktion und der aktuellen Hallo-Funktion. Zunächst verwenden wir diesmal den Dekorator "listen_to". Durch Angabe eines Wortes, das dem Argument des Dekorators "listen_to" entspricht, antwortet der Bot auf Beiträge auf den Kanälen, an denen er teilnimmt.
Der andere ist "(. \ *)" Im Dekorateur. Hierbei wird ein regulärer Ausdruck verwendet, und Sie können ihn mit einer beliebigen Zeichenfolge abgleichen, indem Sie "(. \ *)" Angeben. Außerdem wird der übereinstimmende Inhalt in einem der zweiten Argumente gespeichert. Daher konnte ich das Gesagte mit etwas zurückschicken.
Es ist für Bot noch einfacher, einfach zusammenzufassen, was der Benutzer sagt. Schreiben Sie einfach den Code wie folgt:
@respond_to('(.*)')
def refrection(message, something):
message.reply(something)
Reguläre Ausdrücke können nicht nur mit einer Zeichenfolge übereinstimmen, sondern auch nur mit Zahlen oder nur mit Großbuchstaben. Siehe unten für Details.
Wenn Sie einen regulären Ausdruck schreiben und ihn in Echtzeit mit einem Online-Editor überprüfen, können Sie sofort erkennen, mit welchem Muster der reguläre Ausdruck, den Sie schreiben, übereinstimmt, sodass Sie schneller arbeiten können.
Bisher wissen Sie, wie Sie mit der Slackbot-Bibliothek einen Slackbot erstellen. Von hier aus werden wir ein interaktives System erstellen, das Restaurants mit Python durchsucht. Erstellen Sie dann den Slackbot, indem Sie das in Slack integrierte Dialogsystem integrieren.
Das fertige Bild ist wie folgt. Dieser Bot kann im Dialog nach Restaurants suchen. Darüber hinaus ist es an sich nicht geschmackvoll, so dass es möglich ist, zu chatten. Lassen Sie uns nun die fertige Zeichnung erstellen, wenn wir sie kennen. Zunächst die Vorbereitung.
Installieren Sie die im Restaurant-Such-Bot verwendete Bibliothek. Führen Sie den folgenden Befehl aus, um die Bibliothek zu installieren.
$ pip install requests
$ pip install pyyaml
$ pip install doco
open(rst, 'r', encoding='utf-8')
$ python setup.py install
Legen Sie außerdem den API-Schlüssel fest, der von der Docomo-Chat-Dialog-API und der HotPepper-Gourmet-Such-API in der Umgebungsvariablen abgerufen wird.
$ export DOCOMO_DIALOGUE_API_KEY=YOUR_DOCOMO_API_KEY
$ export HOTPEPPER_API_KEY=YOUR_HOTPEPPER_API_KEY
Stellen Sie für eine Eingabeaufforderungsumgebung Folgendes ein.
$ set DOCOMO_DIALOGUE_API_KEY=YOUR_DOCOMO_API_KEY
$ set HOTPEPPER_API_KEY=YOUR_HOTPEPPER_API_KEY
Die Systemkonfiguration ist wie folgt. Es folgt die Konfiguration des grundlegenden Dialogsystems.
Die Verzeichnisstruktur ist wie folgt. Die Verzeichnisstruktur entspricht der Systemkonfiguration.
.
├── application #Slackbot erstellen
└── dialogue_system #Gesamtdialogsystem
├── language_generation #Sprachgenerator
├── language_understanding #Abteilung für Sprachverständnis
│ ├── attribute_extraction #Attributextraktion
│ ├── dialogue_act_type #Schätzung der Art des Dialogs
│ ├── language_understanding.py
│ └── utils
├── dialogue_management #Abteilung für Dialogmanagement
├── backend #Abteilung für externe Zusammenarbeit
│ └── apis
├── knowledge #Fachwissen
└── bot.py
Lassen Sie uns nun die Komponenten des Systems einzeln erstellen.
Nun, erstellen wir es zuerst in der Abteilung für Sprachverständnis. Wir werden die folgenden zwei Prozesse erstellen.
Es gibt zwei Hauptmethoden, um diese zu erstellen:
Es ist möglich, mithilfe der maschinellen Lernmethode ein robustes System zu erstellen, aber es ist ziemlich schwierig, die Daten vorzubereiten. Erstellen wir daher zunächst eine regelbasierte Methode, für die keine Trainingsdaten erforderlich sind und die relativ einfach zu erstellen ist.
Die Verzeichnisstruktur der Abteilung Sprachverständnis ist wie folgt.
.
└── language_understanding #Abteilung für Sprachverständnis
├── attribute_extraction #Attributextraktion
├── dialogue_act_type #Schätzung der Art des Dialogs
├── language_understanding.py #Integration von Attributextraktion und Interaktionstypschätzung
└── utils #Bequeme Funktion
Wenn die Sprachverständnisabteilung den vom Benutzer eingegebenen Text erhält, extrahiert sie die Attribute. Die Attribute, die dieses Mal extrahiert werden müssen, sind die folgenden drei. Verwenden Sie diese drei Informationen bei der Suche nach Restaurants.
Es gibt eine Methode zur Schlüsselwortextraktion als Methode zur Attributextraktion basierend auf Regeln. Dies ist eine Methode, um im Voraus ein Wörterbuch mit Orten und Kochgenres zu erstellen und den passenden Teil während der Rede des Benutzers zu extrahieren. Wenn der Benutzer beispielsweise sagt, dass "Shinjuku ein guter Ort ist" und das Schlüsselwort "Shinjuku" im Ortswörterbuch enthalten ist, kann "Shinjuku" als Ort aus der Sprache des Benutzers extrahiert werden.
Die Verzeichnisstruktur des Attributextraktionsteils ist wie folgt.
.
└── attribute_extraction #Attributextraktion
├── __init__.py
└── rule_based_extractor.py
rule_based_extractor.py sieht folgendermaßen aus: attribute_extraction/rule_based_extractor.py
Sie können Attribute wie folgt extrahieren.
from rule_based_extractor import RuleBasedAttributeExtractor
extractor = RuleBasedAttributeExtractor()
attribute = extractor.extract(text='Ich möchte Ramen essen')
print(attribute)
>>> {'LOCATION': '', 'GENRE': 'Ramen', 'MAXIMUM_AMOUNT': ''}
Wenn die Sprachverständnisabteilung den vom Benutzer eingegebenen Text erhält, schätzt sie die Art der Interaktion. Die folgenden vier Arten von Dialogen werden dieses Mal geschätzt.
Wir werden das Ergebnis der Attributextraktion verwenden, um den Interaktionstyp abzuschätzen. Wenn bei dieser Methode das Kochgenre als Attribut extrahiert wird, wird das Genre als Dialogtyp geschätzt, und wenn der Ort extrahiert wird, wird der Ort als Dialogtyp geschätzt. Wenn nichts als Attribut extrahiert wird, schätzen wir Other (OTHER) als Interaktionstyp.
Die Verzeichnisstruktur des Interaktionstyp-Schätzungsteils ist wie folgt.
.
└── dialogue_act_type #Schätzung der Art des Dialogs
├── __init__.py
└── rule_based_estimator.py
rule_based_estimator.py ist ein einfacher Code wie folgt: dialogue_act_type/rule_based_estimator.py
Nach Überprüfung des Vorgangs ist dies wie folgt.
from rule_based_extractor import RuleBasedAttributeExtractor
from rule_based_estimator import RuleBasedDialogueActTypeEstimator
extractor = RuleBasedAttributeExtractor()
estimator = RuleBasedDialogueActTypeEstimator()
attribute = extractor.extract(text='Ich möchte Ramen essen')
act_type = estimator.estimate(attribute)
print(act_type)
>>> 'INFORM_GENRE'
Zu diesem Zeitpunkt haben wir Attribute extrahiert und die Art der Interaktion geschätzt. Integrieren Sie diese als Nächstes und erstellen Sie den Code der Sprachverständnisabteilung in "language_understanding.py".
Der Code ist unten. language_understanding/language_understanding.py
Die Abteilung Dialogmanagement führt die folgenden zwei Prozesse basierend auf dem Ergebnis des Input-Verständnisses durch (Dialog Act).
Die Verzeichnisstruktur der Dialogmanagementabteilung ist wie folgt.
.
└── dialogue_management #Abteilung für Dialogmanagement
├── __init__.py
├── manager.py
└── state.py
Schauen wir uns jeden an.
Bei der internen Statusaktualisierung wird der interne Status des interaktiven Systems basierend auf dem Ergebnis des Sprachverständnisses aktualisiert. Aktualisieren Sie den internen Status mithilfe von Regeln. Der interne Zustand kann auch verschiedene Informationen enthalten, diesmal wird jedoch der Einfachheit halber nur die Absicht des Benutzers angegeben. Die Absicht des Benutzers sind die Attribute und Attributwerte, die in der Vergangenheit erhalten wurden. Insbesondere enthält es die folgenden Informationen.
Schreiben Sie zunächst eine Klasse, die sich auf den Status bezieht, der beibehalten werden soll. Ich werde eine Statusaktualisierungsmethode in diese Klasse schreiben. dialogue_management/state.py
Als nächstes werden wir eine Klasse schreiben, die den Dialog verwaltet. Die Konversationsverwaltungsklasse delegiert den Statusaktualisierungsprozess an die Statusklasse. dialogue_management/manager.py
Der Aktionsauswahlabschnitt entscheidet die nächste Aktion basierend auf dem internen Status und den Regeln. Insbesondere wird der Interaktionstyp ausgegeben und an die nächste Sprachgeneration übergeben. Basierend auf diesem Interaktionstyp generiert der Sprachgenerator den Text. Rufen Sie bei Bedarf den externen Link an.
Wir werden den Aktionsauswahlalgorithmus in die Dialogverwaltungsklasse schreiben, die in der internen Statusaktualisierung geschrieben wurde. Die Auswahl der Aktion erfolgt gemäß der folgenden Richtlinie.
Bedingungen | Inhalt |
---|---|
IF(Benutzerinteraktionstyp=OTHER) | Dialogtyp zum Chatten(CHAT)Ausgabe |
IF(Einige Attributwerte sind nicht gefüllt) | Ausgabedialogtyp, um nicht ausgefüllte Attribute herauszufinden |
IF(Alle Attributwerte werden gefüllt) | Dialogtyp, der ein Restaurant präsentiert(INFORM_RESTAURANT)Ausgabe |
Der tatsächliche Code ist unten. dialogue_management/manager.py
Die Sprachgenerierungsabteilung generiert die Sprache basierend auf den Regeln und den Dialogaktionen, die von der Dialogverwaltungsabteilung erhalten wurden.
Die Verzeichnisstruktur des Sprachgenerators ist wie folgt.
.
└── language_generation #Sprachgenerator
├── __init__.py
└── generator.py
Die Sprachgenerierung wird gemäß der folgenden Richtlinie durchgeführt.
Bedingungen | Inhalt |
---|---|
IF(Dialogtyp=REQUEST_LOCATION) | Hören Sie sich den Ort an |
IF(Dialogtyp=REQUEST_GENRE) | Hören Sie sich das Genre an |
IF(Dialogtyp=REQUEST_BUDGET) | Fragen Sie nach Ihrem Budget |
IF(Dialogtyp=CHAT) | Plaudern |
IF(Dialogtyp=INFORM_RESTAURANT) | Schlagen Sie ein Restaurant vor |
Hier wird die Chat-Dialog-API von docomo beim Chatten aufgerufen, und die HotPepper-Gourmet-Such-API wird aufgerufen, wenn ein Restaurant vorgeschlagen wird.
Der tatsächliche Code lautet wie folgt. language_generation/generator.py
Damit ist die Komponentenerstellung des interaktiven Systems abgeschlossen. Ich werde eine Bot-Klasse erstellen, die diese kombiniert. Innerhalb dieser Bot-Klasse arbeiten die Komponenten des Interaktionssystems zusammen, um eine Antwort an den Benutzer zu generieren. dialogue_system/bot.py
Wir werden die erstellte Bot-Klasse in Slackbot integrieren. Erstellen Sie ein neues Plug-In und schreiben Sie den folgenden Code. application/plugins/slack.py
Führen Sie nach dem Einbetten slackbot aus.
$ python slack_bot.py
Nach der Ausführung wird der Bot angezeigt und Sie können interagieren.
Dieses Mal wurde es von der Abteilung für Sprachverständnis durch Schlüsselwortextraktion und Regeln erstellt. Die Schlüsselwortextraktion kann jedoch keine Wörter extrahieren, die nicht im Wörterbuch enthalten sind. Um dieses Problem zu beheben, können Sie mithilfe von maschinellem Lernen Attribute extrahieren. Das Schätzen der Art des Dialogs kann auch als eine Frage der Satzklassifizierung betrachtet werden. Dies kann auch durch maschinelles Lernen geschätzt werden. In jüngster Zeit wurden APIs für maschinelles Lernen verbessert. Verwenden Sie sie daher, um Ihr Sprachverständnis zu verbessern.
Dies ist Miso, aber im folgenden Artikel verstehen wir Sprachen mithilfe von maschinellem Lernen.
Auch das Dialogmanagement mit Regeln ist einfach und leicht zu verstehen, aber mit zunehmender Anzahl von Regeln wird es unmöglich, es zu verwalten und zu ändern. Eine andere Möglichkeit besteht darin, erweitertes Lernen zu verwenden, um das Problem anzugehen. Darüber hinaus kann im Fall eines Sprachinteraktionssystems die Eingabe Fehler enthalten. Es wurden auch Untersuchungen durchgeführt, um Eingabefehler mithilfe eines Rahmens für verbessertes Lernen namens POMDP zu beheben. Wenn Sie interessiert sind, versuchen Sie bitte, den Dialog mithilfe von erweitertem Lernen zu verwalten.
Dieses Mal habe ich auf Slack ein Dialogsystem für die Restaurantsuche aufgebaut. Dies ist das Ende der praktischen Arbeit. Wie war das. Es war ein einfaches regelbasiertes aufgabenorientiertes Dialogsystem, aber ich hoffe, Sie können verschiedene Möglichkeiten spüren, indem Sie es zu SlackBot machen. Lassen Sie uns über einen Mechanismus nachdenken, der es intelligenter macht, indem er mit anderen Web-APIs und APIs für maschinelles Lernen kombiniert wird!
Recommended Posts