[PYTHON] Natürliche Sprache: ChatBot Part1-Twitter API Corpus

Ziel

Wir haben die Chatbots mit dem Microsoft Cognitive Toolkit (CNTK) zusammengefasst.

Teil 1 bereitet Sie darauf vor, Ihren Chatbot mit dem Microsoft Cognitive Toolkit zu trainieren.

Ich werde sie in der folgenden Reihenfolge vorstellen.

  1. Registrieren Sie sich für Twitter Developer
  2. Sammeln von Konversationsdatensätzen mithilfe der Twitter-API
  3. Vorverarbeitung von Textdaten und Erstellung eines Satzstückmodells
  4. Erstellen einer Datei, die von dem von CNTK bereitgestellten integrierten Reader gelesen werden soll

Einführung

Es wird davon ausgegangen, dass Sie über ein Twitter-Konto verfügen und über Linux verfügen.

Registrieren Sie sich für Twitter Developer

Bewerben Sie sich für Twitter Developer

Twitter - Developer

Gehen Sie zur obigen Seite und klicken Sie oben rechts auf Übernehmen.

Klicken Sie auf Für ein Entwicklerkonto anwenden und wählen Sie das Twitter-Konto aus, das Sie verwenden möchten.

Wählen Sie dann einige grundlegende Elemente aus. Während Sie den Vorgang durchlaufen, werden Sie aufgefordert, jeweils etwa 100 bis 200 Zeichen zu schreiben, z. B. welchen Zweck Sie verwenden und wie Sie die Twitter-API und -Daten verwenden. Aber auch einfaches Englisch ist ein Problem. Es scheint, dass es so etwas nicht gibt, also schreiben wir ehrlich den Verwendungszweck.

Wenn Sie die Registrierungsdetails bestätigen und sich bei Twitter Developer bewerben, wird die E-Mail mit der Annahme der Anwendung an die E-Mail-Adresse gesendet, die mit dem für die Registrierung verwendeten Twitter-Konto verknüpft ist. Warten Sie also auf das Prüfungsergebnis. Sie erhalten frühestens innerhalb eines Tages eine E-Mail mit den Prüfungsergebnissen.

In diesem Stadium erhalten Sie möglicherweise erneut eine E-Mail von Twitter Developer und fragen nach der Verwendung der Twitter-API auf Japanisch. Es scheint jedoch kein Problem zu geben, wenn Sie den auf Englisch gehorsam geschriebenen Inhalt gehorsam ins Japanische übersetzen. Ich werde.

Holen Sie sich den API-Schlüssel und das Zugriffstoken

Rufen Sie als Nächstes den API-Schlüssel, den geheimen API-Schlüssel, das Zugriffstoken und das geheime Zugriffstoken ab, um die Tweets und Antworten abzurufen.

Klicken Sie auf Apps-> App erstellen und Sie werden nach dem Namen der App, die Sie erstellen möchten, der Website und der Art und Weise, wie Sie sie verwenden möchten, gefragt.

Sobald die App erstellt wurde, sehen Sie den API-Schlüssel und den geheimen API-Schlüssel in Schlüssel und Token auf der Detailseite der erstellten App.

Notieren Sie sich das Zugriffstoken und das Geheimnis des Zugriffstokens, da diese nur einmal angezeigt werden, indem Sie auf die Schaltfläche "Generieren" klicken.

Sammeln von Konversationsdatensätzen mithilfe der Twitter-API

Sobald Sie sich bei Twitter Developer registriert und den API-Schlüssel, den API-Geheimschlüssel, das Zugriffstoken und das Zugriffstoken-Geheimnis erhalten haben, können Sie Tweets und Antworten sammeln.

Installieren Sie tweepy, um mit der Twitter-API in Python zu arbeiten. Die Twitter-API bietet viele Funktionen, aber dieses Mal habe ich beschlossen, die veröffentlichten Tweets und eine Antwort darauf als eine Konversation zu sammeln und als Textdatei mit bis zu 100 Konversationen gleichzeitig zu speichern.

Die Verzeichnisstruktur ist diesmal wie folgt.

Doc2Vec STSA  |―twitter   |―20200401_000000.txt   |―...  stsa_corpus.py  stsa_twitter.py Word2Vec

