[PYTHON] Ich möchte einen maschinellen Lerndienst ohne Programmierung erstellen! Textklassifizierung

Einführung

In dem Artikel heißt es: "Ich möchte kein Programm für den Teil des maschinellen Lernens erstellen, aber ich möchte einen Dienst erstellen, der maschinelles Lernen verwendet." ** In Bezug auf maschinelles Lernen ** Fast ohne Programmierung ist die Genauigkeit angemessen, und wir möchten nicht nur "klassifizieren", sondern auch erklären, wie es tatsächlich in den Dienst integriert werden kann.

Die Quelle ist auf Github. Darüber hinaus ist ein Beispiel für ein trainiertes Modell enthalten, sodass Sie es sofort ausprobieren können, indem Sie die Schritte im Artikel ausführen. https://github.com/shuukei-imas-cg/imas_cg_words

Was Leser mit diesem Artikel machen können

Wir werden einen Teilmengen-Service von "Cinderella Girls Dialogue Judgement" erstellen, der vom Autor Schritt für Schritt erstellt wird. Dies ist eine Anwendung der Textklassifizierung, bei der Sie die Zeilen von 183 Idolen lernen können, die in "Idol Master Cinderella Girls" erscheinen, und bestimmen, "wer die Zeile ausgegeben zu haben scheint", wenn Sie einen beliebigen Satz eingeben.

Dieses Mal werden wir uns mit der Tatsache befassen, dass das Beurteilungsergebnis angezeigt wird, wenn Sie Text von der Standardeingabe auf dem lokalen PC eingeben.

Ziel

Angenommener Leser

Betriebsumgebung

Über das zu verwendende Framework und die zu verwendende Software

Über Jubatus

Jubatus ist ein verteiltes Verarbeitungsframework für maschinelles Online-Lernen, das von PFN & NTT entwickelt wurde. Es ist sowohl schnell als auch skalierbar und Sie können online lernen (während Sie den Dienst ausführen). Im Extremfall gibt es nur zwei Möglichkeiten, Jubatus zu verwenden.

Wir werden diesen Jubatus verwenden (um genau zu sein, den Klassifikator der vielen Funktionen von Jubatus).

Über MeCab

MeCab (Wafubu: Mekabu) ist eine morphologische Analyse-Engine, die als Standard auf dem Gebiet der Verarbeitung natürlicher Sprache bezeichnet werden kann. Es läuft sehr schnell und hat Bindungen aus verschiedenen Sprachen. "Formularelementanalyse" ist ein Prozess zum Schätzen des Teils eines Formularelements durch Teilen des Eingabesatzes in die kleinste Einheit in der Sprache "Morphelement", die kleiner als ein Wort ist, nicht mehr geteilt werden kann und eine Bedeutung hat.

Über mecab-ipadic-NEologd

mecab-ipadic-NEologd ist ein Systemwörterbuch für MeCab mit neuen Wörtern, die aus Texten im Web hinzugefügt wurden. Es durchsucht ständig die Sprachressourcen des Webs und wird zweimal pro Woche (Montag und Donnerstag) aktualisiert. Dies ist sehr effektiv, wenn Sie neue Wörter als Gruppe behandeln möchten, ohne sie seltsam zu teilen. Darüber hinaus werden viele Einträge aufgezeichnet, die einfach nicht im an MeCab angehängten IPA-Wörterbuch enthalten sind.

Um MeCab und mecab-ipadic-NEologd in Kombination zu verwenden, geben Sie das Verzeichnis von mecab-ipadic-NEologd als Systemwörterbuch von MeCab an. Geben Sie beispielsweise in der Befehlszeile Folgendes ein:

$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
Neue Nintendo Switch-Software angekündigt
Nintendo Switch-Nomenklatur,Eigenname,Allgemeines,*,*,*,Nintendo Switch,Nintendo-Schalter,Nintendo-Schalter
Weiche Nomenklatur,Allgemeines,*,*,*,*,Sanft,Sanft,Sanft
Neue Nomenklatur,Verbindung ändern,*,*,*,*,Neue Arbeit,Shinsaku,Shinsaku
Ankündigungsnomenklatur,Verbindung ändern,*,*,*,*,Ankündigung,glücklich,glücklich
EOS

Sie können sehen, dass der Nintendo Switch als eine Masse behandelt wird.

Installationsverfahren

Lassen Sie uns zuerst das Beispielprogramm ausführen. Das folgende Verfahren basiert auf CentOS 6.9, das Installationsverfahren für Ubuntu wird jedoch auch in Japanisch in der Erläuterung der einzelnen Middleware erläutert. Lesen Sie daher bitte die entsprechenden Informationen.

