コンピュータがユーザーが提供した例によって正規表現を「学習」することは可能ですか?


94

コンピュータがユーザー提供の例によって正規表現を「学習」することは可能ですか?

明確にするために:

  • 正規表現を学びたくありません。
  • テキストからパーツを選択するか、開始マーカーまたは終了マーカーを選択することにより、ユーザーがインタラクティブに提供する例から正規表現を「学習」するプログラムを作成したいと考えています。

出来ますか?Googleで使用できるアルゴリズム、キーワードなどはありますか?

編集:回答ありがとうございますが、この機能を提供するツールには興味がありません。論文、チュートリアル、ソースコード、アルゴリズム名などの理論的な情報を探しているので、自分で何かを作成できます。


4
私は誰も言及していない驚いている正規表現を:: PreSuf
tripleee

回答:


44

「計算学習理論入門」には、有限オートマトンを学習するためのアルゴリズムが含まれています。すべての正規言語は有限オートマトンに相当するため、プログラムによっていくつかの正規表現を学習することが可能です。カーンズとヴァリアントは、有限オートマトンを学ぶことができないいくつかのケースを示しています。関連する問題は、隠れマルコフモデルの学習です。これは、文字シーケンスを記述できる確率的オートマトンです。プログラミング言語で使用される最新の「正規表現」は、実際には通常の言語よりも強力であるため、学習が難しい場合があります。


43

はい、可能です。例から正規表現を生成できます(テキスト->必要な抽出)。これは、作業を行うオンラインツールです。http//regex.inginf.units.it/

Regex Generator ++オンラインツールは、GP検索アルゴリズムを使用して、提供された例から正規表現を生成します。GPアルゴリズムは、より高いパフォーマンスとよりシンプルなソリューション構造(OccamのRazor)につながる多目的フィットネスによって駆動されます。このツールは、トリエステ大学Machine Lerning Lab(トリエステ大学)によるデモアプリケーションです。こちらのビデオチュートリアルをご覧ください。

これは研究プロジェクトなので、使用されているアルゴリズムについてここで読むことができます

見よ!:-)

例から意味のある正規表現/解決策を見つけることは、提供された例が問題をよく説明している場合にのみ可能です。抽出タスクを説明するこれらの例を検討してください。特定のアイテムコードを探しています。例はテキスト/抽出ペアです:

"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"

一致とは何か、望ましい一致ではないものをより適切に説明するために、他の例を提供する必要があります。--ie:

"My phone is +39-128-3905 , and the phone product id is 966-347Z" -> "966-347Z"

電話番号は製品IDではありません。これは重要な証明になる場合があります。


4
これが一番の答えになるはずです。それは可能であり、これはそれを実証しています。ソースはこちらから入手できます:github.com/MaLeLabTs/RegexGenerator
rjurney

製品コードの例は、限られたサンプルの製品コードのセットから正規表現を推測しようとするのではなく、その人間が製品コードの仕様を調べて、仕様に基づいて正規表現を書く必要がある理由を示しています(人かプログラムが正規表現を推測しようとしている)。
Jan Goyvaerts、2016

2
これは物事を行う正しい方法です。私の例は、概念的に問題を説明する方法にすぎません。仕様がない場合や、自分で正規表現(知識不足)を記述できない場合があります。
Fabiano Tarlao

2
記事「例からテキスト抽出のための正規表現の推論は、」アルゴリズムの詳細な説明が含まれmachinelearning.inginf.units.it/publications/...
mimmuz

3
これは優れたプロジェクトであり、遺伝的プログラミングの力の素晴らしいデモンストレーションです。
rcgeorge23 ​​2017年

36

コンピュータプログラムは、これだけに基づいて意味のある正規表現を生成することはできません。有効な一致のリストに。その理由をお見せしましょう。

