هل يمكن للشبكات العصبية قراءة الشيكات؟

منذ ما يقرب من ثلاث سنوات حتى الآن ، كنت أسجل بدقة جميع مداخلي ونفقاتي في hledger . لماذا هو بالضبط؟ حدث ذلك تاريخيا. مع بداية عام 2018 ، بدأت في تدوين كل شيء على Google ، وفي أبريل ذهبت إلى اليابان. كنت جالسًا في فندق وأحاول معرفة كيفية حساب الأسعار بعملات مختلفة بشكل صحيح ، وقررت كتابة شيء ما على Lisp. وقال انه كتب . وأظهرها للأشخاص في الدردشة عبر البريد الإلكتروني. الذي تلقيت الإجابة "ولكن هناك بالفعل واحدة جاهزة" ورابط إلى hledger. ثم قمت بسحب جميع إدخالاتي من لوحة google إلى hledger.

ما أحبه في هذه الطريقة في محاسبة النفقات هو القدرة على الخروج وإعادة كتابة التاريخ. لذلك قررت أن سماعات الرأس التي تم شراؤها العام الماضي لزوجتي يجب أن تكتب ليس كـ "تقنية" ، ولكن كـ "هدايا" - لا توجد مشكلة.

والآن ، وأنا أدرس في وقت ما شيكًا من Platypus ، تساءلت ، كم أنفق على الشوكولاتة؟ سبويلر - كثيرا. ذهبت إلى محفوظات الطلبات ، ووجدت الإيصالات القديمة هناك ، وأعدت كتابة الإدخالات حسب الفئة. كانت هناك فقط "مصاريف: طعام" ، أما الآن "نفقات: طعام: فواكه" وغيرها. في الوقت نفسه ، تم العثور أيضًا على بعض السلع المنزلية هناك.

في المرة الأولى التي كنت أقوم فيها بإعادة الكتابة بالكامل يدويًا. أي أنه عاد إلى المنزل من المتجر ، ونظر إلى الشيك وكتب العديد من السطور. ثم أتمتة قليلاً - لقد صنعت نموذجًا للوحة في emacs ، حيث تحتوي السطور على منتجات بفئاتها وأسعارها ، وفي العمود الأخير ، يعطي الفلتر حسب الفئة المبالغ على الفور.

لكن الشبكات العصبية و datasatanism الأخرى.

نشأت فكرة في رأسي مفادها أن الشبكة العصبية قادرة تمامًا على فهم أن "GL.VIL.Oranges SELECT.fas.1kg" مثل هذه الفاكهة ، على عكس "BOTTOM.HL.aton PODMOSKOVNY 400 جرام" (خبز ، ولكن لهذا كان علي نسخ هذا هو الاسم على جوجل).

من الواضح أن المشكلة التي يتعين حلها هي التصنيف. يتم إرسال أسماء الأسطر إلى الإدخال ، ومن المتوقع وجود فئة في الإخراج. في البداية ، سأضع هذه الفئات يدويًا ، ثم أقوم بتعديل التوقعات فقط. وفقًا لذلك ، يجب على البرنامج أولاً تحليل نص الشيك ، واختيار أسماء المنتجات وأسعارها من هناك ، والتنبؤ بفئة كل اسم. أرني ما هو متوقع حتى أتمكن من تصحيحه. عندما يكون كل شيء على ما يرام ، قم بتشكيل مجموعة من الخطوط لهليدجر.

, . , .

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 .

كان شيك واحد كافيا لتدريب تاغرس. صحيح ، في البداية كان علي إنهاء البرنامج النصي لتحرير النتائج الوسيطة ، ثم حفظها أيضًا بالتنسيق الصحيح (تمكنت من نسيان فاصل العمود الخاص ولم أفهم لمدة ساعة لماذا لا يعمل شيء). يبقى فقط المسمار قسم "الشبكة العصبية" إلى المحلل اللغوي الرئيسي.

ثم قم بتمشيط الكود ونشره.

مصادر PS




All Articles