Googleレンズでレシートの文字起こしをして、データベースに取り込むプログラムをPythonで作成する計画です。
今回、その実現のために必要となる技術や操作性を検証するためにプロトタイプを作成しました。
以前のブログ「家計簿 Amazon領収書の取込みプログラム」でAmazon領収書のWebデータをExcelの表に取り込むプログラムを紹介しましたが、その中でレシートの情報を入力する手間が大変で3カ月ほどで挫折した、と言いました。
入力作業中、「何とかレシートの入力作業を簡素化できないだろうか」と常に思っていました。
漠然と「Googleレンズを利用すれば簡素化できるかもしれない」という発想はありました。
それは、スマホのGoogleレンズでレシートを撮影して文字起こしをし、そのデータをパソコンに貼り付けて編集し、編集したデータを家計簿のデータベースに取り込む、というものでした。
この発想を具体化するために、いつかまとまった時間がとれるようになったら検討してみよう思っていました。
今回、8月7日から8月12日の期間まとまった休みがとれたので、実現するために必要な技術や操作性を検討することにしました。
次の項目について検討しました。
1. Googleレンズの操作性
スマホでレシートを撮影して文字起こしをする操作をしてみて、操作性を確認する。
2.パソコンに貼り付けたレンズデータの編集
- 文字翻訳の精度の確認
- 貼り付けた文字情報の取捨選択(どの情報を残すか)
- 選択した情報をどのような形式に編集するのか(CSV形式にするなど)
3.レンズで取得した情報に不足している分を付加する方法
レシートにない科目コード、税区分、支払方法などの情報をどのように付加するか。
その方法とそれを実現するための技術の検討。
4.データベースへ取り込む方法
過不足なく編集したデータをデータベースにどのように取り込むか、技術面の検討。
開発言語はPython、データベースはMySQLにすることは、既に決めていました。
Python開発環境は、Jupyter NoteBookで行います。
データベースについては、Accessデータベースに今までのに過去のレシートデータを登録しているので、テーブル設計はそれを踏襲します。
Accessデータベース上のテーブルデータは、MySQLデータベースへ移行します。
「1.レンズの操作性」については、Googleレンズを起動して、レシートを撮影し、[翻訳]を選択すると、画像の文字部分を自動認識してテキストデータに翻訳してくれます。
操作は、いたって簡単です。
「2.パソコンに貼り付けたレンズデータの編集」、「3.レンズで取得した情報に不足している分を付加する方法」、「4.データベースへ取り込む方法」については、Pythonでどのような技術を使えば実現可能なのか、プロトタイプを作成して検証しました。
プロトタイププログラムを作成したので、それに基づいて概要を紹介していきます。
スマホでテキストに翻訳したデータをパソコンに取り込むのは、Chromeを起動し(Googleレンズと同じGoogleアカウントで起動)、Ctrl+Vで貼り付けるだけです。
この操作も、いたって簡単です。
翻訳の精度は、誤翻訳が散見されるものの、許容範囲内で、実用に耐えられる精度でした。
Pythonプログラムでは、TextAreaウィジェットに貼り付けて、TextArea内で編集します。
コーナンのレシートで実際に、翻訳➡貼り付け➡編集➡データベースへの登録まで行ったので、その事例で概要を紹介します。
以下は、TextAreaに貼り付けたデータで、青字の部分は、レシート情報の中から取り出すデータです。
赤字は、私のコメントです。
取り出すデータは、品名、単価、数量です。
サンプル事例のレシートの場合、数量が1の場合はレシートに数量が表示されていません。
数量が複数の場合は@360×2のように、@単価×数量の形式になっています。
誤翻訳などがあるので、レシートと突き合わせて確認は必要です。
不要なデータは削除し、誤翻訳は修正し、翻訳されていないデータは追加します。
●領収証をご持参の 2週間以内にお願いいたしま とせ部商品につきましては、除外 させて頂きます。) #026 2020年1月6日21時08分 **接木ナス千両2号10.5 @360 ×⇐@単価×数量なのですが、数量2が翻訳されていません #011 JAN4562236220936 720以内⇐数量が2以上の場合は、単価×数量の金額が表示されます **接木ミニトマト 千果1.0 @360 × 2⇐@単価×数量の数量2が離れています #024 JAN4549131677805 720以内⇐数量が2以上の場合は、単価×数量の金額が表示されます アルカリ電解水+重曹配合お #002 JAN4548927005419 110以内⇐数量が1の場合は、品名の後に単価だけ表示されます **替刃式折込鋸210mm #024 JAN4549131370522 1,078以内⇐数量が1の場合は、品名の後に単価だけ表示されます 落ち落ちVフローリング取り 小計金額 @110×2⇐品名「落ち落ちVフローリング取り」の単価×数量が品名から離れて表示されています(途中に小計金額) |
貼り付けたデータを編集して、品名、単価、数量の形式に編集します。
コーナンのレシートの場合、数量1の時はレシートに数量が表示されないので、1を追加します。
品名、単価、数量を改行で区切って、3行で1アイテムにする形式にしました。
以下が編集したものです。
接木ナス千両2号10.5 ⇐品名 360 ⇐単価 2⇐数量 接木ミニトマト 千果1.0 ⇐品名 360 ⇐単価 2 ⇐数量 アルカリ電解水+重曹配合お ⇐品名 110 ⇐単価 1 ⇐数量(レシートにないので1を追加) 替刃式折込鋸210mm ⇐品名 1078 ⇐単価(1.078 ➡ 1078 カンマを取って編集) 1 ⇐数量(レシートにないので1を追加) 落ち落ちVフローリング取り ⇐品名 110 ⇐単価 2 ⇐数量 |
次に、レシートの各データの共通項目となる購入日、店名、支払方法を入力し、そのデータを上記データに付加します。
PythonのText、Label、Buttonなどのウィジェットで入力画面を作成しました。
[OK]ボタンがクリックされたら、購入日、購入店、支払区分を付加して次のような配列を作成します。
[[‘2024/04/20’, ”, ‘接木ナス千両2号10.5 ‘, ‘360’, ‘2’, ‘720’, ‘コーナン’, ‘3’], [‘2024/04/20’, ”, ‘接木ミニトマト 千果1.0 ‘, ‘360’, ‘2’, ‘720’, ‘コーナン’, ‘3’], [‘2024/04/20’, ”, ‘アルカリ電解水+重曹配合お’, ‘110’, ‘1’, ‘110’, ‘コーナン’, ‘3’], [‘2024/04/20’, ”, ‘替刃式折込鋸210mm’, ‘1078’, ‘1’, ‘1078’, ‘コーナン’, ‘3’], [‘2024/04/20’, ”, ‘落ち落ちVフローリング取り’, ‘110’, ‘2’, ‘220’, ‘コーナン’, ‘3’]] |
上記配列データをipysheet.sheetウィジェットを使ってスプレッドに表示します。
なお、スプレッドシートを使うためには、
「!pip install ipysheet」コマンドでライブラリをインストールしておく必要があります。
以下がデータを表示したスプレッドシートです。
このスプレッドシートに科目コードを入力します。(赤枠の部分)
科目コードはリストボックスで選択する方法が良いと思うのですが、検証用のプロトタイプなので、コードを直接入力する方法になっています。
なお、単価×数量の金額計算をここで行っています。
[OK]ボタンがクリックされたらデータベーステーブルにスプレッドシートのデータを保存します。
データベース操作をするために
「!pip install mysql-connector-python」コマンドでライブラリをインストールし、ライブラリの関数を使用してデータベースを操作します。
以上、プロトタイプを通してGoogleレンズの翻訳からレシートデータをデータベースに登録するまでの概要でした。
プロトタイプを作成して、必要な技術についてはほぼ解決したと思っています。
ウィジェットやスプレッドシートを使うことで、操作性も問題ないようです。
レシートの様式は、会社によってまちまちですが、品名、単価、数量の項目はすべてに共通していますので、翻訳したデータの編集の障害にはならないはずです。
消費税の扱いは、税区分を設けて本体価格と消費税額を自動計算させる予定です。
計算方法によって(四捨五入、切捨て、総額からの税計算か否かなど)1円くらいの誤差がでることがありますが、そこまで厳密に行うつもりはありませんので、外税(10%、8%)、内税(10%、8%)、非課税などの区分を設定し、レシート1行ごとに税額計算をする方式にする予定です。
値引きをどのようにするかは、課題です。
プロトタイプでレシート1枚をどれくらいのスピードで入力できるのか、これから検証していきます。
レシート1枚の件数が多ければ多いほど、楽になるはずです。
ただ、重要なのは、私が入力できるかどうかです。
実際のところ合計金額の入力だけでも大変だったので、入力できるかどうか、自信はありません。
たとえ使えないプログラムになったとしても、こうしてプログラミングしている時間が充実しているので、出来るかどうかはケセラセラです。
次回の投稿では、プログラムコードを紹介していきたいと思っています。
次へ Googleレンズと連携したレシート管理のプロトタイプ(その2)