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
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.
--Python débutant à intermédiaire ――Les personnes qui souhaitent désormais toucher à l'apprentissage automatique
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).
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.
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.
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.
#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
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.
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.
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).
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.
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.
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])
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
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.
Vous pouvez l'utiliser sans connaître le contenu, mais pour le moment, je vais essayer l'explication minimale.
À 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 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.
--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 ...
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)
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.
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