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
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.
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).
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.
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.
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.
#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
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.
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.
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).
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.
Der Code, den ich geschrieben habe, um so weit zu kommen, umfasst insgesamt 65 Zeilen, und es gibt nur eine Konfigurationsdatei.
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])
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
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.
Sie können es verwenden, ohne den Inhalt zu kennen, aber vorerst werde ich die minimale Erklärung versuchen.
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 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.
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 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)
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.
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.