[PYTHON] Lernen Sie Buchhaltungsdaten kennen und versuchen Sie, Konten aus dem Inhalt der Beschreibung vorherzusagen, wenn Sie Journale eingeben

Einführung

Wenn es Zeit ist, eine endgültige Erklärung einzureichen, werden Sie bei erneuter Bestätigung der Buchhaltungsdaten einige Fehler im Konto finden. Ich dachte, es wäre gut, wenn Sie die Buchhaltungsdaten durch maschinelles Lernen lernen und das Konto vorhersagen könnten.

Buchhaltungsdaten lesen

Exportieren Sie die Daten im CSV-Format aus der Buchhaltungssoftware und verwenden Sie sie. Diese Daten verwenden übrigens die Software "JDL IBEX Treasurer" als Beispiel.

http://www.jdl.co.jp/co/soft/ibex-ab/

Laden Sie die Daten mit dem folgenden Code.

python


import pandas as pd

filename = "JDL-Kontobuch-xxxx-xxxx-Tagebuch.csv"
df = pd.read_csv(filename, encoding="Shift-JIS", skiprows=3)

Grenzen Sie die zu verwendenden Daten aus den gelesenen Daten ein. Hier verwenden wir den Code und den Namen der Beschreibung und des Belastungspostens.

python


columns = ["Beschreibung", "Betreff belasten", "Betreff belasten正式名称"]
df_counts = df[columns].dropna()

Morphologische Analyse

Informationen zu den Beschreibungsdaten Durch morphologische Analyse werden die Zeichendaten als gerichteter numerischer Wert vektorisiert.

Eine Bibliothek namens Janome wird für die morphologische Analyse verwendet.

http://mocobeta.github.io/janome/

Wenn es nicht installiert ist, müssen Sie es mit dem folgenden Befehl installieren.

python


$ pip install janome

Der folgende Code konvertiert die Beschreibungsdaten in Token-Daten.

python


from janome.tokenizer import Tokenizer

t = Tokenizer()

notes = []
for ix in df_counts.index:
    note = df_counts.ix[ix,"Beschreibung"]
    tokens = t.tokenize(note.replace(' ',' '))
    words = ""
    for token in tokens:
        words += " " + token.surface
    notes.append(words.replace(' \u3000', ''))

Infolgedessen wird die folgende Konvertierung durchgeführt und es wird eine Zeichenfolge mit einem Abstand von halber Breite für jedes Wort.

Originalzusammenfassungsdaten "Souvenirgebühr BLUE SKY Haneda" Daten nach Änderung "Souvenirgebühr BLUE SKY Haneda"

Diese Zeichenfolge wird mit dem folgenden Code vektorisiert und als Eingabedaten verwendet.

python


from sklearn.feature_extraction.text import TfidfVectorizer

vect = TfidfVectorizer()
vect.fit(notes)

X = vect.transform(notes)

Es verwendet auch den Kontocode als Lehrerdaten.

python


y = df_counts.Betreff belasten.as_matrix().astype("int").flatten()

Maschinelles Lernen

Die in numerische Werte konvertierten Daten werden durch Kreuzvalidierung in Trainingsdaten und Verifizierungsdaten unterteilt.

python


from sklearn import cross_validation

test_size = 0.2
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=test_size)

Lernen Sie mit den geteilten Daten. Hier verwenden wir LinearSVC als Modell.

python


from sklearn.svm import LinearSVC

clf = LinearSVC(C=120.0, random_state=42)
clf.fit(X_train, y_train)

clf.score(X_test, y_test)

Die Punktzahl war "0,89932885906040272".

Prognose

Geben Sie aus den gelernten Ergebnissen die Testdaten wie unten gezeigt ein und überprüfen Sie, welche Art von Konto erwartet wird.

python


tests = [
    "Autobahnnutzungsgebühr",
    "Kosten für PC-Teile",
    "Stempelgebühr"
]

notes = []
for note in tests:
    tokens = t.tokenize(note)
    words = ""
    for token in tokens:
        words += " " + token.surface
    notes.append(words)

X = vect.transform(notes)

result = clf.predict(X)

df_rs = df_counts[["Offizieller Name des Belastungssubjekts", "Betreff belasten"]]
df_rs.index = df_counts["Betreff belasten"].astype("int")
df_rs = df_rs[~df_rs.index.duplicated()]["Offizieller Name des Belastungssubjekts"]

for i in range(len(tests)):
    print(tests[i], "\t[",df_rs.ix[result[i]], "]")