Vorverarbeitung von Textdaten und Erstellung von Satzteilen

Verarbeiten Sie die Textdaten vor dem Sammeln des Tweet- und Antwortkonversationsdatensatzes.

Dieses Mal habe ich die Textbereinigung mit den Python-Standardmodulen re und emoji ausgeführt.

In Word2Vec und Doc2Vec ist MeCab in Wörter unterteilt. Ich habe es ausgeführt, um ein Wortwörterbuch zu erstellen, aber dieses Mal werde ich ein Unterwortmodell mit Satzstück erstellen.

Erstellen einer Datei zum Lesen durch den von CNTK bereitgestellten integrierten Reader

Nach der Konvertierung in Wort-IDs mithilfe des mit den Trainingsdaten trainierten Satzstückmodells können Sie eine Textdatei für den CTFDeserializer erstellen, mit dem Ihr Chatbot trainiert wird.

CTFDeserializer wird in Computer Vision: Bildunterschrift Teil1 - STAIR-Untertitel eingeführt.

Implementierung

Ausführungsumgebung

Hardware-

・ CPU Intel (R) Core (TM) i7-9750H 2,60 GHz

Software

・ Windows 10 Pro 1909 ・ Python 3.6.6 ・ Emoji 0.5.4 ・ Satzstück 0.1.86 ・ Tweepy 3.8.0

Programm zum Ausführen

Das implementierte Programm wird auf GitHub veröffentlicht.

stsa_twitter.py


stsa_corpus.py


Kommentar

Ich werde einige Teile des auszuführenden Programms extrahieren und ergänzen.

Textbereinigung

Die Textbereinigung ist wichtig, da die von uns gesammelten Tweets und Antworten viel Rauschen enthalten.

Entfernen von Twitter-spezifischen http-Links, @ Benutzer-IDs und #Tags

text_cleaning


s = re.sub(r"http\S+", "", s)  # remove https
s = re.sub(r"\@[a-z0-9-_][a-z0-9-_]*", "", s)  # remove @tweet
s = re.sub(r"\#.+", "", s)  # remove #tag

Normalisierung verschiedener Symbole

text_clearning


s = re.sub("[˗֊‐‑‒–⁃⁻₋−]+", "-", s)  # normalize hyphens
s = re.sub("[- ---- ━ ━- -]+", "- -", s)  # normalize choonpus
s = re.sub("[~∼∾〜〰~]", "", s)  # remove tildes

s = s.lower()  # normalize alphabet to lowercase
s = s.translate({ord(x): ord(y) for x, y in zip(  # normalize half-width symbols to full-width symbols
    "!\"#$%&'()*+,-./:;<=>?@[¥]^_`{|}~¡, ・ """,
    "!! # $% & '() * +, -. / :; <=>? @ [\] ^ _` {|} ~., ・")})

Reduzierte Redundanz

text_clearning


s = re.sub(r"!+", "!", s)
s = re.sub(r"??+", "?", s)
s = re.sub(r"…+", "…", s)
s = re.sub(r"w+w", "。", s)

Entfernung von Piktogrammen und Emblemen

text_clearning


s = "".join(["" if c in emoji.UNICODE_EMOJI else c for c in s])  # remove emoji
s = re.sub(r"(.*).*", "", s)  # remove kaomoji

Das ist nicht perfekt, aber die Ergebnisse sind fair.

Satzstückmodelltraining

Klonen Sie zuerst SentencePiece von GitHub und erstellen Sie es. Das Folgende läuft auf einer Linux-Distribution.

$ git clone https://github.com/google/sentencepiece.git

$ sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev

$ cd sentencepiece
$ mkdir build
$ cd build
$ cmake ..
$ make -j $(nproc)
$ sudo make install
$ sudo ldconfig -v

Am Ende des Trainings werden twitter.model und twitter.vocab erstellt. Standardmäßig wird dem Satzstückmodell 0, 1 und 2 für unbekannte Wörter (Start und Ende) zugewiesen.

Tweet und Antwort Konversationsdatensatz

In der gespeicherten Tweet- und Antworttextdatei befinden sich Tweet und Antwort in einer Konversation mit zwei Zeilen.

