그것은 가능한 컴퓨터를 위한"학습"정규 표현식을 사용자에 의해 제공에 대한 참조를 제공합니다.

StackOverflow https://stackoverflow.com/questions/616292

문제

그것은 가능한 컴퓨터를 위한"학습"정규 표현식을 사용자에 의해 제공에 대한 참조를 제공합니다.

을 명확히:

  • 를 배우고 싶어 정규표현식이 있습니다.
  • 내가 원하는 프로그램을 만드는"학"정규 표현식을 예로부터는 대화식으로 제공하는 사용자에 의해,아마 선택하여 부속서 텍스트를 선택하거나 시작하거나 종료 마커입니다.

이것이 가능합니까?이 있습 알고리즘,키워드 등입니다.는 구글 수 있습니까?

편집:감사에 대한 답변을,하지만 난에 관심이 있는 도구 을 제공 이 기능이 있습니다.내가 찾는 이론적인 정보는 논문,자습서,소스 코드,이름의 알고리즘,그래서 나는 뭔가를 만들 수 있습니다 나 자신을 위해.

도움이 되었습니까?

해결책

그 책 계산 학습 이론 소개 유한 자동 학습을위한 알고리즘이 포함되어 있습니다. 모든 일반 언어는 유한 한 오토마톤과 동일하기 때문에 프로그램별로 정규 표현식을 배울 수 있습니다. Kearns와 Valiant 유한 한 오토 마톤을 배울 수없는 경우를 보여주십시오. 관련 문제는입니다 숨겨진 마르코프 모델 학습, 이는 캐릭터 시퀀스를 설명 할 수있는 확률됨에 따른 오토마타입니다. 프로그래밍 언어에 사용되는 대부분의 현대적인 "정규 표현"은 실제로 일반 언어보다 강력하므로 때로는 배우기가 더 어렵다는 점에 유의하십시오.

다른 팁

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

Regex Generator ++ 온라인 도구는 GP 검색 알고리즘을 사용하여 제공된 예제로부터 Regex를 생성합니다. GP 알고리즘은 다목적 체력으로 구동되어 성능이 높고 더 간단한 솔루션 구조 (Occam 's Razor)로 이어집니다. 이 도구는 Machine Lerning Lab, Trieste Univeristy (Università degli Studi di Trieste)의 탈수 적 애플리케이션입니다. 비디오 튜토리얼을보십시오 여기.

이것은 연구 프로젝트이므로 중고 알고리즘에 대해 읽을 수 있습니다. 여기.

보다! :-)

예에서 의미있는 Regex/솔루션을 찾는 것이 가능합니다. 경우에만 제공된 예제는 문제를 잘 설명합니다. 추출 작업을 설명하는 이러한 예를 고려하여 특정 항목 코드를 찾고 있습니다. 예제는 텍스트/추출 쌍입니다.

"The product code il 467-345A" -> "467-345A"
"The item 789-345B is broken"  -> "789-345B"

(인간) 남자는 예제를 보면 다음과 같이 말할 수 있습니다. "항목 코드는 d ++ -345 [ab]와 같은 것입니다."

항목 코드가 더 허용되지만 다른 예제를 제공하지 않은 경우 문제를 잘 이해할 수있는 증거가 없습니다. 인간 생성 솔루션을 다음 텍스트에 적용 할 때 다음 텍스트에 실패합니다.

"On the back of the item there is a code: 966-347Z"

일치가 무엇인지 더 잘 설명하기 위해 다른 예제를 제공해야합니다.

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

전화 번호는 제품 ID가 아니므로 중요한 증거 일 수 있습니다.

컴퓨터 프로그램을 것입을 생성할 수 있는 의미있는 정규 표현식 기반 의 목록에 유효한 일치합니다.을 보여 드리겠습니다.

가정을 제공할 예 111111 및 999999,한 컴퓨터 생성:

  1. Regex 일치하는 정확하게 이런 두 가지 예: (111111|999999)
  2. Regex 일치하는 6 자리 숫자와 동일 (\d)\1{5}
  3. Regex6 일치하는 사람과 화려 [19]{6}
  4. Regex 일치하는 어떤 숫자 6 \d{6}
  5. 위의 세 가지로,단계,예를 들어, \b\d{6}\b
  6. 처음 세 가지지 않는,앞이나 뒤에는 숫자가,예를 들어,(?<!\d)\d{6}(?!\d)

당신이 볼 수있는,다음과 같은 여러 가지 방법으로는 예으로 일반화될 수 있다는 정기적인 표현입니다.을 위한 유일한 방법은 컴퓨터를 구축하는 예측 가능한 정규 표현식을 요구할 목록 모든 가능한 일치합니다.그런 다음 그것을 생성할 수 있는 검색 패턴 일치하는 정확하게 일치합니다.

