컴퓨터가 사용자가 제공 한 예제를 통해 정규식을 "학습"할 수 있습니까?


95

컴퓨터가 사용자가 제공 한 예제를 통해 정규식을 "학습"할 수 있습니까?

명확히하기 위해 :

  • 정규식을 배우고 싶지 않습니다 .
  • 텍스트에서 부분을 선택하거나 시작 또는 끝 마커를 선택하여 사용자가 대화 형으로 제공하는 예제에서 정규식을 "학습"하는 프로그램을 만들고 싶습니다.

가능할까요? Google에서 사용할 수있는 알고리즘, 키워드 등이 있습니까?

편집 : 답변 해 주셔서 감사하지만 이 기능 을 제공하는 도구에는 관심이 없습니다 . 논문, 튜토리얼, 소스 코드, 알고리즘 이름과 같은 이론적 정보를 찾고 있으므로 스스로 무언가를 만들 수 있습니다.


답변:


44

An Introduction to Computational Learning Theory 에는 유한 오토 마톤을 학습하기위한 알고리즘이 포함되어 있습니다. 모든 정규 언어는 유한 오토 마톤과 동일하므로 프로그램을 통해 일부 정규 표현식을 학습 할 수 있습니다. Kearns와 Valiant 는 유한 오토마타를 배울 수없는 몇 가지 사례를 보여줍니다. 관련 문제는 문자 시퀀스를 설명 할 수있는 확률 적 자동 장치 인 숨겨진 마르코프 모델을 학습 하는 것입니다. 프로그래밍 언어에서 사용되는 대부분의 최신 "정규식"은 실제로 정규 언어보다 강력하므로 때때로 배우기가 더 어렵습니다.


43

예, 가능합니다. 예제 (텍스트-> 원하는 추출)에서 정규식을 생성 할 수 있습니다. 이것은 작업을 수행하는 온라인 도구입니다. http://regex.inginf.units.it/

Regex Generator ++ 온라인 도구는 GP 검색 알고리즘을 사용하여 제공된 예제에서 정규식을 생성합니다. GP 알고리즘은 더 높은 성능과 더 단순한 솔루션 구조 (Occam 's Razor)로 이어지는 다목적 피트니스에 의해 구동됩니다. 이 도구는 Trieste Univeristy (Università degli studi di Trieste)의 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

2
이것이 일을하는 올바른 방법입니다. 내 예는 개념적으로 문제를 설명하는 방법 일뿐입니다. 때로는 사양이 없거나, 그 사람이 스스로 정규 표현식 (지식 부족)을 작성할 수없는 경우도 있습니다.
Fabiano Tarlao

더 정확하고 모호하지 않게 :-), "이것은 일을하는 올바른 방법입니다"-> "당신이 옳습니다. 당신이 일을하는 가장 좋은 방법입니다. 가능하면 항상 사양에서 시작해야합니다."
Fabiano Tarlao

2
"예로부터 텍스트 추출을위한 정규 표현식의 추론"이 기사는 알고리즘에 대한 자세한 설명이 포함되어 machinelearning.inginf.units.it/publications/...을
mimmuz

36

컴퓨터 프로그램은 전적으로 다음과 같은 의미있는 정규 표현식을 생성 할 수 없습니다. 유효한 일치 목록 . 그 이유를 보여 드리겠습니다.

컴퓨터가 다음을 생성하면 111111 및 999999 예제를 제공한다고 가정합니다.

  1. 이 두 가지 예와 정확히 일치하는 정규식 : (111111|999999)
  2. 6 개의 동일한 숫자와 일치하는 정규식 (\d)\1{5}
  3. 6 개의 1과 9가 일치하는 정규식 [19]{6}
  4. 6 자리 숫자와 일치하는 정규식 \d{6}
  5. 단어 경계가있는 위의 세 가지 중 하나, 예 : \b\d{6}\b
  6. 앞 또는 뒤에 숫자가없는 처음 세 개, 예 : (?<!\d)\d{6}(?!\d)

