web-dev-qa-db-ja.com

ファジー正規表現

私の作業では、素晴らしい結果を得て、コードのスペルミスに対する脆弱性を低減するために、ダメラウレーベンシュタイン距離などの近似文字列マッチングアルゴリズムを使用しました。

ここで、TV Schedule for \d\d (Jan|Feb|Mar|...)などの単純な正規表現に対して文字列を照合する必要があります。これは、文字列TV Schedule for 10 Janは0を返しますが、T Schedule for 10. Janは2を返します。

これは、正規表現(この場合は100x12)ですべての文字列を生成し、最適な一致を見つけることで実行できますが、これは実用的なシームではありません。

これを効果的に行う方法はありますか?

47
Thomas Ahle

TREライブラリ を見つけました。これは、正規表現の正確なあいまい一致を実行できるようです。例: http://hackerboss.com/approximate-regex-matching-in-python/ ただし、挿入、削除、置換のみをサポートしています。転置なし。しかし、私はそれがうまくいくと思います。

次のファイルの正規表現を使用して、付属のagrepツールを試しました。

TV Schedule for 10Jan
TVSchedule for Jan 10
T Schedule for 10 Jan 2010
TV Schedule for 10 March
Tv plan for March

そして得た

$ agrep -s -E 100 '^TV Schedule for \d\d (Jan|Feb|Mar)$' filename
1:TV Schedule for 10Jan
8:TVSchedule for Jan 10
7:T Schedule for 10 Jan 2010
3:TV Schedule for 10 March
15:Tv plan for March

すべての提案をありがとうございました。

24
Thomas Ahle

また参照してください: Python regex(新しいバージョン、2014年10月 )(ドキュメント内で「fuzzy」を検索)。

Python guy(どちらでもない)でない場合、あなたは コンパイルできました コードをC(exe/dll)に変換します。古き良きvb6(など)からのDLL.

から選択する他のライブラリ:

  • TRE/agrep( 'classic、good、old and fast)(search for' agrep performace ')、but you need to write POSIX compatible regex(search 「正規表現情報posix」の場合)もちろん、TREを使用するすべてのライブラリ/例にはこの制限があります(「ハッカーボスのpythonでの正規表現一致」を検索してください)。大量のデータの場合:「Agrepアルゴリズムの高速CUDA実装」を検索します。
  • [〜#〜] frej [〜#〜](Java)-いくつかの(より多くの)制限(たとえば、先読みなし/後ろ向き)
  • fuzzy-wuzzy(Pythonベース)-見る価値があり、テストされていません...

以下も検索:

  • 'Comparison_of_regular_expression_engines'
  • 「regular-expressions.infoツール」

(実際のリンクを投稿できないことをお詫びします)

6

regex module : 'reを置き換えるための代替正規表現モジュールを使用します。'これはreの親しみやすさを提供しますが、ファジーマッチングのオプション、およびreのその他のいくつかの改善が含まれています。

Windowsバイナリについては、 このリソース を参照してください。

4
David C

ここ は、あなたが尋ねている質問に関するリソースです。それは会社にとってはちょっとしたお誘いです。より有用なのは この論文 でしょう。大規模なデータセットに対して、特殊な言語(アラビア語と英語など)に偏った、あいまい検索を実行できるこの論文に触発された実装を見てきました。

一般的に、あなたが尋ねたことをすることはできません。文字を等価クラスで置き換えることにより、正規表現検索をあいまいにしたり、レーベンシュタイン距離によって定義されたほぼ一致するものをデータベースで検索したりできます。正規表現の背後にある(n)DFAを拡張して、距離によるほぼ一致を含めると、急速に非常に複雑になります。

3
bmargulies

lexer の使用を検討しましたか?

実際に使ったことはないので、あまり役に立たないのですが、うまくいくようです。

1
Paul Creasey

Java近似正規表現マッチングのためのprexと呼ばれるツールを実装し始めました。ツールは、文字列sが正規表現のマッチングからどれだけ離れているかを決定しますriesでの挿入、削除、置換の数結果の文字列s 'rによって受け入れられるように、最低限必要な(最小コスト)です。興味がある場合は、 https://github.com/julianthome/prex からコードを出力します。フィードバックが得られたらとても嬉しいです。このアプローチはまだ少し遅いですが、現在いくつかを組み込んでいますそのパフォーマンスを改善するためのヒューリスティック。

0
Julian