Die Textbereinigung kann zu null Wörtern führen. Sie müssen daher sicherstellen, dass mindestens ein Wort vorhanden ist.

stsa_preprocessing


for idx in range(len(corpus) // 2):
    tweet = text_cleaning(corpus[2 * idx])
    reply = text_cleaning(corpus[2 * idx + 1])

    if len(tweet) == 0 or len(reply) == 0:
        continue
    else:
        f.write("%s\n" % tweet)
        f.write("%s\n" % reply)

Da Tweets und Antworten unterschiedliche Serienlängen haben können, wird die Länge von Tweets und Antworten mithilfe von zip_longest des Python-Standardmoduls itertools angepasst, um eine Textdatei zu erstellen, die vom integrierten Reader gelesen werden kann.

stsa_sentencepiece


with open("./tweet_reply_corpus.txt", "w") as ctf_file:
    for i, (tweet, reply, target) in enumerate(tweet_reply):
        for (twt, rep) in zip_longest(tweet, reply, fillvalue=""):
            if twt == "":
                ctf_file.write("{} |reply {}:1\n".format(i, rep))
            elif rep == "":
                ctf_file.write("{} |tweet {}:1\n".format(i, twt))
            else:
                ctf_file.write("{} |tweet {}:1\t|reply {}:1\n".format(i, twt, rep))

Ergebnis

Führen Sie zunächst stsa_twitter.py aus, um Tweets und Antworten zu sammeln.

  1 : @user_id ...
  2 : @user_id ...
...

Der auf GitHub veröffentlichte Code behandelt Ausnahmen nicht vollständig. Wenn Sie ihn also so ausführen, wie er ist, wird er alle 24 Stunden gestoppt. Überprüfen Sie ihn daher bitte jeden halben Tag.

Nach dem Sammeln der erforderlichen Datenmenge generiert die Funktion stsa_preprocessing ein Twitter-Konversationskorpus twitter.txt, das aus einem textbereinigten Tweet- und Antwortpaar besteht.

Number of tweet and reply: 1068294

Dann trainieren Sie das Satzstückmodell. Das Training beginnt mit dem Setzen der Argumente wie unten gezeigt. Ich habe die Anzahl der Wörter auf 32.000 festgelegt.

$ spm_train --input=/mnt/c/.../twitter.txt --model_prefix=twitter --vocab_size=32000

Am Ende des Trainings werden twitter.model und twitter.vocab erstellt.

Führen Sie abschließend die Funktion stsa_sentencepiece aus, um eine Textdatei zu erstellen, die von CTFDeserializer gelesen werden soll.

Now 10000 samples...
Now 20000 samples...
...
Now 970000 samples...

Number of samples 973124

Wir konnten in ungefähr einem Monat ungefähr 1 Million Konversationen sammeln, aber die tatsächlich verfügbaren Daten waren 973.124 Konversationen.

Jetzt, da Sie bereit sind zu trainieren, verwendet Teil 2 CNTK, um Ihren Chatbot zu trainieren.

Referenz

Twitter - Developer sentencepiece

Computer Vision : Image Caption Part1 - STAIR Captions Natural Language : Word2Vec Part1 - Japanese Corpus

Recommended Posts

Natürliche Sprache: ChatBot Part1-Twitter API Corpus
Natürliche Sprache: Word2Vec Part1 - Japanischer Korpus
Natürliche Sprache: ChatBot Part2-Sequenz zu Sequenz Aufmerksamkeit
Natürliche Sprache: BERT Part1 - Japanischer Wikipedia Corpus
Natürliche Sprache: Doc2Vec Part1 --livedoor NEWS Corpus
Natürliche Sprache: Maschinelle Übersetzung Teil 1 - Japanisch-Englisch Untertitel Corpus
Python: Verarbeitung natürlicher Sprache
RNN_LSTM2 Verarbeitung natürlicher Sprache
Verarbeitung natürlicher Sprache 3 Wortkontinuität
Python: Vektordarstellung in natürlicher Sprache
Verarbeitung natürlicher Sprache 2 Wortähnlichkeit
Fassen Sie mit tf.data.Dataset api zusammen, wie Text (Verarbeitung natürlicher Sprache) vorverarbeitet wird