在将近三年的时间里,我一直将所有收入和支出都严格记录在hledger中。为什么是他?它发生在历史上。从2018年开始,我开始在Google上写下所有内容,并于4月前往日本。我坐在一家旅馆里,试图弄清楚如何正确计算不同货币的价格,并决定在Lisp上写一些东西。然后他写道。然后他通过电子邮件聊天向人们展示了它。我收到的答案是“但是已经有现成的答案”和指向分类帐的链接。然后,我将所有条目从Google板块拖到分类帐中。
我喜欢这种费用核算方式,因为它具有外出和重写历史记录的能力。因此,我决定去年为我妻子购买的耳机不应写成“技术”,而应写成“礼物”,没问题。
现在,我从某个地方研究鸭嘴兽的支票,我想知道我在巧克力上花了多少钱?剧透-很多 我进入了订单历史记录,在那里找到了旧收据,并按类别重写了条目。以前只有“费用:食物”,但现在有“费用:食物:水果”和其他。同时,在那里也发现了一些家庭用品。
我第一次完全手动进行此重写。也就是说,他从商店回家,看着支票,写下了很多行。然后,我进行了一些自动化-在emacs中为一个盘子制作了一个模板,其中的行包含产品及其类别和价格,在最后一列中,按类别的过滤器会立即给出金额。
但是神经网络和其他数据安全主义。
我脑海中浮现出一个想法,即神经网络完全能够理解“ GL.VIL.Oranges SELECT.fas.1kg”就是这种水果,与“ BOTTOM.HL.aton PODMOSKOVNY 400g”相比(面包,但是为此我不得不复制这是google上的名称)。
要解决的问题显然是分类。行名被提交到输入,并且在输出处应该有一个类别。最初,我将手动放置这些类别,然后仅编辑预测。因此,程序必须首先分析支票的文本,从中选择产品名称及其价格,并预测每个名称的类别。给我看一下预测,以便我可以纠正它。当一切都井井有条时,为分类账形成一组线。
我只是通过将行分成几行,然后对行进行分析。用python制定的通常规则。
或多或少像这样
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
不是最优雅的代码,但它能完成工作。以类似的方式,我立即编写了Pyaterochka和Magnet的检查规则。
然后开始更有趣的部分,即神经网络。我一直相信,未来属于角色级别的模型,特别是我喜欢天赋。要创建神经网络,需要两个组件-语言模型和分类器本身。我重复制作一个语言模型-预测后续字符并预测先前字符。立即编写了用于训练网络的脚本,以便可以从头开始训练网络并重新训练现有网络。
, . " ", . . . 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来源