このページで解説すること
IQ Botで、正解の選択肢が決まっている読取項目に対して、「OCRの読み取り結果を選択肢の中で最も近いものに寄せたい!」という場合に使えるロジックです
なお、このページに書いてある方法が使えるのは、Automation360.21以降に付随するIQ Botのみです。
こんなときに便利
例えば「決済方法」という項目で、正解が「代引」「銀行振込」「クレジット」のいずれかに決まっているとします。
OCRの読み取り結果は、正解を正しく読めるかもしれないし、「クレジツト」(ツが大文字)などのように微妙に誤読をするかもしれない。
でも、「クレジツト」は3つの正解の中では明らかに「クレジット」に近いので、結果をそれに寄せたい! というときに使えます。
ズバリこうやります
フィールド項目の場合は、ズバリこうやります。
import IQBotHelper as iq
matchList = ("代引","銀行振込","クレジット") #カスタム部分①
maxRatio = 0
currentRatio = 0
result = ""
for i in matchList:
currentRatio = iq.fuzzy_match (field_value, i, ratio = True)
if currentRatio >= 0.5: #カスタム部分②
if currentRatio > maxRatio:
result = i
field_value = result
コメントで記載した「カスタム部分」を読みたい条件に合わせて変えればできあがりです。変え方は後述します。
テーブルの場合は、上記を関数化して項目に適用するだけなのですが、そちらのチートシートも機会があれば作ります。
本当はもう少し解説を深掘りするべき部分があるとわかっているのですが(IQBotHelperってなんやねんとか)、
カスタム部分の解説
カスタム部分①:選択肢
カスタム部分その1は、以下の部分です。
matchList = ("代引","銀行振込","クレジット") #カスタム部分①
matchListの中身を、正解の選択肢に変えてあげます。数は自由です。
「りんご」「バナナ」「みかん」「ぶどう」が選択肢なら、こんな感じにします。
matchList = ("りんご","バナナ","みかん","ぶどう") #カスタム部分①
カスタム部分②:閾値
続いてのカスタム部分は、ここの3行目です。
for i in matchList:
currentRatio = iq.fuzzy_match (field_value, i, ratio = True)
if currentRatio >= 0.5: #カスタム部分②
if currentRatio > maxRatio:
result = i
「currentRatio >= 0.5」の「0.5」の部分には、ファジーマッチの結果の閾値を指定します。
いくら「もっとも近いものを答えとする」といっても、「クリケット」を「クレジット」に補正するくらいならいいけど、「オーストラリアット」を「クレジット」に補正されるのはどうもなぁ(最後の「ット」が共通しているとはいえ)……みたいなときに使います。
上記のように、「たとえ選択肢の中では一番近くても、一定の確信度を満たしていなければ空欄にした方がマシ」みたいな場合は、そのマッチ度を設定します。
「0.5」は50%なので、マッチ度が50%を超えていて、なおかつ選択肢の中でいちばん近いものがIQ Botの結果として出て来ます。
この場合、選択肢のどれとも50%以上のマッチ度でマッチしなければ、IQ Botの結果としては空欄が返ります。
「いやいや、マッチ度はどんなに低くてもいいので、とりあえず何か正解らしきものを入れておきたい!」という場合は、ここをゼロにします。
#以上!
現時点では以上ですが、そのうちもう少し解説を書くつもりです。
IQBotHelperについてとか、ファジーマッチってなんやねんとか。。。とかとか。。。
(IQBotHelperライブラリは、Automation360.21から追加された、IQ Botの補正に便利なカスタムロジックのライブラリでオンプレ・クラウド問わず使えるやつなんですが、個人的にはライブラリを使って処理する価値があるのはこのfuzzy_matchくらいだと思ってます。他は特にライブラリ使わなくても、下記のページにまとめた内容で対応できるので)