입력 단어의 DFA 및 런타임 구성 Levenshtein Automata를 사용하여 퍼지 파싱 (일부 편집 거리에 오타가있는 문자열도 허용)을 수행하는 방법이 있습니다. Earley 파서로 비슷한 것을 할 수 있습니까? 이 질문에 대답하는 것은 물론 알고리즘을 이해하기가 어렵습니다.
입력 단어의 DFA 및 런타임 구성 Levenshtein Automata를 사용하여 퍼지 파싱 (일부 편집 거리에 오타가있는 문자열도 허용)을 수행하는 방법이 있습니다. Earley 파서로 비슷한 것을 할 수 있습니까? 이 질문에 대답하는 것은 물론 알고리즘을 이해하기가 어렵습니다.
답변:
대답은 '예'입니다. 그러나 동일한 기능을 가진 더 간단한 것이 있기 때문에 Earley 파서로는 그렇게하지 않을 것입니다.
기본적으로 Earley 파서는 문법이 모호 할 때 주어진 문자열에 대해 가능한 모든 구문 분석을 생성하는 컨텍스트가없는 일반 구문 분석기 제품군에 속합니다.
이 파서를 이해하는 데는 적어도 두 가지 방법이 있습니다.
입력 스트링상의 문법에 대응하는 푸시 다운 오토 마톤의 동적 프로그래밍 해석으로서;
유한 상태 오토 마톤과 문법의 교차점을 구성하는 것입니다.
단일 스트링을 구문 분석 할 때, 고려 될 유한 상태 오토 마톤은 구문 분석 될 스트링 만을 인식하는 선형 오토 마톤입니다 (상태의 수는 ). FA 와 CF garmmar (Bar Hillel, Perlis, Shamir 1961) 의 교차 산물 구성을 적용하면 를 생성 하는 새로운 문법 인 새로운 CF 문법을 얻게 됩니다 . 일반적으로 간과했던 흥미로운 점은 가 에 의해 사용되는 구문 분석 트리 를 비 터미널 이름 변경 (교차 곱으로 인해)까지 보존 한다는 것 입니다.| 승 | + 1 A G F L ( A ) ∩ L ( G ) F G
따라서 FA 입력 문자열 만 생성하는 경우 문법 는 해당 문자열 만 생성합니다 ( 이면 빈 언어 생성 ). 또한 가 생성하는 데 사용할 수 있는 모든 구문 분석 트리를 사용하여 생성합니다.F L ( G ) ∅ G
이 문법 는 일반적으로 공유 구문 분석 포리스트 라고하며 , 모든 일반 CF 구문 분석 알고리즘은 CYK, Earley, 일반화 된 LR 또는 LL 등의 제품 간 다소 최적화 된 버전의 교차 제품 구성입니다. 그래서 내가 말하는 것은 그들에게도 적용됩니다.
그러나 보시다시피, 누군가 그것에 관심이 있다면 전체 정규 세트를 파싱하는 것으로 일반화됩니다.
그것은 정확히 당신의 질문입니다. 문자열 있습니다. 당신은 당신의 경우에 어떤 주어진 내의 모든 문자열을 생성하는 변환기입니다 유한 상태 변환기에 의해 정의 된 몇 가지 변화에 그것을 구문 분석 할 Levenshtein 편집 거리 의 (그러나 변환기의 기원은 중요하지 않다가). 이러한 문자열 세트는 FA로 정의 할 수있는 정규 세트이며 각 문자열의 편집 거리를 계산할 수있는 가중치 전환이 있습니다.w
문법 와의 교차 곱을 수행하면 교차 에있는 모든 문자열을 생성 하는 공유 구문 분석 포리스트 문법 나타납니다. 또한 허용되는 각 문자열의 편집 거리를 계산할 수 있도록 일부 규칙에 가중치를 적용합니다.F
원하는 경우, 최소한의 거리로 현만 유지하는 데 사용할 수 있습니다.
그러나, 유한 상태 머신을 갖는 구성이 연관되기 때문에 이것은 약간 개선 될 수있다.
문제의 경우와 같이 항상 동일한 유한 상태 변환기를 사용하는 경우 올바른 방법 은 입력 문자열과 상관 없이 문법 와 변환기 (여기서는 Levenshtein 오토 마톤) 를 작성하는 것 입니다. 이는 입력 문자열 를 구문 분석하는 데 사용할 수있는 가중치 문법을 제공합니다 . 문제는 잔인한 교차로 구성으로 구문 분석하면 Levenshtein 거리 (예 : 에서 문자열을 제공한다는 것 입니다.w Σ ∗
이전과 동일한 결과를 얻기 위해 해당 구성을 정리하는 것이 쉽지만, 가장 좋은 방법은 Earley를 포함하여 문헌의 대부분의 파서에서 사용하는 동적 프로그래밍 조직과 같이보다 통제 된 교차로 구성이며 생성을 피하기 위해 사용하는 것입니다 거리를 계산하고 원하는 임계 값을 초과하면 계산 경로를 중단하여 쓸모없는 규칙. 동적 프로그래밍을 사용하여 입력까지의 거리가 가장 짧은 문자열의 구문 분석 포리스트 (또는 구문 분석 트리)를 직접 계산할 수도 있습니다.