Installieren Sie Jubatus

#Registrieren Sie das Yum-Repository von Jubatus bei Ihrem System
sudo rpm -Uvh http://download.jubat.us/yum/rhel/6/stable/x86_64/jubatus-release-6-2.el6.x86_64.rpm

#Jubatus und Jubatus-Installieren Sie das Client-Paket
sudo yum install jubatus jubatus-client

#Installieren Sie das MeCab-Plug-In von Jubatus
sudo yum install jubatus-plugin-mecab

#Installieren Sie die Jubatus Python Client Library
sudo pip install jubatus
#Wenn Sie eine virtuelle Umgebung verwenden, geben Sie diese Umgebung ein und führen Sie pip install jubatus aus

Installieren Sie MeCab, mecab-ipadic-NEologd

mecab-ipadic-NEologd Befolgen Sie die Standardinstallationsprozedur, um auch MeCab zu installieren.

#Installieren Sie 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 (Geeigneter Ordner)
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n

Wenn der letzte Befehl erfolgreich ist, werden Sie aufgefordert, das NEologd-Wörterbuch zu installieren. Geben Sie Ja ein. Das Installationsziel des Wörterbuchs wird angezeigt. Notieren Sie sich dies.

Quelldateien klonen und vorbereiten

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

Wenn das Installationsziel des NEologd-Wörterbuchs nicht / usr / local / lib / mecab / dic / mecab-ipadic-neologd ist, korrigieren Sie hier den Pfad von serif.json.

serif.json(Teil von)


Vor der Korrektur"arg": "-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd",
Änderungsbeispiel"arg": "-d /usr/lib64/mecab/dic/mecab-ipadic-neologd",

Fahren Sie nach dem Ändern oder Bestätigen des Pfads wie folgt fort: (2017-04-21 postscript: Beim Laden der Modelldatei mit der Option -m scheint die Einstellung zum Zeitpunkt des Modelltrainings priorisiert zu sein, um die Einstellungsdiskrepanz mit der Einstellungsdatei zu vermeiden. NEologd-Pfad in serif.json Selbst wenn Sie angeben, wird dies nicht wiedergegeben. Fügen Sie daher bei Verwendung der angehängten Modelldatei einen symbolischen Link in / usr / local / lib /… oder jubakit 0.4.3 ein, der in Kürze veröffentlicht wird. Danach schreiben Sie bitte die Einstellungen in der Modelldatei mit dem angehängten Tool neu.

#Starten Sie den Jubatus-Klassifikator, der ansässig ist
# -Laden Sie die Konfigurationsdatei mit f,-Laden Sie eine mit m trainierte Modelldatei
jubaclassifier -f serif.json -m model/sample.jubatus &
cd ..
cd localservice/
python classify.py

Versuchen Sie beim Starten von classify.py, Wörter und Zeilen entsprechend einzugeben. In der angehängten Modelldatei sind die Merkmale gespeichert, die aus insgesamt 870 Zeilen, jeweils 290 Zeilen der drei Idole Hinako Kita, Aiumi Munakata und Nanami Asari, die in den Idol Master Cinderella Girls (Originalzeile) erscheinen, gelernt wurden. Ist keine Information, die wiederhergestellt werden kann). Welche dieser drei Zeilen scheint in absteigender Reihenfolge der Punktzahl angezeigt zu werden.

151s-3.png

Hier wird der Dialog eingegeben, der nicht in den obigen Trainingsdaten enthalten ist. Es scheint im Allgemeinen richtig zu sein (obwohl es möglicherweise nicht möglich ist, ohne Kenntnis des Originals zu urteilen).

Kommentar

Leistungsbeurteilung

score.png

Teilen Sie die vorbereiteten Daten in 10 Teile, lernen Sie mit 90%, testen Sie mit den restlichen 10% und wiederholen Sie 10 Mal, um einen Kreuztest durchzuführen, um den Durchschnitt zu ermitteln. Wenn Sie sich für eine ausführliche Erläuterung der Begriffe auf andere Artikel beziehen, betrug die Genauigkeitsrate etwa 93% und der durchschnittliche F-Wert 0,94.

Über die Implementierung

Der Code, den ich geschrieben habe, um so weit zu kommen, umfasst insgesamt 65 Zeilen, und es gibt nur eine Konfigurationsdatei.

Erklärung von train.py (Lernen)