コンピュータが次のように生成した場合、111111および999999の例を提供するとします。

  1. これら2つの例と完全に一致する正規表現: (111111|999999)
  2. 6つの同一の数字に一致する正規表現 (\d)\1{5}
  3. 6の1と9に一致する正規表現 [19]{6}
  4. 任意の6桁に一致する正規表現 \d{6}
  5. 上記の3つのいずれか、単語の境界を含む、例 \b\d{6}\b
  6. 数字の前または後にない最初の3つのいずれか、例えば (?<!\d)\d{6}(?!\d)

ご覧のとおり、例を正規表現に一般化する方法はたくさんあります。コンピューターが予測可能な正規表現を作成する唯一の方法は、可能なすべての一致をリストするように要求することです。次に、それらの一致と完全に一致する検索パターンを生成できます。

可能なすべての一致をリストしたくない場合は、より高レベルの説明が必要です。それがまさに、正規表現が提供するように設計されているものです。6桁の数字の長いリストを提供する代わりに、「任意の6桁」に一致するようにプログラムに指示するだけです。正規表現構文では、これは\ d {6}になります。

正規表現と同じくらい柔軟な高レベルの記述を提供する方法も、正規表現と同じくらい複雑になります。RegexBuddyのようなすべてのツールは、高レベルの説明を簡単に作成およびテストできるようにするためのものです。簡潔な正規表現構文を直接使用する代わりに、RegexBuddyを使用すると、プレーンな英語のビルディングブロックを使用できます。しかし、例を一般化する必要がある場合とそうでない場合を魔法のように知ることができないため、高レベルの説明を作成できません。

正規表現を生成するためにユーザーが提供するガイドラインとともにサンプルテキストを使用するツールを作成することは確かに可能です。このようなツールを設計する上で難しいのは、正規表現自体よりもツールを学習しにくくすることなく、また、ツールを一般的な正規表現ジョブや単純な正規表現に制限することなく、必要なガイド情報をユーザーに求める方法です。


正解です。質問を投稿した後に見つけた多くの学習アルゴリズムには、肯定的な情報と否定的な情報が必要です。私が理解している限り、ユーザーが質問に答えて提供しているため、明示的な「上位レベルの説明」は必要ありません。
Daniel Rikowski、2009年

ツールが質問をする場合、与えられた質問と回答の組み合わせが上位レベルの説明を形成します。そのようなツールの品質は、主にそれが尋ねる質問に依存します。
Jan Goyvaerts、2009年

別の例を提供すると、それらの可能性のいくつかを取り除くことができるので、それは愚かです。さらなる例はさらに取り除かれます。
Cris

2
@Cris:提供するサンプルの数に関係なく、原則は変わりません。それは単に可能性を変えるだけです。たとえば、123456を追加すると、#2が(\ d)\ 1 {5} | 123456に、#3が[19] {6} | 123456に変更されます。または、#3を[1-69] {6}に変更できます。必要なパターンが6桁の同一の数字または各桁が前の桁よりも1桁大きい6桁に一致する場合もあります。6桁の数字のサンプルを10,000個提供したとしても、プログラムはユーザーからの追加の指示がないと、#1、#4、#5、または#6を区別できません。
Jan Goyvaerts、2014年

この問題は次のように簡単に解決できるように感じます。プログラムは(合理的な範囲内で)できるだけ一般的になるように試み、一致すると思われる他の例を示します。提案された一致に対して「はい」と「いいえ」を伝えるだけで、実際にキャプチャしようとしているものの境界を理解するのに役立ちます。この概念を使用し、現在開いているファイルから一致を提案するツールをテキストエディタで表示したいです。
Jon McClung、

9

はい、それは確かに「可能」です。擬似コードは次のとおりです。

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;
}

問題は、例のリストと一致する正規表現が無限に存在することです。このコードは、セット内で最も単純/愚かな正規表現を提供し、基本的には正の例のリストのすべてと一致します(負の例も含めて、他のものは何も一致しません)。