보시다시피, 예제를 정규식으로 일반화 할 수있는 방법은 많습니다. 컴퓨터가 예측 가능한 정규식을 작성하는 유일한 방법은 가능한 모든 일치 항목을 나열하도록 요구하는 것 입니다. 그런 다음 정확히 일치하는 검색 패턴을 생성 할 수 있습니다.

가능한 모든 일치 항목을 나열하지 않으려면 더 높은 수준의 설명이 필요합니다. 이것이 바로 정규식이 제공하도록 설계된 것입니다. 6 자리 숫자의 긴 목록을 제공하는 대신 "6 자리 숫자"와 일치하도록 프로그램에 지시하면됩니다. 정규식 구문에서 이것은 \ d {6}가됩니다.

정규식만큼 유연한 고급 설명을 제공하는 모든 방법도 정규식만큼 복잡합니다. RegexBuddy 와 같은 모든 도구 는 높은 수준의 설명을 쉽게 만들고 테스트 할 수 있도록하는 것입니다. 간결한 정규식 구문을 직접 사용하는 대신 RegexBuddy를 사용하면 일반 영어 구성 요소를 사용할 수 있습니다. 그러나 언제 예제를 일반화해야하는지, 언제 일반화해야하는지 마술처럼 알 수 없기 때문에 높은 수준의 설명을 만들 수 없습니다.

정규 표현식을 생성하기 위해 사용자가 제공 한 지침과 함께 샘플 텍스트를 사용하는 도구를 만드는 것은 확실히 가능합니다. 이러한 도구를 설계 할 때 어려운 부분은 도구를 정규식 자체보다 배우기 어렵게 만들지 않고 도구를 일반적인 정규식 작업이나 간단한 정규식으로 제한하지 않고 필요한 안내 정보를 사용자에게 요청하는 방법입니다.


내 질문을 게시 한 후 찾은 많은 학습 알고리즘에는 긍정적이고 부정적인 정보가 필요합니다. 내가 이해하는 한, 사용자가 질문에 답하여 제공하기 때문에 명시적인 "상위 수준의 설명"은 필요하지 않습니다.
Daniel Rikowski

도구가 질문을하는 경우 질문과 주어진 답변의 조합이 상위 수준 설명을 형성합니다. 이러한 도구의 품질은 주로 묻는 질문에 따라 다릅니다.
Jan Goyvaerts

다른 예를 제공하면 그러한 가능성 중 일부를 걸러 낼 수 있기 때문에 어리석은 일입니다. 추가 예제는 더 많은 것을 제거합니다.
크리스

2
@Cris : 제공하는 샘플 수에 관계없이 원칙은 유지됩니다. 그것은 단순히 가능성을 바꿉니다. 예를 들어 123456을 추가하면 # 2가 (\ d) \ 1 {5} | 123456으로 변경되고 # 3이 [19] {6} | 123456으로 변경됩니다. 또는 # 3을 [1-69] {6}로 변경할 수 있습니다. 원하는 패턴이 6 개의 동일한 숫자 또는 각 숫자가 이전 숫자보다 하나 큰 6 개의 숫자와 일치 할 수도 있습니다. 6 자리 숫자의 샘플 10,000 개를 제공하더라도 프로그램은 사용자의 추가 지시 없이는 # 1, # 4, # 5 또는 # 6을 구별 할 수 없습니다.
Jan Goyvaerts 2014 년

이 문제는 다음과 같이 쉽게 해결할 수 있다고 생각합니다. 프로그램은 가능한 한 일반적으로 (이성 내에서) 시도한 다음 일치 할 것으로 생각되는 다른 예를 제공합니다. 제안 된 경기에 '예'와 '아니오'라고 간단히 말하면 실제로 캡처하려는 항목의 범위를 이해하는 데 도움이 될 수 있습니다. 이 개념을 사용하고 현재 열려있는 파일에서 제안 된 일치 항목을 사용하는 텍스트 편집기의 도구를보고 싶습니다.
Jon McClung 2019

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

