Können neuronale Netze Schecks lesen?

Seit fast drei Jahren zeichne ich alle meine Einnahmen und Ausgaben gewissenhaft in hledger auf . Warum genau er? Es ist historisch passiert. Mit Beginn des Jahres 2018 begann ich, alles auf Google aufzuschreiben, und im April ging ich nach Japan. Ich saß in einem Hotel und versuchte herauszufinden, wie man Preise in verschiedenen Währungen richtig berechnet, und beschloss, etwas über das Lisp zu schreiben. Und er schrieb . Und er zeigte es den Leuten im E-Mail-Chat. Auf die ich die Antwort "aber es gibt bereits eine fertige" und einen Link zu hledger erhalten habe. Dann habe ich alle meine Einträge von der Google-Platte in hledger gezogen.

Was ich an dieser Art der Kostenabrechnung liebe, ist die Möglichkeit, die Geschichte neu zu schreiben. Deshalb habe ich beschlossen, dass die Kopfhörer, die ich letztes Jahr für meine Frau gekauft habe, nicht als "Ausrüstung", sondern als "Geschenk" geschrieben werden sollten - kein Problem.

Und jetzt, als ich irgendwann einen Scheck vom Schnabeltier studierte, fragte ich mich, wie viel ich für Schokolade ausgeben sollte. Spoiler - viel. Ich ging in die Bestellhistorie, fand dort alte Belege und schrieb die Einträge nach Kategorien um. Es gab nur "Ausgaben: Essen", aber jetzt "Ausgaben: Essen: Obst" und andere. Gleichzeitig wurden dort auch einige Haushaltsgegenstände gefunden.

Das erste Mal habe ich dieses Umschreiben komplett von Hand gemacht. Das heißt, er kam aus dem Laden nach Hause, schaute auf den Scheck und schrieb viele Zeilen auf. Dann habe ich ein wenig automatisiert - ich habe eine Vorlage für eine Platte in Emacs erstellt, in der die Linien Produkte mit ihren Kategorien und Preisen enthalten, und in der letzten Spalte gibt der Filter nach Kategorie sofort die Mengen an.

Aber neuronale Netze und andere Datenatanismus.

In meinem Kopf entstand die Idee, dass das neuronale Netzwerk durchaus verstehen kann, dass "GL.VIL.Oranges SELECT.fas.1kg" eine solche Frucht ist, im Gegensatz zu "BOTTOM.HL.aton PODMOSKOVNY 400g" (Brot, aber dafür musste ich kopieren Dies ist der Name bei Google)

Das zu lösende Problem ist offensichtlich die Klassifizierung. Zeilennamen werden an die Eingabe gesendet, und an der Ausgabe wird eine Kategorie erwartet. Zunächst werde ich diese Kategorien manuell einfügen und dann nur die Vorhersagen bearbeiten. Dementsprechend muss das Programm zuerst den Text des Schecks analysieren, die Namen der Produkte und deren Preise von dort auswählen und die Kategorie für jeden Namen vorhersagen. Zeigen Sie mir die vorhergesagten, damit ich sie korrigieren kann. Wenn alles in Ordnung ist, bilden Sie eine Reihe von Linien für den Hedledger.

, . , .

def parse_utk(lines):
    while lines:
        if lines[0].startswith('  '):
            break
        lines.pop(0)
    else:
        return
    lines.pop(0)
    result = []
    while lines:
        data = lines[0:6]
        name, price, lines = lines[0], lines[3], lines[6:]
        if name.startswith(''):
            break
        assert price.startswith('= ')
        result.append((name, Decimal(price[2:]))
    return result

, . .

, . , character-level , flair. – . – . , , .

, . " ", . . . 23 21. – .

hledger.

$ hledger bal  -b thisyear -% -S
             100.0 %  expenses:
              20.6 %    <unsorted>
              15.3 %    
               7.9 %    
               7.1 %    
               6.9 %    
               6.3 %    
               5.2 %    
               4.8 %    
               4.0 %    
               3.8 %    
               2.7 %    
               2.7 %    
               2.0 %    
               2.0 %    
               1.7 %    
               1.6 %    
               1.3 %    
               1.2 %    
               0.9 %    
               0.9 %    
               0.5 %    
               0.4 %    
               0.2 %    

, . . , ( ) .

. , . , ?

– , . rule-based . ( - ) , ? , .

– NER. flair, ( ? ). . , IOB- … , .

rule-based , . . , "" . , . , , , . -, rule-based .

, . , . , . flair SpaceTokenizer, , . " ". , .

- - : " , , , ". , "1 107 99" , 107 99 . , ( ). ? , , .

, . . – " ", " " " ". NER . " " "".

. , (, , NewlineTokenizer), . , ColumnCorpus . \r, , . vertical tab (\x0b), RS US.

- , . , O, . , , . , , , .

, 'entry' 'entry'. – . 'O', , 'O\n', .

, . – flair.

. – , "" . .

rule-based , "" . , , rule-based . , , , rule-based .

Ein einziger Scheck reichte aus, um Tagger auszubilden. Zwar musste ich zuerst das Skript fertig stellen, um die Zwischenergebnisse zu bearbeiten, und sie dann auch im richtigen Format speichern (ich habe das spezielle Spaltentrennzeichen vergessen und eine Stunde lang nicht verstanden, warum nichts funktioniert hat). Es bleibt nur die "neuronale Netzwerk" -Partition mit dem Hauptparser zu verschrauben.

Dann kämmen Sie den Code und veröffentlichen.

PS- Quellen




All Articles