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


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.