[PYTHON] Langage naturel: ChatBot Part1-Twitter API Corpus

Cible

Nous avons résumé les chatbots en utilisant le Microsoft Cognitive Toolkit (CNTK).

La partie 1 vous prépare à former votre chatbot avec le Microsoft Cognitive Toolkit.

Je vais les présenter dans l'ordre suivant.

  1. Inscrivez-vous sur Twitter Developer
  2. Collecte des ensembles de données de conversation à l'aide de l'API Twitter
  3. Prétraitement des données de texte et création de modèles de morceaux de phrase
  4. Création d'un fichier à lire par le lecteur intégré fourni par CNTK

introduction

On suppose que vous avez un compte Twitter et que vous disposez de Linux.

S'inscrire au développeur Twitter

Postuler pour Twitter Developer

Twitter - Developer

Accédez à la page ci-dessus et cliquez sur Appliquer dans le coin supérieur droit.

Cliquez sur Demander un compte de développeur et sélectionnez le compte Twitter que vous souhaitez utiliser.

Ensuite, sélectionnez quelques éléments de base. Au fil du processus, il vous sera demandé d'écrire environ 100 à 200 caractères chacun, par exemple dans quel but vous l'utiliserez et comment vous utiliserez l'API et les données Twitter, mais même l'anglais simple est un problème. Il semble que cela n'existe pas, alors écrivons honnêtement le but de l'utilisation.

Enfin, lorsque vous confirmez les détails d'inscription et postulez auprès de Twitter Developer, l'e-mail d'acceptation de la candidature sera envoyé à l'adresse e-mail liée au compte Twitter utilisé pour l'enregistrement, attendons donc le résultat de l'examen. Au plus tôt, vous recevrez un e-mail des résultats de l'examen dans environ une journée.

De plus, à ce stade, vous pouvez recevoir à nouveau un e-mail du développeur Twitter et demander l'utilisation de l'API Twitter en japonais, mais il semble qu'il n'y ait pas de problème si vous traduisez docilement le contenu rédigé en anglais en japonais. Je vais.

Obtenir la clé API et le jeton d'accès

Ensuite, récupérez la clé API, la clé secrète API, le jeton d'accès et le secret du jeton d'accès pour obtenir les tweets et les réponses.

Cliquez sur Applications-> Créer une application et il vous sera demandé le nom de l'application que vous souhaitez créer, le site Web et la manière dont vous souhaitez l'utiliser.

Une fois l'application créée, vous verrez la clé API et la clé secrète API dans Clés et jetons sur la page de détails de l'application créée.

Notez le jeton d'accès et le secret du jeton d'accès car ils ne seront affichés qu'une seule fois en appuyant sur le bouton générer.

Collecter des ensembles de données conversationnelles à l'aide de l'API Twitter

Une fois que vous vous êtes inscrit auprès de Twitter Developer et que vous avez obtenu la clé API, la clé secrète API, le jeton d'accès et le secret du jeton d'accès, vous pourrez collecter des tweets et des réponses.

Installez tweepy pour travailler avec l'API Twitter en Python. L'API Twitter a de nombreuses fonctionnalités, mais cette fois, j'ai décidé de collecter les tweets publiés et une réponse en une seule conversation et de les enregistrer sous forme de fichier texte contenant jusqu'à 100 conversations à la fois.

La structure des répertoires cette fois est la suivante.

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

Prétraitement des données texte et création de modèles de morceaux de phrase

Une fois que vous avez collecté l'ensemble de données de conversation tweet et réponse, prétraitez les données texte.

Cette fois, j'ai exécuté le nettoyage de texte en utilisant les modules standard Python re et emoji.

Dans Word2Vec et Doc2Vec, MeCab est divisé en mots basés sur le dictionnaire NEologd. Je l'ai exécuté pour créer un dictionnaire de mots, mais cette fois, je vais créer un modèle de sous-mots en utilisant phrasepiece.

Création d'un fichier à lire par le lecteur intégré fourni par CNTK

Après la conversion en identifiants de mots à l'aide du modèle Phrase Piece formé avec les données d'entraînement, vous êtes prêt à créer un fichier texte pour le CTFDeserializer utilisé pour entraîner votre chatbot.