実際の課題は、すべての例に一致する最短の正規表現を見つけることだと思いますが、それでも、結果の式が「正しいもの」であることを確認するには、ユーザーは非常に優れた入力を提供する必要があります。


3
ユーザーがポジティブサンプルとネガティブサンプルを入力すると、面白くなります。正規表現は、正のサンプルと一致する必要があり、負のサンプルと一致しない必要があります。
user55400 2009年

1
@Thomas:Mineはすべての例に一致し、他には何も一致しません!
Daniel LeCheminant 2009年

@blixtor-実際、それは非常に簡単です。作成された正規表現に否定的な例を入れないでください。拒否されます。コードが作成するものは、正の例にのみ一致することを覚えておいてください。否定的な例(およびその他すべて)は定義から除外されます!
Daniel LeCheminant 2009年

ダニエルは正しいです。より高いレベルの説明がない場合、選択肢のリストは、例のリストから一貫して正確に推測できるすべてです。
Jan Goyvaerts、2009年

6

その言葉は「誘導」だと思います。通常の文法を導入したい。

有限な例のセット(ポジティブまたはネガティブ)でそれが可能であるとは思わない。しかし、私が正しく思い出せば、相談できるOracleがあればそれは可能です。(基本的には、プログラムが満足するまで、プログラムにユーザーにyes / noの質問をさせる必要があります。)


はい、それは私がやりたいことです、インタラクティブにユーザーに尋ねます。
Daniel Rikowski、2009年

ユヴァルFの言及は私が考えていたもののようです。私はそれらを検討することをお勧めします。
Jay Kominek 2009年

5

あなたはこのサイトで少し遊んでみたいかもしれません、それはかなりクールで、あなたが話しているものに似た何かをするように聞こえます:http : //txt2re.com


4

プロローグに基づいて、このような問題に特化した言語があります。それはプロゴールと呼ばれています

他の人が述べたように、基本的な考え方は帰納的学習であり、しばしばILP(帰納的論理プログラミング)と呼ばれます、AIサークルで)ます。

2番目のリンクはILPに関するWikiの記事です。このトピックについて詳しく知りたい場合に役立つ情報源がたくさん含まれています。


2

@Yuvalは正しいです。あなたは計算学習理論、つまり「帰納的推論」を見ています。

「学ぶ」の定義は自明ではないので、質問はあなたが考えるよりも複雑です。一般的な定義の1つは、学習者はいつでも好きなときに答えを吐き出すことができるということですが、最終的には、答えを吐き出すのをやめるか、常に同じ答えを吐き出す必要があります。これは、無限の数の入力を想定しており、プログラムがその決定にいつ到達するかについての絶対的な保証はありません。また、後で何か別のものが出力される可能性があるため、いつHAが決定に達したかはわかりません。

この定義により、私は通常の言語が学習可能であると確信しています。他の定義では、それほどではありません...


2

私はGoogleとCiteSeerでいくつかの調査を行ったところ、これらの技術/論文を見つけました。

また、Dana Angluinの「クエリと反例から通常のセットを学習する」は有望であるように見えますが、PSとPDFのバージョンを見つけることができず、引用とセミナーのペーパーしか見つかりませんでした。

これは理論的なレベルでも難しい問題のようです。


0

人が正規表現を学ぶことが可能であれば、プログラムは基本的に可能です。ただし、そのプログラムを学習するには、正しくプログラムする必要があります。幸いなことに、これはかなり有限の論理空間なので、オブジェクトやそのようなものを見ることができるようにプログラムを教えるほど複雑ではありません。


1
真実ではありません。チューリングマシンで決定できない問題を調べる必要があります。
スティーブンキュリアル

公平を期すために、私は人が正規表現を学ぶことができれば、機械は学ぶことができると言いました。私はそれを一般的に意味していませんでした。
cjk 2009年

@scurial人々が解決できると証明されているが、チューリングマシンでは決定できない問題があるとは思いませんが、ありますか?
Sunny88
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.