@blixtor-사실, 아주 쉽습니다. 구성된 정규식에 부정적인 예를 넣지 마십시오. 그러면 거부됩니다. 코드가 빌드하는 것은 긍정적 인 예와 만 일치한다는 것을 기억하십시오. 부정적인 예 (및 기타)는 정의에 따라 제외됩니다!
Daniel LeCheminant

다니엘이 맞습니다. 더 높은 수준의 설명이 없으면 대안 목록 만 있으면 예제 목록에서 일관되고 정확하게 추론 할 수 있습니다.
Jan Goyvaerts

6

나는 그 용어가 "유도"라고 믿는다. 정규 문법을 유도하고 싶습니다.

유한 한 예제 (긍정적 또는 부정적)로는 가능하지 않다고 생각합니다. 하지만 제대로 기억하면 상담 할 수있는 오라클이 있으면 할 수 있습니다. (기본적으로 프로그램이 콘텐츠가 될 때까지 사용자에게 예 / 아니오 질문을하도록해야합니다.)


네, 그게 제가하고 싶은 일입니다. 사용자에게 대화 형으로 물어보세요.
Daniel Rikowski

Yuval F의 참고 문헌은 제가 염두에 두었던 것 같습니다.
Jay Kominek

5

이 사이트를 약간 가지고 놀아보고 싶을 수도 있습니다. 매우 멋지고 당신이 말하는 것과 비슷한 일을하는 것처럼 들립니다 : http://txt2re.com


4

프롤로그를 기반으로 이와 같은 문제에 전념하는 언어가 있습니다. 프로 골 이라고 합니다 .

다른 사람들이 언급했듯이 기본 아이디어는 종종 ILP ( 유도 논리 프로그래밍 AI 서클에서 ) 입니다.

두 번째 링크는 ILP에 관한 위키 문서로, 주제에 대해 더 많이 배우고 싶다면 유용한 소스 자료를 많이 포함하고 있습니다.


2

@Yuval이 맞습니다. 당신은 계산 학습 이론 또는 "귀납적 추론"을보고 있습니다.

"학습"의 정의가 사소하지 않기 때문에 질문은 생각보다 더 복잡합니다. 한 가지 공통된 정의는 학습자가 원할 때마다 답을 뱉어 낼 수 있지만 결국에는 답을 뱉어내는 것을 중단하거나 항상 같은 답을 뱉어야한다는 것입니다. 이것은 무한한 수의 입력을 가정하고 프로그램이 언제 결정에 도달 할 것인지에 대한 보증을 제공하지 않습니다. 또한 나중에 다른 내용을 출력 할 수 있으므로 언제 결정에 도달했는지 알 수 없습니다.

이 정의에 따르면 정규 언어를 배울 수 있다고 확신합니다. 다른 정의로는 그리 많지 않습니다.



0

사람이 정규 표현식을 배울 수 있다면 기본적으로 프로그램이 가능합니다. 그러나 학습 할 수 있으려면 해당 프로그램을 올바르게 프로그래밍해야합니다. 운 좋게도 이것은 논리 공간이 상당히 한정되어 있기 때문에 프로그램이 사물을 볼 수 있도록 가르치는 것만 큼 복잡하지 않을 것입니다.


1
사실이 아닙니다. Turing 머신에서 결정할 수없는 문제를 찾아야합니다.
Stephen Curial

공정하게 말하면, 사람이 REGEX를 배울 수 있다면 기계는 할 수 있다고 말했습니다. 나는 그것을 일반적으로 의미하지 않았습니다.
cjk

@scurial 사람들이 해결할 수 있지만 튜링 머신에서는 결정할 수없는 문제가 있다고 생각하지 않습니다.
Sunny88 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.