私は、テキストから重要な情報を引き出す必要があるアプリケーションに取り組んでいます。このキャッチは、OCRされたドキュメントから来るテキストであるため、OCR認識エラー、ノイズ、ガベージ文字などが存在する可能性があります。また、ドキュメントのテキストは、ソースに応じて100万種類もあります。これらのタイプの正規表現は最適化できますか?
したがって、多くの正規表現を使用してテキストを引き出します。大量になると、サーバー上のCPUが壊れていました。私は正規表現をあらかじめコンパイルして、改善せずにキャッシュしてみました。プロファイラは、ランタイムの65%がRegex.Match()の呼び出しによるものであることを示しています。
正規表現を読み上げると、壊滅的なバックトラックがパフォーマンス上の問題であることがわかります。
のは、私は(これは私たちの正規表現の一般的なフォーマット説明するために単純なものです - 他の人がより多くのキーワードと形式を含めることができます)このような式があるとしましょう:
(.*) KEYWORD1 AND (.* KEYWORD2)
私はステップスルー正規表現のコーチと、私はそれが文字列に一致するバックトラックの多くを参照してください。
このタイプの正規表現を概念的に改善できますか?私たちは文書全体(テキストの小塊)のサブセットに対してのみ実行しますが、ブロブを取り出すための前処理は本質的に完璧ではありません。
だから、ええ、ほとんど何が「KEYWORD1」の前に現れることができ、何が「KEYWORD2」の前に現れることができる、など
我々はAZに制限する代わりにすることはできません。*、OCRで以来、文字は時には数字に間違い(Illene = I11ene)したり、OCR認識エラーのためにそこにガベージ文字を入れることがあります。
regexesは左から右に行くので、私が使用したトリックは、文字列を逆にして、正規表現を '反転'することです。だから文字通り(2DROWYEK。*など)ちょうど考え。 – sniperd
@sniperd、いくつかの正規表現は。*で終わります。 – SledgeHammer
どのような正規表現がありますか?すべてが実際に正規の場合は、DFAベースのエンジンを使用して、バックトラッキングなしで一致させることができます。それらがさらに制限されている(または他の方法で制限されている)場合は、さらに簡単なアプローチがあるかもしれません。 – Ryan