一部のスキャンをプレーンテキストに変換するためにOCRを使用していますが、残念ながら、一部のフォントのプレーン文字「fi」は大文字Wで読み取られます。これで、すべてのWを「fi」に置き換える必要があり、これらのWは実際の英語では単語の真ん中に大文字のWが現れないという事実と簡単に区別できます。したがって、すべての単語の真ん中にある大文字Wを文字fiに置き換えるsed一行ステートメントが必要です。
答え1
大文字 W は単語の末尾には表示されませんが、すべて大文字の略語には現れます。そのためW
、小文字の直後に来るか、大文字の次と小文字(aWre)の前に来ると交換します。
sed -e 's/\([[:lower:]]\)W/\1fi/g' -e 's/\([[:alpha:]]\)W\([[:lower:]]\)/\1fi\2/g'
これは含まれていませんfifi
(私の最大の単語のリストは「fifing」でのみ見つけることができます)。さらに、これにはW
単語の先頭は含まれません。 2番目の文字を見ると、いくつかのケースがわかりますが、それでも始まる多くの単語がありませんfi
。英語では、Wの後に多くの文字が表示されません。
… -e 's/\([^[:alnum:]]\)W\([b-dfgj-npqstv-xz]\)/\1fi\2/g' \
-e 's/^W\([b-dfgj-npqstv-xz]\)/fi\2/'
より正確な結果を得て他の言語を処理するには、より洗練された辞書ベースのアプローチに切り替えることができます(高度なOCRシステムはしばしばこのアプローチを使用しますが、明らかにシステムは十分に進歩していません)。
答え2
ほとんどの場合を解決するための迅速で簡単な答えは次のとおりです。
sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
W
前後にスペースがない内容はすべて置き換えられますfi
。次の簡単なテストケースでエラーをキャッチします。
$ echo "blah blah blah trafWc" | sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
blah blah blah traffic
$ echo "blah blah blah Wallaby" | sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
blah blah blah Wallaby
ただし、以下はキャプチャしません。
$ echo "blah blah blah Wnger" | sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
blah blah blah Wnger
ご覧のとおり、これは次のように変更する必要があります。指。したがって、残念ながら、まだこれらのことを確認する必要があります。
答え3
ここでは基本について説明しましたsed
が、テキストを支援するためにできる他のいくつかの作業があります。
最初のステップは、まずこのコンテンツを認識するようにOCRプログラムをトレーニングすることです。ほとんどのOCRシステムには、新しい文字を教え、そのような一般的な間違いから学ぶためのシステムの一種があります。コーパスがこのように検索と交換を要求するのに十分な大きさであれば、OCRエンジンがそのようなミスをしないように教えるのに十分な大きさでなければなりません。
第二に、スペルチェックエンジンを介してテキストを実行することができます。多くのOCRプログラムは、「この単語をこのように転写することは意味がありますか?」などの内部自己チェックの一部としてこの手順を実行します。もちろん、これを直接実行して、すべてが正しく変換されたことを確認できます。