원하지 않는 경우에는 목록 모든 가능한 경기,야 할 높은 수준의 설명이 있습니다.는 정확하게 정규표현식을 제공하도록 설계되었습니다.제공하는 대신의 긴 목록 6 자리의 숫자,당신은 단순히 말하는 프로그램을 맞"모든 여섯 숫자".에서 정규식,이것은\d{6}.

어떤 방법을 제공하는 높은 수준의 설명으로 가동 가능한 정규 표현식으로 또한 것으로 복잡한 정규표현식이 있습니다.모든 도구 RegexBuddy 을 할 수 있는 것을 더 쉽게 만들고 테스트하는 높은 수준의 설명이 있습니다.대신 사용하여 간결한 정규 표현식의 구문,직접 RegexBuddy 사용할 수 있도록 일반 영어 빌딩 블록입니다.하지만 그것을 만들 수 없습니다 높은 수준의 설명을 위해 당신 수 있으므로,마법 알고 있어야 하는 경우 일반화 예고할 때 해야하지 않습니다.

그것은 확실히 가능성 도구를 사용하는 샘플에 텍스트와 함께 지침을 제공하는 사용자에 의해 생성 합니다.어려운 부분에서는 디자인 이러한 도구는 어떻게 요청에 대한 사용자 안내하는 데 필요한 정보를 만들지 않고,이 도구는 더 열심히 배우고 보다 정규 표현식 자신을 제한하지 않고 도구를 일반적인 regex 작업 또는 단순한 정규표현식이 있습니다.

예, 확실히 "가능"합니다. 의사 코드는 다음과 같습니다.

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

문제는 예의 목록과 일치하는 무한한 수의 Regex가 있다는 것입니다. 이 코드는 세트에서 가장 간단한/바보 같은 정규식을 제공하며 기본적으로 긍정적 인 예 목록에서 어떤 것과 일치합니다 (그리고 부정적인 예제를 포함하여 다른 것은 없습니다).

나는 진정한 도전은 모든 예제와 일치하는 가장 짧은 재 겔을 찾는 것이지만, 그때까지도 사용자는 결과적인 표현이 "올바른 것"인지 확인하기 위해 매우 좋은 입력을 제공해야 할 것입니다.

나는이 용어가 "유도"라고 생각합니다. 일반 문법을 유도하고 싶습니다.

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

이 사이트를 조금 사용하고 싶을 수도 있습니다. 아주 멋지고 말하는 것과 비슷한 일을하는 것처럼 들립니다. http://txt2re.com

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

다른 사람들이 언급했듯이 기본 아이디어는 종종 ILP라고 불리는 귀납적 학습입니다.유도 논리 프로그래밍) ai 서클에서.

Sec

@yuval이 맞습니다. 계산 학습 이론 또는 "유도적인 추론"을보고 있습니다.

"학습"의 정의는 사소한 일이 아니기 때문에 질문은 생각보다 더 복잡합니다. 한 가지 일반적인 정의는 학습자가 원할 때마다 답을 뱉을 수 있지만 결국에는 답을 뱉어 내거나 항상 같은 대답을 뱉어야한다는 것입니다. 이것은 무한한 수의 입력을 가정하고 프로그램이 결정에 도달 할 때에 대해 절대적으로 Garauntee를 제공하지 않습니다. 또한, 당신은 그것이 나중에 다른 것을 출력 할 수 있기 때문에 결정에 도달했는지 알 수 없습니다.

이 정의에 따르면, 나는 일반 언어를 배울 수 있다고 확신합니다. 다른 정의에 의해,별로 ...

Google에 대한 연구를 수행했습니다 Citeseer 이러한 기술/논문을 발견했습니다.

또한 Dana Angluin의 "Queries and Counter Empeamples에서 일반 세트를 배우는 것"은 유망한 것처럼 보이지만 PS 또는 PDF 버전을 찾을 수 없었으며 CITES 및 SEMINAR 용지 만 찾을 수 없었습니다.

이것은 이론적 수준에서도 까다로운 문제인 것 같습니다.

사람이 정규 표현을 배울 수 있다면 프로그램에 근본적으로 가능합니다. 그러나이 프로그램은 배울 수 있도록 올바르게 프로그래밍해야합니다. 운 좋게도 이것은 상당히 유한 한 논리 공간이므로, 대상이나 그런 것을 볼 수 있도록 프로그램을 가르치는 것만 큼 복잡하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top