Sprachbot + Telefonie auf OpenSource. Teil 1 - Erstellen und Trainieren eines Textbots RU



Heutzutage werden Sprachroboter immer beliebter, von der banalen Bestellung eines Taxis bis zum Verkauf an Kunden. Das Erstellen eines Sprachbots besteht aus drei grundlegenden Schritten.



  1. ASR-Spracherkennung.
  2. Klärung der Bedeutung des Gesagten und Suche nach den erforderlichen Entitäten im Text (z. B. Adresse, Betrag, vollständiger Name usw.)
  3. Generieren einer Antwort, Konvertieren von Text in Sprach-TTS. Wir werden vom Weg der Erstellung eines einfachen Textbots zur Integration in das Freeswitch-Telefoniesystem mit Spracherkennung und Voice-Over vorbereiteter Antworten übergehen. Dieser Artikel beschreibt die verwendeten Tools und die Art und Weise, sie zu integrieren, um einen Sprachroboter zu erstellen.


Im ersten Teil geht es darum, einen einfachen Textbot zu erstellen, den Sie in einen Chat einbetten können.



Beispiel eines Gesprächs B-Bot W-Mann



:       
:
: 

:    ?
: 

:  ?
:?     

:
:  


Ein bisschen Theorie Der



Bot arbeitet nach dem Prinzip der Benutzerabsicht. Jede Absicht hat eine Liste vorbereiteter Antworten. Damit der Bot die Absicht des Benutzers verstehen kann, muss das Modell auf dem Datensatz mit Absichten und Phrasen trainiert werden, die diese Absicht aktivieren können.



Zum Beispiel



Absicht: Sag Hallo

Mögliche Sätze: Hallo, guten Tag, gratuli ...

Antwort: Hallo



Absicht: Sag auf Wiedersehen

Mögliche Sätze: Tschüss, tschüss , Auf Wiedersehen ...

Antwort: Tschüss



Schritt 1: Vorverarbeitung des Datensatzes



Es basiert auf einem Datensatz aus dem offenen Skillbox-Training zum Schreiben eines Chat-Bots in Telegrammen, die mit Ihnen über Kino sprechen können. Ich kann es aus offensichtlichen Gründen nicht posten.

Die Vorverarbeitung ist ein sehr wichtiger Schritt.



Der erste Schritt besteht darin, alle Symbole und Zahlen aus dem Text zu entfernen und alles in Kleinbuchstaben zu bringen.



Als nächstes müssen Sie Tippfehler und Fehler in Worten korrigieren.



 - 


Diese Aufgabe ist nicht einfach, es gibt ein gutes Tool von Yandex namens Speller, aber die Anzahl der Anfragen pro Tag ist begrenzt.

Daher werden wir nach kostenlosen Alternativen suchen. Für Python gibt es eine wunderbare Jamspell- Bibliothek , die Tippfehler gut korrigiert. Es gibt eine gute Pre - ausgebildete russische Sprache Modell für sie. Lassen Sie uns alle Eingabedaten durch diese Bibliothek laufen. Für einen Sprachbot ist dieser Schritt nicht so relevant, da das Spracherkennungssystem keine fehlerhaften Wörter ausgeben sollte, sondern das falsche Wort ausgeben kann. Dieser Vorgang ist für einen Chat-Bot erforderlich. Um den Einfluss von Tippfehlern zu minimieren, können Sie das Netzwerk nicht in Worten, sondern in n-Gramm trainieren.



N-Gramm sind n-Buchstaben-Teile von Wörtern. Zum Beispiel werden die 3 Gramm für das Wort Hallo sein

bei, riv, weide, tierarzt. Dies hilft Ihnen, weniger von Tippfehlern abhängig zu sein und die Erkennungsgenauigkeit zu erhöhen.



Als nächstes müssen Sie die Wörter in ihre normale Form bringen, den sogenannten Prozess der Wortmemmatisierung.



  -  


Die Rulemma- Bibliothek ist für diese Aufgabe gut geeignet .