Laden Sie die CSV-Datei und verarbeiten Sie sie zeilenweise. Hier enthält Zeile [0] das richtige Antwortetikett (Leerlaufname) und Zeile [1] den Text (Zeile). Ersetzen Sie das richtige Antwortetikett und den zu lernenden Text (Zeile) zusammen im Datumsformat in der Liste, damit Jubatus damit umgehen kann. Datum hat ein Schlüsselwert-Datenformat, wobei der Schlüssel dem Feature-Namen und der Wert dem Feature-Betrag entspricht. Ich werde den Schlüssel später erklären.

Nachdem Sie alle Elemente zur Liste hinzugefügt haben, mischen Sie sie und trainieren Sie sie mit client.train.

train.py(Auszug)


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

Erläuterung von serif.json (Jubatus-Konfigurationsdatei)

Die gesamte Verarbeitung im Zusammenhang mit maschinellem Lernen (Textklassifizierung) ist in dieser Einstellungsdatei angegeben.

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

Im Eintrag von string_rules wird angegeben, dass "mecab" für das zuvor angezeigte Feature "serif" vorverarbeitet werden soll. Der Inhalt des "mecab" -Prozesses wird durch string_types definiert und mithilfe des MeCab-Plug-Ins von Jubatus, der Spezifikation des mecab-ipadic-NEologd-Wörterbuchs und der Einheit eines geteilten Formularelements wird so wie es ist als Feature verwendet ( "ngram": "1", "base": "false" usw.) werden angegeben.

Außerdem wird diesmal in der ersten "Methode" der als CW bezeichnete Algorithmus aus den in Jubatus implementierten Algorithmen spezifiziert. Abhängig von der Aufgabe kann es jedoch besser sein, zu einem anderen Algorithmus zu wechseln. Sie können in dieser Konfigurationsdatei auch verschiedene andere Vorverarbeitungen (z. B. das Entfernen von HTML-Tags) angeben. [^ 1]

[^ 1]: Jubatus- Datenkonvertierung

Erklärung von classify.py

Es sind nur etwa 20 Codezeilen.

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

Mit dem Feature-Namen'serif 'als Schlüssel wird die von raw_input () erhaltene Texteingabe von der Konsole als Feature-Betrag festgelegt und in das Datumsformat konvertiert. Mit client.classify klassifizieren. Da das Ergebnis als Liste von Listen zurückgegeben wird, wird es sortiert und in absteigender Reihenfolge der Punktzahl nach sortierten und Lambda-Ausdrücken angezeigt.

Was ist drinnen los?

Sie können es verwenden, ohne den Inhalt zu kennen, aber vorerst werde ich die minimale Erklärung versuchen.

Während des Lernens

Im Voraus haben wir manuell 870 (290 * 3) Zeilen (Text) und den Idolnamen vorbereitet, der das richtige Antwortetikett darstellt. Konvertieren Sie dies in das CSV-Format und lernen Sie mit train.py. Der Text wird von MeCab in morphologische Elemente unterteilt, und jedes morphologische Element wird als "Merkmal" des richtigen Antwortetiketts eingegeben und gelernt. [^ 2]

[^ 2]: Dieses Mal verwenden wir einen Algorithmus namens Confidence Weighted Learning (CW). Einzelheiten finden Sie unter Jubatus- Algorithmus.

Als Ergebnis des Lernens wird für jedes morphologische Element ein "Gewicht" festgelegt, das der "Untätigkeit" entspricht (ungefähr werden reale Werte für die Anzahl der morphologischen Elemente x die Anzahl der korrekten Bezeichnungen festgelegt).

Dieses Mal wird die trainierte Modelldatei (model / sample.jubatus) beim Starten des Juba-Klassifikators angegeben und geladen und verwendet.

Zum Zeitpunkt der Klassifizierung

Zum Zeitpunkt der Klassifizierung ist der eingegebene Text auch morphologisch sortiert. Die Punktzahl ist die Summe der geteilten "Gewichte" jedes morphologischen Elements.

Wenn die Textklassifizierung durch maschinelles Lernen durchgeführt wird, werden Zeichen und Wörter, die zu häufig und bedeutungslos sind, normalerweise im Voraus als "Stoppwörter" ausgeschlossen. Diesmal jedoch, da der Dialog klassifiziert ist, Hilfswörter usw. Ich gebe es so ein, wie es ist (abhängig von der Aufgabe), weil es detaillierte Nuancen erfordert und Jubatus mit den Standardeinstellungen gute Arbeit leistet.

