[PYTHON] Je souhaite créer un service d'apprentissage automatique sans programmation!

introduction

L'article dit: "Je ne veux pas créer de programme pour la partie apprentissage automatique, mais je souhaite créer un service qui utilise l'apprentissage automatique." ** Concernant l'apprentissage automatique ** Presque non programmé, la précision est raisonnable, et nous visons non seulement à «classer» mais aussi à expliquer comment l'intégrer réellement dans le service.

La source est sur github. En outre, un exemple de modèle entraîné est inclus, vous pouvez donc l'essayer immédiatement en suivant les étapes de l'article. https://github.com/shuukei-imas-cg/imas_cg_words

Ce que les lecteurs peuvent faire avec cet article

Nous allons créer un service de sous-ensemble de "Cinderella Girls Dialogue Judgment" produit par l'auteur étape par étape. En tant qu'application de classification de texte, il s'agit d'un service qui vous permet d'apprendre les lignes de 183 idoles apparaissant dans "Idol Master Cinderella Girls" et de déterminer "qui semble avoir émis la ligne" lorsque vous entrez une phrase arbitraire.

Cette fois, nous traiterons du fait que le résultat du jugement est affiché lorsque vous saisissez du texte à partir d'une entrée standard sur le PC local.

Cible

Lecteur supposé

--Python débutant à intermédiaire ――Les personnes qui souhaitent désormais toucher à l'apprentissage automatique

Environnement d'exploitation

À propos du framework et du logiciel à utiliser

À propos de Jubatus

Jubatus est un cadre de traitement distribué pour l'apprentissage automatique en ligne développé par PFN & NTT. Il est à la fois rapide et évolutif, et vous pouvez étudier en ligne (tout en exécutant le service). À l'extrême, il n'y a que deux façons d'utiliser Jubatus.

--Apprentissage (étiquette correcte, données correctes) --Classification (données que vous souhaitez classer) -> Renvoie l'étiquette estimée

Nous utiliserons ce Jubatus (pour être exact, le classificateur des nombreuses fonctions de Jubatus).

À propos de MeCab

MeCab (Wafubu: Mekabu) est un moteur d'analyse morphologique qui peut être considéré comme un standard dans le domaine du traitement du langage naturel. Il fonctionne très vite et a des liaisons de différentes langues. "L'analyse morphologique" est un processus d'estimation de la partie d'un élément morphologique en divisant la phrase d'entrée dans la plus petite unité de la langue appelée "élément morphologique" qui est plus petite qu'un mot, ne peut être divisée davantage et a une signification.

À propos de mecab-ipadic-NEologd

mecab-ipadic-NEologd est un dictionnaire système pour MeCab avec de nouveaux mots ajoutés à partir de textes sur le Web. Il parcourt en permanence les ressources linguistiques du Web et est mis à jour deux fois par semaine (lundi et jeudi), ce qui est très efficace lorsque vous souhaitez gérer de nouveaux mots en groupe sans les diviser étrangement. De plus, de nombreuses entrées qui ne sont tout simplement pas dans le dictionnaire IPA associé à MeCab sont enregistrées.

Pour utiliser MeCab et mecab-ipadic-NEologd en combinaison, spécifiez le répertoire de mecab-ipadic-NEologd comme dictionnaire système de MeCab. Par exemple, à partir de la ligne de commande, tapez:

$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
Annonce du nouveau logiciel Nintendo Switch
Nomenclature Nintendo Switch,Nom propre,Général,*,*,*,Nintendo Switch,Commutateur Nintendo,Commutateur Nintendo
Nomenclature douce,Général,*,*,*,*,doux,doux,doux
Nouvelle nomenclature,Changer de connexion,*,*,*,*,Nouveau travail,Shinsaku,Shinsaku
Nomenclature d'annonce,Changer de connexion,*,*,*,*,Présentation,Heureux,Heureux
EOS

Vous pouvez voir que la Nintendo Switch est traitée comme un bloc.

Procédure d'installation

Exécutons d'abord l'exemple de programme. La procédure suivante est basée sur CentOS 6.9, mais la procédure d'installation d'Ubuntu est également expliquée en japonais dans l'explication de chaque middleware, veuillez donc la lire comme il convient.

Installez Jubatus

#Enregistrez le référentiel Yum de Jubatus avec votre système
sudo rpm -Uvh http://download.jubat.us/yum/rhel/6/stable/x86_64/jubatus-release-6-2.el6.x86_64.rpm

