Ich habe versucht, mit Jubatus anzufangen.
Installieren Sie das Paket gemäß den Anweisungen auf der offiziellen Website.
$ sudo rpm -Uvh http://download.jubat.us/yum/rhel/6/stable/x86_64/jubatus-release-6-1.el6.x86_64.rpm
$ sudo yum install jubatus jubatus-client
Es gibt ein Beispiel-Repository namens jubatus-example.
$ git clone https://github.com/jubatus/jubatus-example.git
Es gibt ziemlich viele Erklärungen wie README auf Japanisch, daher denke ich, dass es einfach ist, von hier aus einzutreten.
Zu diesem Zweck können Sie ein Beispiel mit dem Namen "twitter_streaming_location" verwenden. Die Bewegung dieser Probe ist wie folgt.
twitter_streaming_location
Zu einem passenden Namen für jedes Verzeichnis und ändern Sie es.
Lernen Sie im Lernprozess die Entsprechung zwischen der Blog-Kategorie und dem Text. Geben Sie dem Klassifikator Text und versuchen Sie, die Kategorie zu erraten.
Bereiten Sie ein geeignetes SQL vor und geben Sie eine Liste mit Blog-Kategorien und Text in Text aus. Mit der CLI können Sie die Daten durch Tabulatoren trennen, indem Sie die folgenden Schritte ausführen.
$ mysql -uuser -p -N db < blog.sql > blog.txt
Die ursprüngliche Datei train.py analysiert die Geotags von Tweets und erledigt viele Dinge. Das ist also ein Chaos. Ein wenig umgeschrieben, um tabulatorgetrennte Daten zu lernen, die von Standardeingaben anstelle von Tweets stammen, die vom Netzwerk erfasst wurden.
train.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import json
import re
from jubatus.classifier import client
from jubatus.common import Datum
# Jubatus Configuration
host = "127.0.0.1"
port = 9199
instance_name = "" # required only when using distributed mode
def print_color(color, msg, end):
sys.stdout.write('\033[' + str(color) + 'm' + str(msg) + '\033[0m' + str(end))
def print_red(msg, end="\n"):
print_color(31, msg, end)
def print_green(msg, end="\n"):
print_color(32, msg, end)
def train():
classifier = client.Classifier(host, port, instance_name)
for line in sys.stdin:
category_name, body = line.split("\t")
d = Datum({'text': body})
classifier.train([(category_name, d)])
# Print trained entry
print_green(category_name, ' ')
print body
#Wenn Sie die Lerndaten nach dem Lernen sichern möchten, aktivieren Sie Folgendes
# classifier.save("foo")
if __name__ == '__main__':
try:
train()
except KeyboardInterrupt:
print "Stopped."
Es besteht fast keine Notwendigkeit, dies zu ändern, aber ich habe die Anzeige nur auf die drei besten geschätzten Kategorien geändert.
classify.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from jubatus.classifier import client
from jubatus.common import Datum
# Jubatus configuration
host = "127.0.0.1"
port = 9199
instance_name = "" # required only when using distributed mode
def estimate_blog_category_for(text):
classifier = client.Classifier(host, port, instance_name)
# Create datum for Jubatus
d = Datum({'text': text})
# Send estimation query to Jubatus
result = classifier.classify([d])
if len(result[0]) > 0:
# Sort results by score
est = sorted(result[0], key=lambda e: e.score, reverse=True)
# Print the result
print "Estimated Category for %s:" % text
i = 0
for e in est:
print " " + e.label + " (" + str(e.score) + ")"
i += 1
if i >= 3:
break
else:
# No estimation results; maybe we haven't trained enough
print "No estimation results available."
print "Train more data or try using another text."
if __name__ == '__main__':
if len(sys.argv) == 2:
estimate_blog_category_for(sys.argv[1])
else:
print "Usage: %s data" % sys.argv[0]
Ich wollte, dass der Text anstelle von Bigram in Mecab getrennt wird, also habe ich die Einstellungen ein wenig umgeschrieben.
blog_category.json
{
"method": "NHERD",
"parameter": {
"regularization_weight": 0.001
},
"converter": {
"num_filter_types": {
},
"num_filter_rules": [
],
"string_filter_types": {
},
"string_filter_rules": [
],
"num_types": {
},
"num_rules": [
],
"string_types": {
"bigram": { "method": "ngram", "char_num": "2" },
"mecab": {
"method": "dynamic",
"path": "libmecab_splitter.so",
"function": "create"
}
},
"string_rules": [
{ "key": "*", "type": "mecab", "sample_weight": "bin", "global_weight": "idf" }
]
}
}
Geben Sie diesen JSON an, um den Server zu starten.
$ jubaclassifier -f blog_category.json -t 0
Füttere die vorbereiteten Lehrerdaten mit train.py.
$ cat blog.txt | ./train.py
Lassen Sie uns die Kategorie erraten, indem Sie einen geeigneten Text eingeben.
$ ./classify.py "Freut mich, dich kennenzulernen. Ich heiße Tanaka."
Geschätzte Kategorie für Nizza, um Sie zu treffen. Ich heiße Tanaka.:
Vorstellen(0.231856495142)
Tagebuch(0.0823381990194)
Beachten(0.0661180838943)
Recommended Posts