IQ Botのカスタムロジック:日付によくある読み癖の補正


OCRで日付を読み込んだときに、比較的よく見かけるOCRの読み癖のパターンがあります。

「YYYY年MM月DD日」の「日」の部分が
「B」(アルファベットのビー)になっているパターンと、
「0」(ゼロ)になっているパターンです。

「年」や「月」が違う読み方をされているケースはあまり見たことがないのですが、
なぜか「日」だけはいろんなパターンの帳票でBになったり0になったりしています。

IQ Botでは、そんなOCRの読み癖を補正してキレイにできるので、ここではそのやりかたを紹介します。

日をBと読んでしまうパターンへの対応

この場合は、こちらでも紹介した単純な置換処理で対応できます。

日付項目の日をBと読んでしまうパターンへの対応(フィールド項目の場合)
field_value = field_value.replace("B","日")

日付の項目で「B」が正解データに含まれることは考えにくいので、単純に置き換えて問題ないでしょうと。

テーブル項目の場合は、こちらを参照してください。

日を0(ゼロ)と読んでしまうパターンへの対応

こちらの場合は、単純に置換というわけにいきません。
「10日」「20日」「30日」などのように、0が正解になる場合があるからです。

対処方法(チートシート:フィールド編)

答えを先に言ってしまうと、「日」をゼロと読んでしまう問題に対しては、以下のコードで対応できます。

日付項目の日をゼロと読んでしまうパターンへの対応(フィールド項目の場合)
if(field_value[-1:]=="0"):
    field_value = field_value[:-1]
    field_value = field_value + "日"

対処方法(チートシート:テーブル編)

テーブルの場合は、おまじないコード(こちら参照)の間に、以下のコードを書くことで対応できます。

日付項目の日をゼロと読んでしまうパターンへの対応(テーブル項目の場合)

#日付の最後がゼロだったら日に置き換える関数
def dayreplace(ymd):
    x = str(ymd)
    if(x[-1:] == "0"):
        x = x[:-1]
        x = x + "日"
    return x

#表の文字列置換
df['日付の補正をしたい列名'] = df['日付の補正をしたい列名'].apply(dayreplace)

仕組みの説明

フィールド編、テーブル編に共通するポイントは3つです。

①if文(条件分岐) ②スライス ③文字列を連結させるための+演算子

テーブル編は、上記に加えて関数という仕組みを使っています。

それぞれわかりやすい説明をリンクしておきます。

  • ① if文(=条件分岐)
    上記のコードは、1行目が処理するかどうかを決める条件、2行目と3行目が条件に該当したときに行う処理となっています。
    if文についての説明は、 こちらの記事がわかりやすかったです。

  • ② スライス
    上記のコードの1行目にあるfield_value[-1:]field_value[-1:]はスライスという仕組みを使っています。
    スライスは、文字列の何番目から何番目を取り出してね、みたいな処理のこと。
    スライスについての説明は、こちらの記事がわかりやすかったです。

  • ③ 文字列を連結させるための+演算子
    3行目のコードは、一見すると足し算か? と思われるかもしれませんが、文字列と文字列をくっつけているだけです。
    へーそんなことができるのねーくらいの理解で十分ですが、参考までにこちらのリンクを貼っておきます。

  • テーブル編:関数
    関数については、こちらの説明がわかりやすかったです。

まとめに変えて

以上を踏まえて、いちおう自前でフィールド編のコードに解説をつけておきます。

日付項目の日をゼロと読んでしまうパターンへの対応(フィールド項目の場合)
if(field_value[-1:]=="0"):              #field_valueの最後の文字が"0"だったら、以下の処理をしてね
    field_value = field_value[:-1]      #field_valueから、最後の1文字を除外 例:YYYY年MM月DD0をYYYY年MM月DDにする
    field_value = field_value + "日"    #↑の処理をしたfield_valueに、"日"をくっつける

ものすごく細かいことを言うと、2行目の処理の説明はちょっと端折ってます。

正確には、「field_valueの1文字目から初めて、最後の文字を含まない文字列を取り出して、そいつをfield_valueに代入してね」と言うべきなのかもしれませんが、わかりにくいし、結果的には同じことなので端折った方の説明を採用しました。

紙帳票をデータ化するにあたって、日付はほぼ全帳票で必須で扱う項目になってくるかと思いますので、
ぜひこちらで紹介したコードを活用してみてください!