スキャンしたドキュメントから、OCRエラーの可能性があるキーワードを特定したいと思います。スキャンされたドキュメントの各文字とその代替のキーワードと信頼値のリストに基づいて、信頼できるキーワードを識別するためのアルゴリズムをどのように開発できますか?
OCRには、各キャラクターとその最良の選択肢の信頼値を提供するTesseractを使用しています。したがって、すべての単語について、次のようなリストがあります。
Word=order
[0] o (93%) [alts: 0 (90%), c (83%), e (82%)]
[1] r (96%)
[2] d (96%)
[3] e (90%) [alts: a (75%)]
[4] r (95%)
OCRエラーを含む別の例:
Word=PaYmeHI (Payment would be correct)
[0] P (81%) [alts: p (78%), D (68%)]
[1] a (76%) [alts: 3 (73%), e (63%), ö (61%)]
[2] Y (87%) [alts: V (86%)]
[3] m (83%)
[4] E (71%) [alts: € (79%), 9 (72%), % (67%), e (65%), B (64%), G (64%)]
[5] H (76%) [alts: n (83%), D (74%), N (70%), ü (69%)]
[6] I (75%) [alts: t (69%), { (67%), 1 (65%), i (61%)]
ご覧のとおり、tesseractは常に最高のパーセンテージ(4、5)の結果を選択するとは限りません。
スキミングから結果まで、90%を超える値を持つほとんどの文字が正しいように見えます。ただし、悪い結果には、選択肢のリストに正しい文字が含まれているとは限りません([2]を参照してください。これは小文字である必要があります)y
。
現在、レーベンシュタイン距離と文字列の長さを使用して候補のリストを取得しています。さらに、キーワードを除外していlev2 > 3
ます。しきい値を決定するための良い方法をまだ探しているので、これはハードコーディングされています。
int lev = getLevenshteinDistance(keyword, s);
int lev2 = getLevenshteinDistance(keyword.toLower(), s.toLower());
int len = Math.abs(keyword.length - s.length);
int x = lev + lev2 + len;
x
最も可能性の高い結果を得るために、キーワードのリストをで並べ替えています。
そこでまず、OCRの結果と文字列の長さに基づいて適切なしきい値を決定する方法を探しています。短い文字列は、大きな文字列よりも低いしきい値を必要とし、OCRの結果も確実になります。上記の例を見てください。語順については、lev2 <= 1
で十分ですがpayment
、少なくともlev2 <= 3
については計算する必要があります。
次に、残った候補の1つが実際に単語と一致するかどうかをどのように判断できますか?lev == 0
すべてのキャラクターの信頼値が正しい場合と>= 90
それは明らかです。しかし、悪いOCRの結果を考慮すると、代替のOCRの選択肢も含む、どのアルゴリズムを開発できますか?