CTFDeserializer est introduit dans Computer Vision: Image Caption Part1 --STAIR Captions.

la mise en oeuvre

Environnement d'exécution

Matériel

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

Logiciel

・ Windows 10 Professionnel 1909 ・ Python 3.6.6 ・ Emoji 0.5.4 ・ Pièce de phrase 0.1.86 ・ Tweepy 3.8.0

Programme à exécuter

Le programme implémenté est publié sur GitHub.

stsa_twitter.py


stsa_corpus.py


Commentaire

Je vais extraire et compléter certaines parties du programme à exécuter.

Nettoyage de texte

Le nettoyage du texte est important car les tweets et les réponses que nous collectons contiennent beaucoup de bruit.

Suppression des liens http, des identifiants @user et des #tags spécifiques à Twitter

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

Normalisation de divers symboles

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
    "!\"#$%&'()*+,-./:;<=>?@[¥]^_`{|}~¡, ・ """,
    "!! "# $% & '() * +, -. /:; <=>? @ [\] ^ _` {|} ~., ・" "")})

Redondance réduite

text_clearning


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

Suppression des pictogrammes et emblèmes

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

Ce n'est pas parfait, mais les résultats sont justes.

Formation sur le modèle de morceau de phrase

Tout d'abord, clonez SentencePiece à partir de GitHub et construisez-le. Ce qui suit fonctionne sur une distribution Linux.

$ 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

À la fin de la formation, twitter.model et twitter.vocab seront créés. Par défaut, le modèle Pièce de phrase est attribué à 0, 1 et 2 pour les mots inconnus, début et fin, respectivement.

Ensemble de données de conversation Tweet et réponse

Dans le tweet enregistré et le fichier texte de réponse, le tweet et la réponse sont dans une conversation avec deux lignes.

Le nettoyage de texte peut entraîner zéro mot, vous devez donc vous assurer qu'au moins un mot est présent.

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)

De plus, comme les tweets et les réponses peuvent avoir des séries de longueurs différentes, la longueur des tweets et des réponses est ajustée à l'aide de zip_longest du module standard Python itertools pour créer un fichier texte à lire par le lecteur intégré.

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))

résultat

Tout d'abord, exécutez stsa_twitter.py pour collecter les tweets et les réponses.

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

Le code publié sur GitHub ne gère pas complètement les exceptions, donc si vous l'exécutez tel quel, il s'arrêtera toutes les 24 heures, veuillez donc le vérifier toutes les demi-journées.

Après avoir collecté la quantité de données requise, la fonction stsa_preprocessing générera un corpus de conversation Twitter twitter.txt composé d'une paire tweet-réponse nettoyée par texte.

Number of tweet and reply: 1068294

Entraînez ensuite le modèle de morceau de phrase. La formation commence par définir les arguments comme indiqué ci-dessous. J'ai fixé le nombre de mots à 32 000.

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

À la fin de la formation, twitter.model et twitter.vocab seront créés.

Enfin, exécutez la fonction stsa_sentencepiece pour créer un fichier texte à lire par CTFDeserializer.

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

Number of samples 973124

Nous avons pu collecter environ 1 million de conversations en un mois environ, mais les données réelles disponibles étaient 973 124 conversations.

Maintenant que vous êtes prêt à vous entraîner, la partie 2 utilisera CNTK pour entraîner votre chatbot.

référence

Twitter - Developer sentencepiece

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

Recommended Posts

Langage naturel: ChatBot Part1-Twitter API Corpus
Langage naturel: Word2Vec Part1 - Corpus japonais
Langage naturel: ChatBot Part2-Sequence To Sequence Attention
Langage naturel: BERT Part1 - Corpus Wikipedia japonais
Langage naturel: Doc2Vec Part1 --livedoor NEWS Corpus
Natural Language: Machine Translation Part1 - Corpus de sous-titres japonais-anglais
Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel
Traitement du langage naturel 3 Continuité des mots
Python: représentation vectorielle en langage naturel
Traitement du langage naturel 2 similitude de mots
Résumez comment prétraiter le texte (traitement du langage naturel) avec l'api tf.data.Dataset