いくつかの文字列を正規表現に一致させるために、最小限の操作数(挿入、削除、置換)を計算する方法はありますか?例えば文字列を正規表現に一致するように変換する編集操作の最小数
、正規表現(ab)+
と一致する文字列baba
に変換する操作の最小数は2である:それはどちらかababab
(+2文字)またはab
(-2文字)に変えることが必要です。
いくつかの文字列を正規表現に一致させるために、最小限の操作数(挿入、削除、置換)を計算する方法はありますか?例えば文字列を正規表現に一致するように変換する編集操作の最小数
、正規表現(ab)+
と一致する文字列baba
に変換する操作の最小数は2である:それはどちらかababab
(+2文字)またはab
(-2文字)に変えることが必要です。
文字列と正規表現の間でLevenshtein distanceを計算できますが、これは2つの生の文字列の類似性を測定するため意味がありません。
おそらく、文字列がパターンと一致するために受ける必要がある操作の数を測定することです。
ここではグラフ理論に基づいた解決法があります。
まず、正規表現で定義された言語を表すオートマトンを構築する必要があります。 Thompson's algorithmがお手伝いします。
このオートマトンを構築したら、式が一致するように最善の努力をして、それがオフになるたびに修正することができます。 修正の数は、文字列から正規表現で記述された言語までの距離になります。
ここでは、正規表現の例を示します:.*a.*
。 対応するオートマトンは次のとおりです。
だがbbb
文字列の距離を確認してみましょう。
b
あるので、我々は再びb
1
にとどまるので、私たちは1
b
に滞在、我々は12
。 a
を追加しましょう。さて、2
に行くことができます。2
です。文字列に文字が残っていないので、よかったです。私たちは、元の文字列に1つの修正をしたので、bbb
から.*a.*
正規表現までの距離は1
です。 実際には、任意の単語とその言語との距離は、または1
のいずれかです。これは、その単語がa
(バイナリ)であるためです。
これは単なるアイデアであり、欠陥があるかもしれませんが、あなたはそれを使って何かできると思います。
ありがとうございます。私はこの仕事を私のためにしようとします。 – Curious
aaaaaaaaと正規表現a {0,100}との間のLevensteinの違いは何ですか? – DhruvPathak
それは0になると思います。 – Curious
@DhruvPathakそれは良い指標ではありません*。しかし、2つの文字列のLevenshtein距離を正規表現と比較すると、一致する可能性があります。 –