Earley 벡터를 인식기로 사용하는 것은 매우 간단합니다. 스트링의 끝에 도달하면 위치 0에서 시작된 완료된 축산 생산을 확인하기 만하면됩니다. 하나 이상이 있으면 스트링이 승인됩니다.
Earley 벡터를 사용하여 구문 분석 트리를 재구성하는 것은 덜 명확합니다. 실제로 알고리즘 절차가 어떻게 작동하는지 알 수 없으며, 내가 찾은 유일한 참조는 모호하거나 슈퍼 테크니컬 한 것입니다. 아무도 그것에 빛을 비출 수 있습니까?
Earley 벡터를 인식기로 사용하는 것은 매우 간단합니다. 스트링의 끝에 도달하면 위치 0에서 시작된 완료된 축산 생산을 확인하기 만하면됩니다. 하나 이상이 있으면 스트링이 승인됩니다.
Earley 벡터를 사용하여 구문 분석 트리를 재구성하는 것은 덜 명확합니다. 실제로 알고리즘 절차가 어떻게 작동하는지 알 수 없으며, 내가 찾은 유일한 참조는 모호하거나 슈퍼 테크니컬 한 것입니다. 아무도 그것에 빛을 비출 수 있습니까?
답변:
Earley의 논문 에서 사용 된 용어와 표기법을 사용하고 있습니다. 읽은 설명이 다를 수 있습니다.
일반적인 CF 구문 분석 알고리즘이 먼저 인식기 형태로 표시되는 경우가 종종 있으며, 실제로 구문 분석 트리 및 구문 분석 포리스트를 구축하는 데 필요한 정보 관리는 일종의 사후에 추가됩니다. 공유 포리스트를 구성하는 데 필요한 정보를 유지하려면 큐빅 공간이 필요하기 때문일 수 있습니다. 어디 구문 분석되는 입력 문자열의 길이이지만 공간 요구 사항은 제곱입니다. 이 정보가 보존되지 않은 경우 인식 할 수 있습니다. 이 공간의 복잡성이 증가하는 이유는 매우 간단합니다. 파싱 포리스트 크기는 입방체가 될 수 있습니다.
최악의 경우 시간 복잡도는 잘 알려진 바와 같이.
Earley의 알고리즘에 대한 가장 좋은 참고 자료는 물론 Earley의 논문 이지만 구문 분석 포리스트를 구축하는 것에 대해서는 명확하지 않습니다. 이것은 실제로 지저분한 일이 될 수있다. 섹션 7 페이지 101의 빠른 이야기보다 훨씬 더 많은 것이 나올 것이다. 사실, Earley는 구문 분석 포리스트 나 포리스트에 대해 이야기하는 것이 아니라 " 가능한 모든 구문 분석 트리를 합리적으로 표현한 것 "에 대해 이야기 합니다 . 그리고 그 이유는 다음과 같습니다. 만약 그가 문법에 따라 숲을 만들려고한다면 그의 공간 (시간) 복잡성은 어디 가장 긴 규칙의 오른쪽 크기입니다. 그렇기 때문에 다른 알고리즘이 문법을 이진 형식으로 사용하는 이유는 아닙니다 (CNF (Chomsky Normal Form) 일 필요는 없음).
실제로 Earley는 2 진 형태를 암시 적으로 사용하는데 , 이는 3 차 시간 복잡성에 필요하기 때문입니다. 이것은 주에서 룰 도트의 주요 역할 중 하나입니다. 그러나이 암시 적 이진 형태는 이진화 된 문법에 따라 파문과 숲을 만들어냅니다. 이것은 아래에 더 자세히 설명되어 있습니다.
포리스트를 얻는 방법을 이해하는 좋은 방법 중 하나 는 CYK 알고리즘 과 같은 간단한 경우를 살펴 보는 것입니다 . 또한 종종 인식기로 설명되며 파서 측면 이 끝에 추가됩니다. Wikipedia에서 설명을 볼 수 있습니다. 포리스트를 구축하는 데 필요한 정보는 "백 포인터"테이블에 저장됩니다. 백 포인터는 기본적으로 일부 규칙에 따라 문자열의 구성 요소를 형성하는 하위 문자열 (관련 기호)에 대한 포인터입니다. 하위 문자열을 구문 분석하는 가능한 모든 방법을 제공합니다. CYK는 일반적으로 CNF 인 이진 형식을 사용하므로 상황이 더 단순 해집니다. CYK 파서는 Earley와 기본적으로 동일한 동적 프로그래밍 구조를 갖지만 훨씬 간단합니다. 따라서 잘 이해하면 큰 도움이 될 수 있습니다.
Earley의 알고리즘으로 돌아가서 수락을 결정하거나 나무와 숲을 구문 분석하기 위해 Earley 벡터가 필요하다고 생각하지 않습니다. Earley가 그의 논문에서 벡터라고 부르는 것은 구현의 세 번째 단락에서 97 페이지에만 나타납니다. 더 나은 복잡성을 얻기 위해 주어진 문자열 위치 k를 다시 가리키는 상태를 빠르게 검색하는 것은 장치 일뿐입니다. 그러나 모든 정보는 상태 목록에 구현 된 상태 세트에 있습니다. 그러나 알고리즘이 상태를 얻을 수있는 방식을 추적하지 않기 때문에이 정보로는 구문 분석 트리 포리스트를 구축하기에 충분하지 않습니다. 실제로, 벡터는 발견 된 상태와 상관없이 이미 발견 된 상태를 효율적으로 버리는 데에도 사용됩니다.
Earley의 기사 7 장에서 그는 "인식기를 파서로 만들기", 즉 구문 분석 트리를 복구하려면 완료가 완료된 방식을 추적해야한다고 설명합니다.
상태를 추가하는 완전한 작업을 수행 할 때마다 (lookahead 무시) 우리는 인스턴스에서 포인터를 구성합니다. 그 상태에서 그 상태로 그로 인해 우리는 작업을 수행했습니다. 이것은 로 파싱되었다 . D가 모호한 경우 각 완전한 작업마다 하나씩 포인터 세트가 있습니다.특정 상태 세트에 추가됩니다. 각 기호 또한 (터미널이 아닌 한) 그것으로부터 포인터를 가질 것입니다. .
이 본문에서 과 구문 분석 된 문자열의 색인으로, 규칙 왼쪽 인식이 시작된 위치를 나타냅니다 (오른쪽 기호가 예측 된대로). 인식하는 문자열 인덱스입니다 시작하고 색인에서 끝났습니다. . 이 "완료 포인터"는 CYK의 구문 분석기 버전에 대해 설명 된 백포 인 (백과 사에서는 그다지 좋지 않음)의 Earley에 해당합니다.
그러한 인용문에서 (인용 서에 설명 된 바와 같이) 우리는 규칙 인스턴스에서 입력 문자열을 구문 분석하는 트리 (또는 포리스트)로 자체 개발 될 수 있습니다. 색인에서 색인 우리가 주목 . 바로 아래 노드 규칙에 의해 주어진다 . 이어지는 완성을 찾아서 그런 다음 마지막 심볼을 나타내는 다른 포인터를 찾을 수 있습니다. 따라서 가능한 구문 분석 트리에 대한 자세한 정보를 얻었습니다. 또한 earleir 상태 세트에서 마지막으로 심볼을 인식 한 완성도를 보면 획득 방법 등을 알 수 있습니다.
논문에 표시된대로 필요한 모든 포인터를 유지한다고 가정하면 구문 분석기가 인식 한 마지막 기호 (물론 문법의 초기 기호)부터 모든 공유 트리 표현을 얻을 수 있습니다.
그러나 나는 또한 지저분한 부분을 건너 뛰었다 . 규칙이 있다고 가정 , 나는 2 개의 기호보다 긴 오른쪽과 다른 규칙으로 선택합니다. 모호한 문법입니다.
파서가 파싱 할 수도 있습니다. 으로 , 으로 그리고 둘 다 과 으로 . 규칙에 따라둘 다 과 파싱하다 .
그러면 둘 다 과 둘 다 파싱하다 . 그런 다음 규칙에 따라, 문자열 파싱하다 문법의 모호함에 해당하는 두 가지 방식으로
물론 반복 계산을 피하기 위해 Earley의 알고리즘은 두 구문 분석 계산을 가능한 많이 공유하려고 시도합니다. 실제로 공유 할 것은 분명히 인식하고 파싱하는 것입니다. 과 으로 과 . 그러나 실제로는 조금 더 할 것입니다. 인식하는 두 가지 구문 분석의 시작 부분도 공유합니다. 규칙적으로 . 내가 의미하는 바는 상태 세트에서 한 번만 (내가 설명하는 것과 관련하여) 발견됩니다. . 두 구문 분석의 공통 부분이 될 것입니다. 물론 파싱하는 동안 상황이 일시적으로 분기됩니다. 그것들은 상태에있을 때 모든 것이 W로 구문 분석 될 때 다시 수렴 할 때까지 distict substring에 해당하기 때문에 상태 세트에서 두 번 생성됨 .
따라서 구문 트리의 숲은 매우 이상한 것일 수 있습니다. 어떤 노드의 처음 두 가장자리는 공유하지만 세 번째 가장자리는 공유하지 않는 샴 쌍둥이 하위 트리가 있습니다. 다시 말해, 매우 어색한 구조 일 수 있습니다. 이것은 왜 Earley 가 더 구체적이지 않고 " 모든 가능한 파싱 트리의 인수 표현 "이라고 부르는지 설명 할 수 있습니다 .
문법을 바꾸지 않고 샴 쌍둥이를 외과 적으로 분리하는 데 관심이 있으면 복잡성이 증가합니다. 올바른 방법은 문법을 이진화하는 것입니다.
이것이 도움이되기를 바랍니다. 알려주세요. 그러나 CYK 구문 분석에 대한 이해가 도움이 될 수 있다고 주장합니다. Earley보다 간단한 다른 알고리즘이있어 모든 CF 언어를 효율적으로 구문 분석 할 수 있습니다.
/cstheory/7374#18006 및 https://linguistics.stackexchange.com/questions/4619#6120 과 같은 두 가지 답변 에서이 구문 분석 포리스트 문제에 대한 일반적인 정보를 찾을 수 있습니다 . 그러나 Earley 알고리즘의 특정 세부 사항에는 들어 가지 않습니다.