Das Ausgabeergebnis ist ...

python


Autobahnnutzungsgebühr[Reisekosten Transport]
Kosten für PC-Teile[liefert Kosten]
Stempelgebühr[Kommunikationskosten]

Es fühlt sich ziemlich gut an (^ - ^)

Übrigens braucht der Transferschein etwas mehr Einfallsreichtum.

Ich dachte, es wäre besser, wenn ich auch Informationen zu Monaten, Tagen und Abschlüssen verwenden könnte, aber ich war mir nicht sicher, wie ich mit den Lerndaten umgehen sollte, also werde ich später darauf eingehen.

Was soll ich als nächstes tun?

(Bonus) Trennung von Lernen und Vorhersage

Wenn Sie versuchen, das obige Programm so zu verwenden, wie es ist, ist es nicht effizient, da die tatsächlichen Daten bei jeder Ausführung gelesen, gelernt und dann vorhergesagt werden. Speichern Sie daher die Trainingsdaten und lesen Sie in dem zu prognostizierenden Teil die trainierten Daten und ändern Sie sie in Vorhersagen.

Lernergebnisse speichern

Sie können die Trainingsdaten speichern, indem Sie am Ende des obigen Programms den folgenden Code hinzufügen.

python


from sklearn.externals import joblib

joblib.dump(vect, 'data/vect.pkl')
joblib.dump(clf, 'data/clf.pkl')
df_rs.to_csv("data/code.csv")

Lernergebnisse lesen

Laden Sie im neuen Programm die Trainingsdaten wie folgt.

python


import pandas as pd

filename = "data/code.csv"
df = pd.read_csv(filename, header=None)
df.index = df.pop(0)
df_rs = df.pop(1)

from sklearn.externals import joblib

clf = joblib.load('data/clf.pkl')
vect = joblib.load('data/vect.pkl')

Prognose

Führen Sie nach dem Lesen der Trainingsdaten die Vorhersage weiter aus.

python


from janome.tokenizer import Tokenizer

t = Tokenizer()
tests = [
    "Autobahnnutzungsgebühr",
    "Kosten für PC-Teile",
    "Stempelgebühr",
]

notes = []
for note in tests:
    tokens = t.tokenize(note)
    words = ""
    for token in tokens:
        words += " " + token.surface
    notes.append(words)

X = vect.transform(notes)

result = clf.predict(X)

for i in range(len(tests)):
    print(tests[i], "\t[",df_rs.loc[result[i]], "]")

Das Ausführungsergebnis ist ...

python


Autobahnnutzungsgebühr[Reisekosten Transport]
Kosten für PC-Teile[liefert Kosten]
Stempelgebühr[Kommunikationskosten]

erledigt!

Recommended Posts

Lernen Sie Buchhaltungsdaten kennen und versuchen Sie, Konten aus dem Inhalt der Beschreibung vorherzusagen, wenn Sie Journale eingeben
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Geben Sie Breiten- und Längengradpunktsequenzdaten an und versuchen Sie, die Straße anhand von OpenStreetMap-Daten zu identifizieren
[Einführung in das logarithmische Diagramm] Prognostizieren Sie die Endzeit jedes Landes anhand des logarithmischen Diagramms der Infektionszahldaten ♬
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
[Anmerkung] Versuchen wir, den Stromverbrauch vorherzusagen! (Teil 1)
So vermeiden Sie doppelte Daten bei der Eingabe von Python in SQLite.
Lernen Sie die M-H- und HMC-Methoden, indem Sie die Bayes'schen Statistiken anhand der Grundlagen lesen
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Versuchen Sie, den Wert des Wasserstandsmessers durch maschinelles Lernen unter Verwendung der offenen Daten von Data City Sabae vorherzusagen
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Versuchen Sie, den Zustand der Straßenoberfläche mithilfe von Big Data des Straßenoberflächenmanagements zu ermitteln
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Versuchen Sie auch bei der Konvertierung von CSV in Leerzeichenbegrenzer ernsthaft, Eingabe / Ausgabe und Regeln zu trennen
Skript zum Ändern der Beschreibung von Fasta
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Bis Sie versuchen, DNN mithilfe von Colab die Wahrheit des Bildes mitteilen zu lassen
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
[Überprüfung] Nimmt levelDB Zeit zum Registrieren von Daten, wenn die Datenmenge zunimmt? ??
Versuchen Sie, die Eisenbahndaten der nationalen Landnummern in 3D anzuzeigen