#jubatus et jubatus-Installer le package client
sudo yum install jubatus jubatus-client

#Installer le plug-in MeCab de Jubatus
sudo yum install jubatus-plugin-mecab

#Installer la bibliothèque cliente Jubatus Python
sudo pip install jubatus
#Si vous utilisez un environnement virtualenv, entrez dans cet environnement, puis exécutez pip install jubatus

Installez MeCab, mecab-ipadic-NEologd

mecab-ipadic-NEologd Suivez la procédure d'installation standard pour installer également MeCab.

#Installez MeCab
sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
sudo yum install mecab mecab-devel mecab-ipadic git make curl xz

cd (Dossier approprié)
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n

Si la dernière commande réussit, vous serez invité à installer le dictionnaire NEologd, entrez Oui. La destination d'installation du dictionnaire sera affichée, alors notez-la.

Cloner et préparer les fichiers source

git clone https://github.com/shuukei-imas-cg/imas_cg_words.git
cd imas_cg_words/jubatus

Ici, si la destination d'installation du dictionnaire NEologd est autre que / usr / local / lib / mecab / dic / mecab-ipadic-neologd, corrigez le chemin de serif.json.

serif.json(Partie de)


Avant correction"arg": "-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd",
Exemple de modification"arg": "-d /usr/lib64/mecab/dic/mecab-ipadic-neologd",

