Wir werden bald immer mehr Chatbots sehen. Hier und dort werden vermehrt einfache Sprachsysteme eingesetzt werden. Und woanders wird es die großen Systeme geben, die dazu lernen und ein ordentliches Gedächtnis haben. Und wir werden Chatbots in vielen Sprachen kennenlernen. Warum also nicht auch Chatbots auf Hindi?
Kleine Exercises halten den Geist wach.
Wer achtsam meinen Blog verfolgt hat, weiß, dass hier grad eine Kleinstserie entsteht. Der Focus liegt auf dem Natural-Language-Processing, also der Computerlinguistik. Das ist ein spannendes Thema und eines der Anwendungsgebiete von Deep Learning. Sprachverarbeitung und Bildverarbeitung sind die größten Themen im Deep-Learning.
Im ersten Blog-Eintrag der Serie – Conversational Agents mit Keras – habe ich mich mit einem einfachen Chatbot auseinandergesetzt. Dieser basiert auf dem Deep-Learning-Framework Keras und arbeitet mit dem Bag-of-Words-Modell um Sätze zu kodieren.
Danach habe ich mich auf den Forschungsweg gemacht, weil mich zwei Fragen wurmen. In Word-Embeddings auf Deutsch schaue ich mir beide an. Was muss man machen um einen Chatbot Deutsch zu lehren? Und welche Alternativen hat man zum Bag-of-Words-Modell?
Meine Partnerin ist eine Indologin und wir teilen die Neigung zur indischen Kultur. Kleine Exercises halten den Geist wach und so haben wir uns in einer ruhigen Minute etwas Besonderes angesehen. Wir haben den bestehenden Chatbot genommen und auf Hindi übersetzt, in eine Sprache der Inder.
Was ist Hindi eigentlich?
Hindi ist auf Platz drei der meist-verbreitetsten Sprachen der Welt. Mehr als eine halbe Milliarde Sprecher gibt es Stand heute. Hindi wird hauptsächlich in Indien gesprochen. Und rein theoretisch ist sie leicht zu lernen für Menschen, die Deutsch können. Der Grund ist einfach. Beide Sprachen sind indogermanisch und damit verwandt. Eine Lernhürde ist – wie wir gleich sehen werden – die Schrift: Devanāgarī sieht halt ein wenig anders aus, als das was wir gewöhnt sind. Der Inder sagt zum Gruße „नमस्ते“, also „Namaste“.
Hindi hat satte 53 Phoneme. Das sind Laute in der Sprachwissenschaft. Deutsch erblasst dagegen mit seinen „nur“ 25 und ist hier im globalen Durchschnitt. Vom Vokabular her sieht man Prägungen durch das Sanskrit (quasi dem Latein der Inder) dem Persischen und dem Englischen. Da kommt einiges zusammen und doch ist vieles übertragbar.
Das sollte reichen für den kleinen Sprach-Exkurs 🙂 Back to business!
Wie mache ich den Chatbot reif für den indischen Subkontinent? Oder: Wie erschaffe ich Chatbots in vielen Sprachen?
Bevor man einem Chatbot überhaupt ein helfendes Wissen einpflanzen kann, muss man tiefer ansetzen. Ohne die Sprache selbst wird es keine künstliche Unterstützung auf Sprachbasis geben. Der bereits bekannte Bag-of-Words-Ansatz macht es einfach. Hier geht man in der Regel von einem kleinen Vokabular aus. Das muss man quasi so annehmen, weil die Größe des Vokabulars die Größe der Vektoren bestimmt in die die Texte kodiert werden. Die Gefahr besteht also dass die Performance leidet, wenn der zugrundeliegende Sprachschatz zu umfangreich ist. Einhundert Worte im Vokabular liefert Vektoren der Länge einhundert. Und wenn man dran denkt, dass man mehrere zehntausend Worte braucht um sich auf Deutsch zu verständigen, kriegt man schon ein leichtes Grummeln in der Magengegend.
Für den Chatbot brauchen wir zum Glück kein großes Vokabular. Das was er braucht ist in der Größe zweistellig. Das liegt daran, dass er eigentlich nur auf Signalwörter lauscht und dann entsprechende vorformulierte Textblöcke liefert. Die Vorarbeit für den Hindi-Chatbot wird recht einfach. Man muss nur eine Spezifikations-Datei auf Hindi liefern. Etwa diese hier:
{"intents": [ {"tag": "greeting", "patterns": ["नमस्ते", "कैसे हैं ?", "क्या कोई है ?", "हालो", "शुभ दिन"], "responses": ["नमस्ते, आपके पधारने का धन्यवाद", "आपसे फिर मिलकर मुझे बहुत ख़ुशी है ", "नमस्ते, क्या मैं आपकी मदद कर सकती हूँ?"], "context_set": "" }, {"tag": "goodbye", "patterns": ["नमस्ते", "फिर मिलेंगे", "अलविदा!"], "responses": ["बाद में मिलते हैं, आपके पधारने का धन्यवाद", "आपका दिन अच्छा हो", "नमस्ते. जल्द ही वापस आईये."] }, {"tag": "thanks", "patterns": ["धन्यवाद", "बहुत धन्यवाद", "यह बहुत मददगार है"], "responses": ["किसी भी समय !", "मुझे मदद करना पसंद है!", "यह तो मैंने अपनी ख़ुशी से किया था!"] }, {"tag": "hours", "patterns": ["कब खुली है?", "दुकान कब खुलती है?" ], "responses": ["हर दिन ९ बजे से ९ बजे तक खुली है", "९ बजे से ९ बजे तक"] }, {"tag": "mopeds", "patterns": ["आपके पास कौनसे मोपेड हैं?", "कौनसे मोपेड उपलब्ध हैं?", "आप क्या किराये पर देते हैं?" ], "responses": ["हम Yamaha, Piaggio और Vespa की मोपेड किराये पर देते हैं.", "हमारे पास Piaggio, Vespa और Yamaha हैं."] }, {"tag": "payments", "patterns": ["क्या आप क्रेडिट कार्ड लेते हैं?", "क्या आप क्रेडिट कार्ड विकार करते हैं?", "क्या आप सिर्फ़ केश लेंगे?" ], "responses": ["हम वीज़ा, मास्टरकार्ड और AMEX विकार करते हैं.", "हम हर महत्त्व का क्रेडिट कार्ड विकार करते हैं."] }, {"tag": "opentoday", "patterns": ["क्या आज खुली है?", "आज कब खुली है", "दुकान आज कब खुलती है?"], "responses": ["हर दिन ९ बजे से ९ बजे तक खुली है.", "९ बजे से ९ बजे तक."] }, {"tag": "rental", "patterns": ["क्या हम मोपेड किराये पर ले सकते हैं?", "मैं मोपेड किराये पर लेना चाहता हूँ.", "यह कैसे कम करते हैं?" ], "responses": ["क्या आप आज या हफ्ते में किराये पर लेना चाहते हैं?"], "context_set": "rentalday" }, {"tag": "today", "patterns": ["आज"], "responses": ["जब आप आज किराये पर लेना चाहते हैं तो ज़रा १-८००-MYNOPED फ़ोन कीजिए.", "इस दिन पर किराए पर लेने के लिए १-८००-MYNOPED फ़ोन कीजिए."], "context_filter": "rentalday" } ] }
Absolut lesbar! Auf diesem Textkorpus kann man jetzt das vorhandene Neuronal-Network trainieren. Das musste ich nicht einmal anpassen. Es ist dasselbe wie für Deutsch und Englisch. Dieser Weg zu den Chatbots in vielen Sprachen ist also ein einfacher.
Eine ganze Konversation sieht dann so aus:
Context: Text: क्या आपकी दूकान आज खुली है? Prediction: opentoday Response: ९ बजे से ९ बजे तक. New context: Context: Text: क्या आप केश लेते हैं? Prediction: payments Response: हम हर महत्त्व का क्रेडिट कार्ड विकार करते हैं. New context: Context: Text: आप कौनसे मोपेड किराये पर देते हैं? Prediction: mopeds Response: हम Yamaha, Piaggio और Vespa की मोपेड किराये पर देते हैं. New context: Context: Text: नाम्स्ते, बाद में मिलते हैं Prediction: greeting Response: नमस्ते, आपके पधारने का धन्यवाद New context: Context: Text: हम मोपेड किराये पर लेना चाहते हैं Prediction: greeting Response: नमस्ते, क्या मैं आपकी मदद कर सकती हूँ? New context: Context: Text: आज Prediction: today Response: इस दिन पर किराए पर लेने के लिए १-८००-MYNOPED फ़ोन कीजिए. New context:
Beeindruckend oder? Ich gebe zu, ich kann das nicht lesen 🙂 Ich habe das aber von der Indologin an meiner Seite prüfen lassen.
Abschließende Worte.
Dieser Artikel zeigt, dass es einfach sein kann einen Chatbot in eine andere Sprachdomäne zu überführen. Die bestehenden Grenzen des Sprachverständnisses bleiben bestehen. Ich bleibe weiter dran.
Das Ganze ist wie immer in meinem GitHub-Repository zu finden. Viel Spaß beim Ausprobieren. Namaste!