[PYTHON] Lernen Sie mit Jubatus die Trends von Feature-Wörtern in Texten kennen und kategorisieren Sie Ihre Eingabetexte

Ich habe versucht, mit Jubatus anzufangen.

Annahmen & Ziele

Jubatus Installation

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

Holen Sie sich eine Probe

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.

Ändern Sie das Beispiel

Zu diesem Zweck können Sie ein Beispiel mit dem Namen "twitter_streaming_location" verwenden. Die Bewegung dieser Probe ist wie folgt.

twitter_streaming_locationZu 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.

Vorbereitung auf den Lernprozess

Vorbereitung der Lehrerdaten

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

Modified train.py

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."

Vorbereitung für den Klassifizierungsprozess

Geänderte classify.py

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]

Starten Sie den Jubatus-Server

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

Betriebstest

Lernen

Füttere die vorbereiteten Lehrerdaten mit train.py.

$ cat blog.txt | ./train.py

Einstufung

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)

Referenz

Recommended Posts

Lernen Sie mit Jubatus die Trends von Feature-Wörtern in Texten kennen und kategorisieren Sie Ihre Eingabetexte
Lassen Sie uns mit Python Receive spielen und den Text des Eingabeformulars speichern / anzeigen
Extrahieren Sie die Farbe des Objekts im Bild mit Mask R-CNN und K-Means Clustering
Lernen Sie während der Implementierung mit Scipy die Grundlagen der logistischen Regression und des mehrschichtigen Perzeptrons
Bearbeiten und debuggen Sie den Code in Raspberry Pi mit der SSH-Verbindungsfunktion von VSCode
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Lernen Sie "Englische Grammatik" anstelle von Python- und AI-bezogenen englischen Wörtern. .. ..
Berechnen Sie mit Python Millionen von Stellen in der Quadratwurzel von 2
[Für Anfänger] Zusammenfassung der Standardeingabe in Python (mit Erklärung)
Sehen Sie, wie schnell Sie mit NumPy / SciPy beschleunigen können
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Erstellen Sie eine Authentifizierungsfunktion mit django-allauth und CustomUser in Django
Verwenden wir den verteilten Ausdruck von Wörtern schnell mit fastText!
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Spielen Sie mit dem Passwortmechanismus von GitHub Webhook und Python
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu