Earley 벡터에서 구문 트리의 포리스트를 어떻게 재구성합니까?


9

Earley 벡터를 인식기로 사용하는 것은 매우 간단합니다. 스트링의 끝에 도달하면 위치 0에서 시작된 완료된 축산 생산을 확인하기 만하면됩니다. 하나 이상이 있으면 스트링이 승인됩니다.

Earley 벡터를 사용하여 구문 분석 트리를 재구성하는 것은 덜 명확합니다. 실제로 알고리즘 절차가 어떻게 작동하는지 알 수 없으며, 내가 찾은 유일한 참조는 모호하거나 슈퍼 테크니컬 한 것입니다. 아무도 그것에 빛을 비출 수 있습니까?


2
찾은 참조, 모호하다고 생각한 것, 지나치게 기술적 인 것으로 생각한 참조를 나열하면 도움이됩니다. 그렇지 않으면 대답은 이미 찾은 참조에 대한 포인터 일 수 있습니다.
방황 논리

1
당신이 벡터라고 부르는 것이 Earley의 원래 종이에서 벡터라고 부르는 것이 아닐 수도 있습니다. 또는 정확히 같은 역할을하지 않을 수도 있습니다. 저자는 알고리즘의 변형을 소개합니다. 사용중인 문서에 대한 참조를 제공하지 않으므로 알 방법이 없습니다 . 어쨌든 해당 문서에 액세스하지 못할 수도 있습니다. 도움이 될 수있는 것은 정의에 대해 더 명확하게하는 것입니다. 대답 할 때 방금 Earley와 동일한 정의를 사용했다고 가정했습니다.
babou

@babou, 내가 "Earley vector" 라고 부르는 것은 파서에 의해 작성된 데이터 구조의 표 형식입니다. 그것은 내 공식 언어 교수가 그것을 언급하면서 사용하는 용어였습니다. 저의 기본 언어는 영어가 아니므로 용어를 번역하는 것은 나쁜 시도 일 수 있습니다. 제가 언급 한 기술 참조는 Earley의 논문 자체입니다. 나는 그것에 접근했다. 그러나 그것은 나 같은 진정한 초보자에게는 조금 협박이었다.
Stefano Sanfilippo 2014 년

교수가 "Earley vector"를 사용하여 Earley가 그의 논문에서 "vector"라고 부르는 것과 동일한 구조를 의미하는지 확인할 수 있습니다. 의사 소통에 유용 할 수 있습니다. 나머지는 보시다시피 구문 분석 트리를 복구 할 수 있도록 추가 정보를 보관해야하지만 Earley는 실제로 세부 정보를 다루지 않습니다. 이제 다른 알고리즘이 있으며 Earley 알고리즘의 복잡성으로 인해 이러한 유형의 기법의 핵심 아이디어가 다소 숨겨져 있습니다. 행운을 빕니다.
babou 2016 년

내 설명이 도움이 되었습니까, 아니면 기술 부분에 대한 자세한 설명이 필요합니까?
babou

답변:


9

Earley의 논문 에서 사용 된 용어와 표기법을 사용하고 있습니다. 읽은 설명이 다를 수 있습니다.

일반적인 CF 구문 분석 알고리즘이 먼저 인식기 형태로 표시되는 경우가 종종 있으며, 실제로 구문 분석 트리 및 구문 분석 포리스트를 구축하는 데 필요한 정보 관리는 일종의 사후에 추가됩니다. 공유 포리스트를 구성하는 데 필요한 정보를 유지하려면 큐빅 공간이 필요하기 때문일 수 있습니다. O(n3) 어디 n 구문 분석되는 입력 문자열의 길이이지만 공간 요구 사항은 제곱입니다. O(n2)이 정보가 보존되지 않은 경우 인식 할 수 있습니다. 이 공간의 복잡성이 증가하는 이유는 매우 간단합니다. 파싱 포리스트 크기는 입방체가 될 수 있습니다.

최악의 경우 시간 복잡도는 O(n3)잘 알려진 바와 같이.

Earley의 알고리즘에 대한 가장 좋은 참고 자료는 물론 Earley의 논문 이지만 구문 분석 포리스트를 구축하는 것에 대해서는 명확하지 않습니다. 이것은 실제로 지저분한 일이 될 수있다. 섹션 7 페이지 101의 빠른 이야기보다 훨씬 더 많은 것이 나올 것이다. 사실, Earley는 구문 분석 포리스트 나 포리스트에 대해 이야기하는 것이 아니라 " 가능한 모든 구문 분석 트리를 합리적으로 표현한 것 "에 대해 이야기 합니다 . 그리고 그 이유는 다음과 같습니다. 만약 그가 문법에 따라 숲을 만들려고한다면 그의 공간 (시간) 복잡성은O(ns+1) 어디 s가장 긴 규칙의 오른쪽 크기입니다. 그렇기 때문에 다른 알고리즘이 문법을 이진 형식으로 사용하는 이유는 아닙니다 (CNF (Chomsky Normal Form) 일 필요는 없음).

실제로 Earley는 2 진 형태를 암시 적으로 사용하는데 , 이는 3 차 시간 복잡성에 필요하기 때문입니다. 이것은 주에서 룰 도트의 주요 역할 중 하나입니다. 그러나이 암시 적 이진 형태는 이진화 된 문법에 따라 파문과 숲을 만들어냅니다. 이것은 아래에 더 자세히 설명되어 있습니다.

포리스트를 얻는 방법을 이해하는 좋은 방법 중 하나 는 CYK 알고리즘 과 같은 간단한 경우를 살펴 보는 것입니다 . 또한 종종 인식기로 설명되며 파서 측면 이 끝에 추가됩니다. Wikipedia에서 설명을 볼 수 있습니다. 포리스트를 구축하는 데 필요한 정보는 "백 포인터"테이블에 저장됩니다. 백 포인터는 기본적으로 일부 규칙에 따라 문자열의 구성 요소를 형성하는 하위 문자열 (관련 기호)에 대한 포인터입니다. 하위 문자열을 구문 분석하는 가능한 모든 방법을 제공합니다. CYK는 일반적으로 CNF 인 이진 형식을 사용하므로 상황이 더 단순 해집니다. CYK 파서는 Earley와 기본적으로 동일한 동적 프로그래밍 구조를 갖지만 훨씬 간단합니다. 따라서 잘 이해하면 큰 도움이 될 수 있습니다.

Earley의 알고리즘으로 돌아가서 수락을 결정하거나 나무와 숲을 구문 분석하기 위해 Earley 벡터가 필요하다고 생각하지 않습니다. Earley가 그의 논문에서 벡터라고 부르는 것은 구현의 세 번째 단락에서 97 페이지에만 나타납니다. 더 나은 복잡성을 얻기 위해 주어진 문자열 위치 k를 다시 가리키는 상태를 빠르게 검색하는 것은 장치 일뿐입니다. 그러나 모든 정보는 상태 목록에 구현 된 상태 세트에 있습니다. 그러나 알고리즘이 상태를 얻을 수있는 방식을 추적하지 않기 때문에이 정보로는 구문 분석 트리 포리스트를 구축하기에 충분하지 않습니다. 실제로, 벡터는 발견 된 상태와 상관없이 이미 발견 된 상태를 효율적으로 버리는 데에도 사용됩니다.

Earley의 기사 7 장에서 그는 "인식기를 파서로 만들기", 즉 구문 분석 트리를 복구하려면 완료가 완료된 방식을 추적해야한다고 설명합니다.

상태를 추가하는 완전한 작업을 수행 할 때마다 EαD.βg (lookahead 무시) 우리는 인스턴스에서 포인터를 구성합니다. D 그 상태에서 그 상태로 Dγ.f그로 인해 우리는 작업을 수행했습니다. 이것은D 로 파싱되었다 γ. D가 모호한 경우 각 완전한 작업마다 하나씩 포인터 세트가 있습니다.EαD.βg특정 상태 세트에 추가됩니다. 각 기호 γ 또한 (터미널이 아닌 한) 그것으로부터 포인터를 가질 것입니다. D.

이 본문에서 fg 구문 분석 된 문자열의 색인으로, 규칙 왼쪽 인식이 시작된 위치를 나타냅니다 (오른쪽 기호가 예측 된대로). f 인식하는 문자열 인덱스입니다 Dγ 시작하고 색인에서 끝났습니다. g. 이 "완료 포인터"는 CYK의 구문 분석기 버전에 대해 설명 된 백포 인 (백과 사에서는 그다지 좋지 않음)의 Earley에 해당합니다.

그러한 인용문에서 (인용 서에 설명 된 바와 같이) 우리는 D 규칙 인스턴스에서 EαD.βg 입력 문자열을 구문 분석하는 트리 (또는 포리스트)로 자체 개발 될 수 있습니다. w 색인에서 f+1 색인 g우리가 주목 wf+1:g. 바로 아래 노드D 규칙에 의해 주어진다 Dγ. 이어지는 완성을 찾아서Dγ.f 그런 다음 마지막 심볼을 나타내는 다른 포인터를 찾을 수 있습니다. D따라서 가능한 구문 분석 트리에 대한 자세한 정보를 얻었습니다. 또한 earleir 상태 세트에서 마지막으로 심볼을 인식 한 완성도를 보면 획득 방법 등을 알 수 있습니다.