Après avoir modifié ou confirmé le chemin, continuez comme suit: (2017-04-21 postscript: Lors du chargement du fichier de modèle avec l'option -m, il semble que le paramètre au moment de l'entraînement du modèle soit priorisé afin d'éviter la divergence de paramètre avec le fichier de paramètre. Chemin NEologd dans serif.json Même si vous spécifiez, cela ne sera pas reflété. Par conséquent, lorsque vous utilisez le fichier modèle ci-joint, placez un lien symbolique dans / usr / local / lib /… ou jubakit 0.4.3 qui sortira bientôt. Après cela, veuillez réécrire les paramètres dans le fichier modèle à l'aide de l'outil ci-joint)

#Démarrer le classificateur Jubatus, résident
# -Chargez le fichier de configuration avec f,-Charger un fichier de modèle entraîné avec m
jubaclassifier -f serif.json -m model/sample.jubatus &
cd ..
cd localservice/
python classify.py

Lorsque classify.py démarre, essayez de saisir des mots et des lignes selon vos besoins. Le fichier modèle ci-joint stocke les caractéristiques apprises sur un total de 870 lignes, 290 lignes de chacune des trois idoles, Hinako Kita, Aiumi Munakata et Nanami Asari, qui apparaissent dans les Idol Master Cinderella Girls (ligne originale). N'est-ce pas des informations qui peuvent être restaurées). Laquelle de ces trois lignes semble être affichée par ordre décroissant de score.

151s-3.png

Ici, le dialogue qui n'est pas inclus dans les données d'entraînement ci-dessus est entré. Cela semble être généralement correct (bien qu'il ne soit pas possible de juger sans connaissance de l'original).

Commentaire

Évaluation des performances

score.png

Divisez les données préparées en 10 parties, apprenez avec 90%, testez avec les 10% restants et répétez 10 fois pour effectuer un test croisé pour prendre la moyenne. Pour une explication détaillée des termes, reportez-vous à d'autres articles, et le taux d'exactitude était d'environ 93% et la valeur F moyenne était de 0,94.

À propos de la mise en œuvre

Le code que j'ai écrit pour arriver jusqu'ici est de 65 lignes au total, et il n'y a qu'un seul fichier de configuration.

Explication de train.py (apprentissage)

Chargez le fichier CSV et traitez-le ligne par ligne. Ici, la ligne [0] contient le libellé de réponse correct (nom libre) et la ligne [1] contient le texte (ligne). Remplacez la bonne étiquette de réponse et le texte (ligne) à apprendre dans la liste ensemble au format Datum afin que Jubatus puisse le gérer. Datum a un format de données clé-valeur, où la clé correspond au nom de la fonction et la valeur correspond au montant de la fonction. J'expliquerai la clé'serif 'plus tard.

Après avoir ajouté tous les éléments à la liste, mélangez-les et entraînez-les avec client.train.

train.py(Extrait)


    train_data = []
    for line in reader:
        train_data.append((line[0], Datum({'serif': line[1]})))
    random.shuffle(train_data)
    for data in train_data:
        client.train([data])

Explication de serif.json (fichier de configuration Jubatus)

Tous les traitements liés à l'apprentissage automatique (classification de texte) sont spécifiés dans ce fichier de paramètres.

serif.json


{
  "method": "CW",
  "converter": {
    "string_filter_types": {},
    "string_filter_rules": [],
    "string_types": {
      "mecab": {
          "method": "dynamic",
          "path": "libmecab_splitter.so",
          "function": "create",
          "arg": "-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd",
          "ngram": "1",
          "base": "false",
          "include_features": "*",
          "exclude_features": ""
       }
    },
    "string_rules": [
      {"key": "serif", "type": "mecab", "sample_weight": "bin", "global_weight": "bin"}
    ]
  },
  "parameter": {
    "regularization_weight" : 1.0
  }
}

Dans l'entrée string_rules, il est spécifié de prétraiter "mecab" pour la fonction "serif" apparue précédemment. Le contenu du processus "mecab" est défini par string_types, et il est divisé en utilisant le plug-in MeCab de Jubatus, la spécification du dictionnaire mecab-ipadic-NEologd, et l'unité d'un élément de formulaire divisé est utilisée comme une fonctionnalité telle quelle ( "ngram": "1", "base": "false", etc.) sont spécifiés.

De plus, cette fois, dans la première "méthode", l'algorithme appelé CW est spécifié à partir des algorithmes implémentés dans Jubatus, mais en fonction de la tâche, il peut être préférable de passer à un autre algorithme. Vous pouvez également spécifier divers autres prétraitements (tels que la suppression des balises HTML) dans ce fichier de configuration. [^ 1]

[^ 1]: Jubatus- Conversion de données

Explication de classify.py

C'est à peu près 20 lignes de code.

classify.py


# -*- coding:utf-8 -*-
from __future__ import absolute_import, print_function, unicode_literals

import jubatus
from config import host, port, name
from jubatus.common import Datum


def predict():
    while True:
        client = jubatus.Classifier(host, port, name)
        words = raw_input().decode("utf-8")
        datum = Datum({'serif': words})
        res = client.classify([datum])
        sorted_res = sorted(res[0], key=lambda x: -x.score)
        for result in sorted_res:
            print("label:{0} score:{1}".format(result.label, result.score))


if __name__ == '__main__':
    predict()

Définissez le nom de la fonction "sérif" comme clé, et définissez l'entrée de texte de la console obtenue par raw_input () comme quantité de fonction, et convertissez-la au format Datum. Classez avec client.classify. Comme le résultat est renvoyé sous forme de liste de listes, il est trié et affiché par ordre décroissant de score par expressions triées et lambda.

Que se passe-t-il à l'intérieur

Vous pouvez l'utiliser sans connaître le contenu, mais pour le moment, je vais essayer l'explication minimale.

Pendant l'apprentissage

À l'avance, nous avons préparé manuellement 870 (290 * 3) lignes (texte) et le nom de l'idole qui sera l'étiquette de réponse correcte. Convertissez-le au format CSV et apprenez avec train.py. Le texte est divisé en éléments morphologiques par MeCab, et chaque élément morphologique est saisi et appris en tant que «caractéristique» de l'étiquette de réponse correcte. [^ 2]

[^ 2]: Cette fois, nous utilisons un algorithme appelé Apprentissage pondéré par la confiance (CW). Pour plus de détails, voir Jubatus- Algorithm

A la suite de l'apprentissage, un «poids» correspondant à la «paresse» est fixé pour chaque élément morphologique (en gros, des valeurs réelles sont fixées pour le nombre d'éléments morphologiques x le nombre d'étiquettes correctes).

Cette fois, le fichier de modèle entraîné (model / sample.jubatus) est spécifié lorsque le classificateur juba est démarré, et il est chargé et utilisé.

Au moment du classement

Au moment de la classification, le texte saisi est également trié morphologiquement. Le score est la somme des «poids» divisés de chaque élément morphologique.

Normalement, lorsque la classification de texte est effectuée par apprentissage automatique, il arrive souvent que les caractères et les mots trop fréquents et dénués de sens soient préalablement exclus en tant que «mots vides», mais cette fois, puisque le dialogue est classifié, les mots auxiliaires etc. Je le saisis tel quel (en fonction de la tâche) car il nécessite des nuances détaillées et Jubatus fait du bon travail avec les paramètres par défaut.

Exemple d'écriture fractionnaire morphologique

--Entrée: j'étais trop délirante ... je dois reposer ma tête ...

Dans ce cas, il est caractérisé par douze éléments morphologiques: illusion, monsieur, trop, monsieur, monsieur, monsieur, monsieur, monsieur, reposez-vous, monsieur, et ...

Lors de la préparation des données d'entraînement par vous-même

Si vous préparez les données au format CSV comme indiqué ci-dessous, vous pouvez apprendre à utiliser train.py préparé dans le référentiel.

Name, Serif
 Étiquette a, texte 1
 Étiquette a, texte 2
 Étiquette b, texte 1
 Étiquette b, texte 2
 ... etc
# Quittez le classificateur juba lancé ci-dessus
pkill jubaclassifier

jubaclassifier -f serif.json &
 python train.py (spécifiez le fichier ci-dessus)

la prochaine fois

Cela complète les fonctions d'apprentissage et de classification de base du service d'apprentissage automatique. La prochaine fois, nous incorporerons la fonction de classification dans le serveur Web afin qu'elle puisse être utilisée comme API Web de l'extérieur.

Enfin (important)

Si vous aimez cet article, il se tiendra vers avril 2018 chez Idol Master Cinderella Girls autant que vous le pensez. Veuillez voter pour Hinako Kita à la «7e élection générale des filles de Cendrillon» qui aura lieu.

Recommended Posts

Je souhaite créer un service d'apprentissage automatique sans programmation!
Je veux faire du machine learning même sans serveur - Time Series Edition -
Je souhaite créer facilement un modèle de bruit
Je veux créer une fenêtre avec Python
Je souhaite créer un type d'implémentation pouvant être branché
Je veux escalader une montagne avec l'apprentissage par renforcement
Je souhaite créer manuellement une légende avec matplotlib
[Keras] J'ai essayé de résoudre le problème de classification des zones de type beignet par apprentissage automatique [Étude]
Je veux créer un Dockerfile pour le moment.
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
Qiskit: Je veux créer un circuit qui crée des états arbitraires! !!
Je souhaite rechercher le texte intégral avec elasticsearch + python
Je veux créer un système pour éviter d'oublier de serrer la clé 1
Je veux créer un fichier pip et le refléter dans le menu fixe
Comment créer une API de machine learning sans serveur avec AWS Lambda
Vous voulez résoudre un problème de classification simple?
Je veux imprimer dans la notation d'inclusion
J'ai essayé de créer un linebot (préparation)
Je veux créer un environnement Python
J'ai changé de travail pour devenir ingénieur en apprentissage automatique chez AtCoder Jobs
Je veux faire de matplotlib un thème sombre
Je souhaite afficher uniquement différentes lignes du fichier texte avec diff
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
Je veux INSÉRER un DataFrame dans MSSQL
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
Je veux faire un jeu avec Python
Si vous souhaitez créer Word Cloud.
Je ne veux pas passer un test de codage
Algorithme d'apprentissage automatique (de la classification à 2 classes à la classification à plusieurs classes)
[Azure] J'ai essayé de créer une machine virtuelle Linux avec Azure de Microsoft Learn
Je souhaite créer une application WEB en utilisant les données de League of Legends ①
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (1: Acquérir des images de candidats à l'aide du service API Web)
Classification de l'apprentissage automatique
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
Je veux trouver facilement une délicieuse boutique
Je veux écrire dans un fichier avec Python
Un débutant en apprentissage automatique a tenté de créer une IA de jugement Sheltie en un jour
Je souhaite télécharger une application Django sur heroku
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Créer un ensemble de données d'images à utiliser pour la formation
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
Je souhaite intégrer une variable dans une chaîne Python
Je veux répéter plusieurs fois un générateur Python
Je veux que DQN Puniki frappe un home run
100 coups sur le traitement d'image !! (021-030) Je veux faire une pause ...
Je veux donner un group_id à une trame de données pandas
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux faire la transition avec un bouton sur le ballon
Je veux écrire en Python! (2) Écrivons un test
Je veux trouver un package populaire sur PyPi
Je veux échantillonner au hasard un fichier avec Python
Je souhaite créer facilement un environnement de développement basé sur un modèle
Je veux diviser une chaîne de caractères avec hiragana
Préparation au démarrage de «Python Machine Learning Programming» (pour macOS)
[Python] Je veux faire d'une liste imbriquée un taple
Les débutants en apprentissage automatique essaient de créer un arbre de décision