Beispiel für morphologisches fraktioniertes Schreiben

In diesem Fall ist es durch zwölf morphologische Elemente gekennzeichnet: Täuschung, Sir, zu viel, Sir, Sir, Sir, Sir, Sir, Ruhe, Sir, und.

Wenn Sie Trainingsdaten selbst vorbereiten

Wenn Sie die Daten im CSV-Format wie unten gezeigt vorbereiten, können Sie die Verwendung von train.py lernen, die im Repository vorbereitet wurde.

Name, Serif
 Beschriftung a, Text 1
 Beschriftung a, Text 2
 Etikett b, Text 1
 Etikett b, Text 2
 ... und so weiter
# Beenden Sie den oben gestarteten Juba-Klassifikator
pkill jubaclassifier

jubaclassifier -f serif.json &
 python train.py (geben Sie die obige Datei an)

nächstes Mal

Dies vervollständigt die Kernlern- und Klassifizierungsfunktionen des maschinellen Lerndienstes. Beim nächsten Mal werden wir die Klassifizierungsfunktion in den Webserver integrieren, damit sie von außen als Web-API verwendet werden kann.

Schließlich (wichtig)

Wenn Ihnen dieser Artikel gefällt, wird er um den April 2018 bei Idol Master Cinderella Girls stattfinden, so viel Sie für gut halten. Bitte stimmen Sie für Hinako Kita bei der "7. Cinderella Girl General Election", die stattfinden wird.

Recommended Posts

Ich möchte einen maschinellen Lerndienst ohne Programmierung erstellen! Textklassifizierung
Ich möchte maschinelles Lernen auch ohne Server durchführen - Time Series Edition -
Ich möchte einfach ein Rauschmodell erstellen
Ich möchte mit Python ein Fenster erstellen
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Ich möchte manuell eine Legende mit matplotlib erstellen
[Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]
Ich möchte vorerst eine Docker-Datei erstellen.
Passende App Ich habe versucht, Statistiken über starke Leute zu erstellen und ein Modell für maschinelles Lernen zu erstellen
Qiskit: Ich möchte eine Schaltung erstellen, die beliebige Zustände erzeugt! !!
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
Ich möchte ein System erstellen, um zu verhindern, dass vergessen wird, den Schlüssel 1 festzuziehen
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Möchten Sie ein einfaches Klassifizierungsproblem lösen?
Ich möchte in der Einschlussnotation drucken
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich möchte eine Python-Umgebung erstellen
Ich wechselte meinen Job zu einem Ingenieur für maschinelles Lernen bei AtCoder Jobs
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte nur verschiedene Zeilen der Textdatei mit diff anzeigen
Ich möchte eine schöne Python-Entwicklungsumgebung für meinen neuen Mac erstellen
Ich möchte einen DataFrame in MSSQL einfügen
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ich möchte ein Spiel mit Python machen
Wenn Sie Word Cloud erstellen möchten.
Ich möchte keinen Codierungstest machen
Algorithmus für maschinelles Lernen (von der Klassifizierung in zwei Klassen bis zur Klassifizierung in mehreren Klassen)
[Azure] Ich habe versucht, eine virtuelle Linux-Maschine mit Azure von Microsoft Learn zu erstellen
Ich möchte eine WEB-Anwendung mit den Daten von League of Legends ① erstellen
Erstellen eines Gesichtsbilddatensatzes für maschinelles Lernen (1: Erfassen von Kandidatenbildern mithilfe des Web-API-Dienstes)
Klassifikation des maschinellen Lernens
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich möchte leicht einen leckeren Laden finden
Ich möchte mit Python in eine Datei schreiben
Ein Anfänger des maschinellen Lernens versuchte an einem Tag, eine Sheltie-Urteils-KI zu erstellen
Ich möchte eine Django-App auf Heroku hochladen
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte, dass DQN Puniki einen Homerun macht
100 Klopfen bei der Bildverarbeitung !! (021-030) Ich möchte eine Pause machen ...
Ich möchte einem Pandas-Datenrahmen eine group_id geben
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich möchte ein beliebtes Paket auf PyPi finden
Ich möchte eine Datei mit Python zufällig testen
Ich möchte einfach eine modellbasierte Entwicklungsumgebung erstellen
Ich möchte eine Zeichenkette mit Hiragana teilen
Vorbereitung zum Starten von "Python Machine Learning Programming" (für macOS)
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Anfänger des maschinellen Lernens versuchen, einen Entscheidungsbaum zu erstellen