コンピュータがユーザー提供の例によって正規表現を「学習」することは可能ですか?
明確にするために:
出来ますか? Googleで使用できるアルゴリズム、キーワードなどはありますか?
[〜#〜] edit [〜#〜]:回答ありがとうございます。ただし、この機能を提供するツールには興味がありません。論文、チュートリアル、ソースコード、アルゴリズム名などの理論的な情報を探しているので、自分で何かを作成できます。
本 計算学習理論入門 には、有限オートマトンを学習するためのアルゴリズムが含まれています。すべての正規言語は有限オートマトンに相当するため、プログラムによっていくつかの正規表現を学習することが可能です。 カーンズとヴァリアント は、有限オートマトンを学習することができないいくつかのケースを示しています。関連する問題は、 隠れマルコフモデルの学習 です。これは、文字シーケンスを記述できる確率的オートマトンです。プログラミング言語で使用される最新の「正規表現」は、実際には通常の言語よりも強力であるため、学習が難しい場合があることに注意してください。
はい、可能です。例から正規表現を生成できます(テキスト->必要な抽出)。これは作業を行うオンラインツールです。 http://regex.inginf.units.it/
Regex Generator ++オンラインツールは、GP検索アルゴリズムを使用して、提供された例から正規表現を生成します。 GPアルゴリズムは、より高いパフォーマンスとよりシンプルなソリューション構造(OccamのRazor)につながる多目的フィットネスによって駆動されます。このツールは、トリエステ大学Machine Lerning Lab(トリエステ大学)によるデモアプリケーションです。ビデオチュートリアルをご覧ください here 。
これは研究プロジェクトなので、使用されているアルゴリズムについて読むことができます ここ 。
見よ!:-)
例から意味のある正規表現/解決策を見つけることは可能です場合に限り提供された例は問題をよく説明しています。抽出タスクを説明するこれらの例を検討してください。特定のアイテムコードを探しています。例はテキスト/抽出ペアです:
"The product code is 467-345A" -> "467-345A"
"The item 789-345B is broken" -> "789-345B"
例を見ると、(人間の)男は「商品コードは\ d ++-345 [AB]のようなものです」と言うかもしれません。
アイテムコードの方が許容範囲が広いが、他の例を提供していない場合は、問題をよく理解するための証拠がありません。人間が生成したソリューション\ d ++-345 [AB]を次のテキストに適用すると、失敗します。
"On the back of the item there is a code: 966-347Z"
一致とは何か、望ましい一致ではないものをより適切に説明するために、他の例を提供する必要があります。--i.e:
"My phone is +39-128-3905 , and the phone product id is 966-347Z" -> "966-347Z"
電話番号は製品IDではありません。これは重要な証明になる場合があります。
有効な一致のリストに基づいて単独で意味のある正規表現を生成できるコンピュータープログラムはありません。その理由をお見せしましょう。
コンピュータが次のように生成した場合、111111と999999の例を提供するとします。
(111111|999999)
(\d)\1{5}
[19]{6}
\d{6}
\b\d{6}\b
(?<!\d)\d{6}(?!\d)
ご覧のように、例を正規表現に一般化する方法はたくさんあります。コンピューターが予測可能な正規表現を作成する唯一の方法は、all可能な一致をリストすることを要求することです。次に、それらの一致と完全に一致する検索パターンを生成できます。
可能なすべての一致をリストしたくない場合は、より高いレベルの説明が必要です。それがまさに、正規表現が提供するように設計されているものです。 6桁の数字の長いリストを提供する代わりに、「任意の6桁」に一致するようにプログラムに指示するだけです。正規表現構文では、これは\ d {6}になります。
正規表現と同じくらい柔軟な高レベルの記述を提供する方法は、正規表現と同じくらい複雑になります。 RegexBuddy のようなすべてのツールは、高レベルの説明の作成とテストを簡単にするためのものです。簡潔な正規表現構文を直接使用する代わりに、RegexBuddyを使用すると、プレーンな英語のビルディングブロックを使用できます。しかし、例を一般化する必要がある場合とそうでない場合を魔法のように知ることができないため、高レベルの説明を作成できません。
正規表現を生成するためにユーザーが提供するガイドラインとともにサンプルテキストを使用するツールを作成することは確かに可能です。このようなツールを設計する際の難しい部分は、正規表現自体よりもツールを学習しにくくすることなく、また、ツールを一般的な正規表現ジョブや単純な正規表現に制限することなく、必要なガイド情報をユーザーに求める方法です。
はい、それは確かに「可能」です。擬似コードは次のとおりです。
string MakeRegexFromExamples(<listOfPosExamples>, <listOfNegExamples>)
{
if HasIntersection(<listOfPosExamples>, <listOfNegExamples>)
return <IntersectionError>
string regex = "";
foreach(string example in <listOfPosExamples>)
{
if(regex != "")
{
regex += "|";
}
regex += DoRegexEscaping(example);
}
regex = "^(" + regex + ")$";
// Ignore <listOfNegExamples>; they're excluded by definition
return regex;
}
問題は、例のリストに一致する正規表現が無限に存在することです。このコードは、セット内で最も単純/愚かな正規表現を提供し、基本的には正の例のリストのすべてと一致します(負の例も含めて、他のものは何も一致しません)。
実際の課題は、すべての例に一致する最短の正規表現を見つけることだと思いますが、それでも、結果の式が「正しいもの」であることを確認するには、ユーザーは非常に優れた入力を提供する必要があります。
その言葉は「誘導」だと思います。通常の文法を導入したい。
有限な例のセット(ポジティブまたはネガティブ)でそれが可能であるとは思わない。しかし、私が正しく思い出せば、相談できるOracleがあればそれは可能です。 (基本的には、プログラムが満足するまで、プログラムにユーザーにyes/noの質問をさせる必要があります。)
あなたはこのサイトを少し遊んでみたいかもしれません、それはかなりクールで、あなたが話していることと似たようなことをするように聞こえます: http://txt2re.com
プロローグに基づいて、このような問題に特化した言語があります。 progol と呼ばれます。
他の人が述べたように、基本的な考え方は帰納学習であり、AIサークルではILP( 帰納論理プログラミング )と呼ばれることがよくあります。
2番目のリンクはILPに関するWikiの記事です。このトピックについて詳しく知りたい場合に役立つ情報源がたくさん含まれています。
@Yuvalは正しいです。あなたは計算学習理論、つまり「帰納的推論」を見ています。
「学ぶ」の定義は自明ではないので、質問はあなたが考えるよりも複雑です。一般的な定義の1つは、学習者はいつでも答えを吐き出すことができるということですが、最終的には、答えを吐き出すのをやめるか、常に同じ答えを吐き出す必要があります。これは無限の入力を想定しており、プログラムがいつその決定に到達するかについての保証は一切ありません。また、後で何か別のものを出力する可能性があるため、いつHAが決定に達したかはわかりません。
この定義により、私は通常の言語が学習可能であると確信しています。他の定義では、それほどではありません...
私はGoogleと CiteSeer でいくつかの調査を行い、これらの技術/論文を見つけました:
また、Dana Angluinの「クエリと反例からの定期的なセットの学習」は有望であるように見えますが、PSまたはPDFバージョン、引用とセミナーの論文のみを見つけることができませんでした。
これは理論的なレベルでも難しい問題のようです。
人が正規表現を学ぶことが可能であれば、プログラムは基本的に可能です。ただし、そのプログラムを学習するには、正しくプログラムする必要があります。幸いなことに、これはかなり有限の論理空間なので、オブジェクトなどを見ることができるようにプログラムを教えるほど複雑ではありません。