ほぼ3年間、私はすべての収入と支出をhledgerに綿密に記録してきました。なぜ彼は正確に?それは歴史的に起こりました。2018年の始まりから、私はすべてをGoogleに書き留め始め、4月に日本に行きました。私はホテルに座って、さまざまな通貨で価格を正しく計算する方法を見つけようとしていて、Lispに何かを書くことにしました。そして彼は書いた。そして彼はそれを電子メールチャットで人々に見せました。「しかし、すでに既製のものがあります」という答えと、hledgerへのリンクを受け取りました。次に、すべてのエントリをgoogleプレートからhledgerにドラッグしました。
この費用の計算方法で私が気に入っているのは、外に出て履歴を書き換える機能です。そこで、昨年購入した妻用のヘッドホンは、「装備」ではなく「ギフト」と書いておくことにしました。問題ありません。
そして今、ある時点でプラティパスからの小切手を勉強して、私はチョコレートにいくら費やすのだろうかと思いました。ネタバレ-たくさん。注文履歴を調べて、そこで古いレシートを見つけ、カテゴリ別にエントリを書き直しました。「費用:食べ物」だけでしたが、今は「費用:食べ物:果物」などがありました。同時に、いくつかの家庭用品もそこで発見されました。
初めてこの書き直しを完全に手作業で行ったとき。つまり、彼は店から帰ってきて、小切手を見て、たくさんの行を書き留めました。次に、少し自動化しました。emacsでプレートのテンプレートを作成しました。ここで、行にはカテゴリと価格の製品が含まれ、最後の列では、カテゴリでフィルタするとすぐに金額が表示されます。
しかし、ニューラルネットワークやその他のデータサタニズム。
「BOTTOM.HL.atonPODMOSKOVNY400g」(パンですが、これをコピーする必要がありましたこれはグーグルの名前です)。
解決すべき問題は明らかに分類です。Lines-namesは入力に送信され、カテゴリは出力で期待されます。最初に、これらのカテゴリを手動で配置し、次に予測のみを編集します。したがって、プログラムは最初に小切手のテキストを分析し、そこから製品の名前とその価格を選択し、各名前のカテゴリを予測する必要があります。予測を表示して、修正できるようにします。すべてが整ったら、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 .
タガーを訓練するには、1回のチェックで十分でした。確かに、最初は中間結果を編集するためにスクリプトを終了し、次にそれらを正しい形式で保存する必要がありました(特別な列区切り記号を忘れて、何も機能しない理由を1時間理解できませんでした)。「ニューラルネットワーク」パーティションをメインパーサーにねじ込むだけです。
次に、コードを組み合わせて公開します。
PSソース