¿Pueden las redes neuronales leer cheques?

Durante casi tres años, he estado registrando escrupulosamente todos mis ingresos y gastos en hledger . ¿Por qué exactamente él? Ocurrió históricamente. Con el inicio de 2018, comencé a escribir todo en Google y en abril fui a Japón. Estaba sentado en un hotel tratando de averiguar cómo calcular correctamente los precios en diferentes monedas, y decidí escribir algo en el Lisp. Y él escribió . Y se lo mostró a la gente en el chat de correo electrónico. A lo que recibí la respuesta "pero ya hay una lista" y un enlace a hledger. Luego arrastré todas mis entradas de la placa de Google a Hledger.

Lo que me encanta de esta forma de contabilizar los gastos es la capacidad de salir y reescribir la historia. Así que decidí que los auriculares que compré el año pasado para mi esposa no debían escribirse como "equipo", sino como "regalos", no hay problema.

Y mientras estudiaba en algún momento un cheque del Ornitorrinco, pensé, ¿cuánto gasto en chocolate? Spoiler - mucho. Entré en el historial de pedidos, encontré recibos antiguos allí, reescribí las entradas por categoría. Solo había "gastos: comida", pero ahora "gastos: comida: frutas" y otros. Al mismo tiempo, también se encontraron allí algunos enseres domésticos.

La primera vez que estaba haciendo esta reescritura completamente a mano. Es decir, llegó a casa desde la tienda, miró el cheque y escribió muchas líneas. Luego automaticé un poco - hice una plantilla para un plato en emacs, donde las líneas contienen productos con sus categorías y precios, y en la última columna, el filtro por categoría da inmediatamente las cantidades.

Pero redes neuronales y otro satanismo de datos.

Se me ocurrió la idea de que la red neuronal es bastante capaz de entender que "GL.VIL.Oranges SELECT.fas.1kg" es una fruta, en contraste con "BOTTOM.HL.aton PODMOSKOVNY 400g" (pan, pero para esto tuve que copiar este es el nombre en google).

El problema a resolver es, obviamente, la clasificación. Los nombres de líneas se envían a la entrada y se espera una categoría en la salida. Inicialmente, colocaré estas categorías manualmente y luego solo editaré las predicciones. En consecuencia, el programa primero debe analizar el texto del cheque, seleccionar los nombres de los productos y sus precios desde allí, predecir la categoría para cada nombre. Muéstrame lo predicho para que pueda corregirlo. Cuando todo esté en orden, forme un conjunto de líneas para el hledger.

, . , .

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 .

Una sola verificación fue suficiente para entrenar a los etiquetadores. Es cierto que al principio tuve que terminar el script para editar los resultados intermedios y luego también guardarlos en el formato correcto (logré olvidarme del separador de columna especial y no entendí durante una hora por qué nada funcionaba). Solo queda atornillar la partición "red neuronal" al analizador principal.

Luego peina el código y publica.

Fuentes de PS




All Articles