Sie können Stoppwörter auch aus Phrasen entfernen, die wenig semantische Last tragen, aber die Größe des neuronalen Netzwerks erhöhen (ich habe sie aus der Bibliothek nltk stopwords.words ("russisch") entnommen). In unserem Fall ist es jedoch besser, sie nicht zu entfernen, da der Benutzer antworten kann ein Roboter mit nur einem Wort, aber es kann aus der Liste der Stoppwörter stammen.



Schritt 2: Konvertieren des Datensatzes in eine verständliche Form für NN



Zunächst müssen Sie ein Wörterbuch aller Wörter im Datensatz erstellen.



Um das Modell zu trainieren, müssen Sie alle Wörter in oneHotVector übersetzen.

Dies ist ein Array, das der Länge des Wörterbuchs entspricht, in dem alle Werte gleich 0 sind und nur einer an der Position des Wortes im Wörterbuch gleich 1 ist.



Außerdem werden alle Eingabephrasen in ein dreidimensionales Array konvertiert, das alle Phrasen enthält. Die Phrase enthält eine Liste von Wörtern im oneHotVector-Format - dies ist unser Eingabe-X_train-Datensatz.



Jede Eingabephrase muss mit einer geeigneten Absicht im selben HotVector-Format abgeglichen werden - dies ist unsere y_train-Ausgabe.



Schritt 3: Erstellen des Modells



Für einen kleinen Bot reicht ein kleines Modell mit zwei lstm-Schichten und zwei vollständig verbundenen Schichten aus:



model = Sequential()
model.add(LSTM(64,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(32))
model.add(Dropout(0.25))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))


Wir kompilieren das Modell und wählen einen Optimierer aus. Ich habe mich für Adam entschieden, da es das beste Ergebnis liefert.



Schritt 4: Trainieren Sie das Modell



Nachdem Sie den Datensatz vorbereitet und das Modell kompiliert haben, können Sie mit dem Training beginnen. Da der Datensatz klein ist, musste ich das Modell für 250-500 Epochen trainieren, wonach die Umschulung stattfand.



Schritt 5: Versuchen Sie, mit unserem Bot zu sprechen



Um mit unserem Bot zu sprechen, müssen Sie korrekt vorbereitete Daten an die Eingabe des trainierten Modells senden. Benutzereingaben müssen auf die gleiche Weise wie der Datensatz aus dem ersten Schritt verarbeitet werden. Transformieren Sie es dann in eine für NN verständliche Form wie im zweiten Schritt, indem Sie dasselbe Wörterbuch und ihre Indizes verwenden, sodass die eingegebenen Wörter den Wörtern entsprechen, an denen das Training durchgeführt wurde.



Die verarbeitete Eingabe wird in das Modell eingespeist und wir erhalten ein Array von Werten, in denen die Wahrscheinlichkeiten unserer Phrase, die eine bestimmte Absicht treffen, vorhanden sind. Wir müssen jedoch die Absicht mit der höchsten Wahrscheinlichkeit auswählen. Dies kann über die Numpy-Bibliothek erfolgen



np.argmax(results)


Es ist notwendig, das Vertrauen des Netzwerks in diese Antwort zu bewerten und den Schwellenwert auszuwählen, ab dem Fehlerphrasen an den Benutzer ausgegeben werden sollen, z. B. - Ich verstehe Sie nicht. Für meine eigenen Zwecke habe ich einen Schwellenwert von 50% festgelegt, unterhalb dessen der Bot sagt, dass er Sie nicht verstanden hat.



Als nächstes wählen wir aus der Liste unserer Absichten die geeignete Antwort aus und geben sie dem Benutzer



PS: Das Modell kann nicht nur anhand von Wörtern trainiert werden, sondern auch durch Unterteilen von Phrasen in Buchstaben oder n-Gramm. In diesem Fall wird ein ernsthafteres Modell benötigt.



model = Sequential()
model.add(LSTM(512,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(256))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))



All Articles