논문에 표시된대로 필요한 모든 포인터를 유지한다고 가정하면 구문 분석기가 인식 한 마지막 기호 (물론 문법의 초기 기호)부터 모든 공유 트리 표현을 얻을 수 있습니다.

그러나 나는 또한 지저분한 부분을 건너 뛰었다 . 규칙이 있다고 가정 UXYZ, 나는 2 개의 기호보다 긴 오른쪽과 다른 규칙으로 선택합니다. WUV모호한 문법입니다.

파서가 파싱 할 수도 있습니다. wf+1:g 으로 X, wg+1:h 으로 Y 그리고 둘 다 wh+1:iwh+1:j 으로 Z. 규칙에 따라UXYZ둘 다 wf+1:iwf+1:j 파싱하다 U.

그러면 둘 다 wi+1:kwj+1:k 둘 다 파싱하다 V. 그런 다음 규칙에 따라WUV, 문자열 wf+1:k 파싱하다 W 문법의 모호함에 해당하는 두 가지 방식으로

물론 반복 계산을 피하기 위해 Earley의 알고리즘은 두 구문 분석 계산을 가능한 많이 공유하려고 시도합니다. 실제로 공유 할 것은 분명히 인식하고 파싱하는 것입니다.wf+1:gwg+1:h 으로 XY. 그러나 실제로는 조금 더 할 것입니다. 인식하는 두 가지 구문 분석의 시작 부분도 공유합니다.U 규칙적으로 UXYZ. 내가 의미하는 바는UXY.Zf 상태 세트에서 한 번만 (내가 설명하는 것과 관련하여) 발견됩니다. Sh. 두 구문 분석의 공통 부분이 될 것입니다. 물론 파싱하는 동안 상황이 일시적으로 분기됩니다.Z 그것들은 상태에있을 때 모든 것이 W로 구문 분석 될 때 다시 수렴 할 때까지 distict substring에 해당하기 때문에 WUV.f 상태 세트에서 두 번 생성됨 Sk.

따라서 구문 트리의 숲은 매우 이상한 것일 수 있습니다. 어떤 노드의 처음 두 가장자리는 공유하지만 세 번째 가장자리는 공유하지 않는 샴 쌍둥이 하위 트리가 있습니다. 다시 말해, 매우 어색한 구조 일 수 있습니다. 이것은 왜 Earley 가 더 구체적이지 않고 " 모든 가능한 파싱 트리의 인수 표현 "이라고 부르는지 설명 할 수 있습니다 .

문법을 바꾸지 않고 샴 쌍둥이를 외과 적으로 분리하는 데 관심이 있으면 복잡성이 증가합니다. 올바른 방법은 문법을 이진화하는 것입니다.

이것이 도움이되기를 바랍니다. 알려주세요. 그러나 CYK 구문 분석에 대한 이해가 도움이 될 수 있다고 주장합니다. Earley보다 간단한 다른 알고리즘이있어 모든 CF 언어를 효율적으로 구문 분석 할 수 있습니다.

/cstheory/7374#18006https://linguistics.stackexchange.com/questions/4619#6120 과 같은 두 가지 답변 에서이 구문 분석 포리스트 문제에 대한 일반적인 정보를 찾을 수 있습니다 . 그러나 Earley 알고리즘의 특정 세부 사항에는 들어 가지 않습니다.


CYK 파싱뿐만 아니라 GLR 파싱도 살펴볼 가치가 있습니다.
가명

1
@Pseudonym 일반적인 CF 파싱의 다양한 형태를 알고 이해하는 것은 확실히 아프지 않으며, 나는 대답 끝에 두 개의 참조를 제안합니다. 그러나 CYK를 선택한 것은 우연이 아닙니다. 이 문법은 문법을 Push-Down Automaton (GLR, GLL, GPrec에서와 같이)으로 컴파일하여 생성 된 테이블을 사용하지 않고 문법을 사용하여 해석적인 속성을 Earley의 알고리즘과 공유합니다. 따라서 인식 과정과 나무 / 숲 생성 사이의 관계가보다 명확하게 보입니다. CKY는 가장 간단한 알고리즘이지만 한 가지 예외가 있습니다.
babou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.