Earley 파서에서 구문 분석 포리스트를 복구 하시겠습니까?


25

나는 최근에 Earley 파서를 읽고 있었고 지금까지 본 것 중 가장 우아한 알고리즘 중 하나라고 생각합니다. 그러나, 전통적인 의미에서 알고리즘은입니다 인식기 가 아닌 파서, 이 문자열이 특정 CFG 일치하는지 여부를 감지하지만 그것을 구문 분석 트리를 생성 할 수 있다는 것을 의미한다. 내 질문은 구문 분석 트리 가 아니라 주어진 입력 문자열의 모든 구문 분석의 구문 분석 포리스트 를 복구하는 방법 입니다.

Grune and Jacob의 "Parsing Techniques : A Practical Guide"에서 Earley 인식기의 결과에서 구문 분석 포리스트를 복구하는 데 사용할 수있는 알고리즘을 보여 주지만 런타임이 O (n k + 인 Unger의 구문 분석 방법을 기반으로합니다. 1 ) k는 문법 긴 제품의 길이이다. 이는 런타임이 문법 크기에서 다항식이 아님을 의미합니다. 또한 파슬리 포리스트를 복구하는 알고리즘을 제안하는 알고리즘에 대한 Earley의 원본 논문은 올바르지 않습니다 (예 : Tomita 의이 기사 762 페이지 참조 ). 여전히 많은 소스에서 파싱 포리스트를 복구하는 적절한 방법으로 인용하고 있습니다. .

내 질문은 다항식 시간에 주어진 입력 문자열에 대한 구문 분석 포리스트를 복구 할 수 있는지 여부입니다. 나는 종이 발견 여기 가 가능해야한다처럼이 보인다 있도록하는 PDA의 시뮬레이션을 사용하는 구문 분석을위한 입방 크기 구문 분석 숲의 표현을 생성하는 알고리즘을 제공하지만 나는이 작업을 수행 할 수있는 방법을 찾기 위해 아직있다. 결과적으로 구문 분석 포리스트가 상당히 지저분하므로 입력 문법을 CNF로 변환하지 않고이 작업을 수행하는 것이 이상적입니다.

도움을 주셔서 감사합니다.


Earley 구문 분석을 기반으로하는 알고리즘이어야합니까, 아니면 다른 일반 CFG 구문 분석기를 사용해도 괜찮습니까?
Alex ten Brink

1
Earley 파서를 기반으로 한 알고리즘을 선호합니다. 나는 컴파일러 과정을 가르치고 있으며 며칠 동안이 질문에 대한 답을 찾으려고 노력했으며 실제로 나를 괴롭 혔습니다.
templatetypedef

단어가 지수 적으로 많은 구문 분석 트리를 가질 수 있으므로 지수 런타임은 놀라운 것이 아닙니다. 실제로 임의의 CFG를 허용하면 무한히 많을 수도 있습니다.
Raphael

3
@Raphael 파싱 포리스트의 역할은 공간 구조가 작은 유한 한 구조로 무한히 많은 트리를 표현할 수있는 공유 메커니즘을 갖추는 것입니다. 물론, 이것은 벌목꾼에게 약간의 일을 남길 수 있습니다.
babou

Marpa 를보고 싶을 수도 있습니다 . Earley 파서를 구현하고 전체 구문 분석 포리스트 지원을 제공하는 Perl 모듈 및 C 라이브러리입니다.
hippietrail

답변:


14

물론 그렇게하는 것은 주어진 문장에 대한 모든 파싱 트리를 나타내는 "포장 된 숲"에 대한 올바른 표현에 달려 있습니다.

나는 당신이보고자하는 곳이 Joshua Goodman의 논문에 있다고 생각한다 (1999 년 하버드 내부 분석). 기본적으로 아이디어는 특정 반 링에서 구문 분석 알고리즘을 정의 할 수 있다는 것입니다. 반 반지에 따라 베어 구문 분석 트리 (인식기 또는 구문 분석기) 대신 모든 종류의 수량과 구조를 계산할 수 있습니다. 정의 할 수있는 반 반지 (Goodman이 논문에서 수행하는)는 값이 구문 분석 세트 인 반 반지입니다. 문장의 구문 분석을 마치면 기본 구문 분석 노드에 모든 구문 분석 트리가 생깁니다.

다시 한 번, 올바른 표현을 통해 가능하도록주의해야합니다.


참조 주셔서 감사합니다! 이것은 훌륭한 리소스처럼 보이며 시간을 들여서 살펴볼 것입니다.
templatetypedef

8

이를 수행하는 방법을 설명하는 논문이 있습니다.

Elisabeth Scott의 Earley Recognisers의 SPPF 스타일 구문 분석

입방 시간으로 이진화 된 파싱 포리스트를 구축하는 방법에 대해 설명합니다.


2
그 연결은 이제 끊어진 것 같습니다. 참조 (논문 제목, 출판 된 곳, 저자 목록) 및 / 또는 업데이트 된 링크가 있습니까?
DW

1
참조 web.archive.org/web/20130508170633/http://thor.info.uaic.ro/...을 "Earley Recognisers에서 SPPF 스타일 구문 분석", 엘리자베스 스콧. 또 다른 링크 : dinhe.net/~aredridel/.notmine/PDFs/... .
a3nm

이것은 "Earley 인식기에서 구문 분석 포리스트를 얻는 방법"이라는 질문에 대한 정답입니다.
tjvr

JS에는 이것에 대한 좋은 구현이 있습니다 : joshuagrams.github.io/pep
tjvr

이 문맥에서 이진화 란 무엇입니까?
브루스 아담스

6

CNF는 필요하지 않습니다. 문법 구조를 변경한다는 단점이 있습니다. 그러나 RHS 길이가 복잡성을 결정하므로 오른쪽이 2보다 길지 않도록 중간 비 터미널을 도입해야합니다. 메모리가 제공되는 경우 Beau Shiel의 "컨텍스트 프리 파싱에 대한 관찰"이라는 논문이 직관적으로 설명하기위한 최선의 시도는 1976 년 전산 언어학 회의에서 출판되었다. Earley의 알고리즘은 2 가지 형태를 암시 적으로 사용합니다. 알고리즘에 숨겨져 있습니다. 구문 분석 포리스트의 복구 및 처리와 관련하여 웹을 "파싱 교차 포리스트 분석"으로보아야합니다. 실제로 매우 간단합니다. 인용 또는 목차에서 제목이나 저자가 직접 검색 할 수있는 많은 논문이 웹상에 있습니다.

실제로 CF보다 훨씬 더 많은 작업을 수행 할 수 있으며 다항식 시간에 구문 분석 포리스트를 얻을 수 있습니다. 문제는 때때로입니다. 일단 가지고 있다면 무엇을 할 수 있습니까?

마지막 기사에서 언급 한 한 가지 목적은 복잡한 알고리즘 (예 : GLR)이 시간이나 공간에서 무언가를 구매할 필요는 없으며 파싱 포리스트를 변경할 수 있음을 보여주는 것입니다.

가르침에 대한 한 가지 언급. 나는 그것이 정직한 Earley가 가르치기에는 너무 복잡하고 본질적으로 동일한 교육 내용을 가진 간단한 알고리즘으로 대체 될 수 있다고 생각합니다. 교육은 개념이나 기술에 관한 것입니다. Earley의 알고리즘에서 필수 개념은 세부 사항의 복잡성에 숨겨져 있으며 기술적 인 관점에서 볼 때 구식입니다. 그것은 훌륭한 논문 이었지만 그것이 최고의 교육 학적 접근법이라는 것을 의미하지는 않습니다.

전산 언어학 문헌에는 일반적인 컴퓨터 과학 채널보다 더 많은 정보가있을 수 있습니다. 나는 Ceriel-Grune-Jacobs 책을 가지고 있지 않지만, 그들이 적절한 기준을 모두 가지고 있지 않다면 나는 놀랐을 것입니다 (선택 기준에 대해서는 잘 모르겠습니다).


의견 요청 후 보완 (2013 년 7 월 7 일)

이 보완책은 Earley보다 간단한 알고리즘이 존재한다고 생각합니다.

내가 말했듯이 "파싱 교차 포리스트 분석"에서 웹을 검색하면 참조를 신속하게 제공 할 수 있습니다.

기본 아이디어는 공유 포리스트 구성으로 구문 분석하는 모든 경로가 유한 오토 마톤과 컨텍스트가없는 문법을 사용하여 일반 언어와 컨텍스트가없는 언어를 위해 Bar Hillel, Perles 및 Shamir의 오래된 교차로 구성에 지나지 않는다는 것입니다. CF 문법이 주어지면 입력 문자열 만 인식하는 사소한 오토 마톤에 구성을 적용합니다. 그게 다야 공유 포리스트는 교차로의 문법 일뿐입니다. 동질성을 통해 원래 문법과 관련이 있으며 주어진 문자열 만 인식하지만 원래 문법의 모든 구문 분석 트리는 해당 동질성까지 (즉, 비 터미널의 간단한 이름 변경) 있습니다.

결과 문법에는 공리에서 접근 할 수 없거나 (초기 기호에서 파생 된 문자열에서는 찾을 수 없음) 생산적이지 않은 (터미널로 파생 될 수없는) 쓸모없는 많은 비단 말 및 규칙이 포함됩니다. 끈).

그런 다음 마지막에 좋은 브러시로 청소해야하거나 (아마도 알고리즘 적으로 간단 할 수 있음) 구성을 개선하여 쓸데없는 보풀이 줄어 듭니다.

예를 들어, CYK 구성은 정확히 그 자체이지만, 많은 규칙에 도달 할 수는 없지만 생성 된 모든 규칙과 비 터미널이 생산적 이도록 구성됩니다. 이것은 상향식 기술에서 예상됩니다.

하향식 기술 (예 : LR (k) 기반 기술)은 도달 할 수없는 규칙과 비 터미널을 피하지만 비생산적인 기술을 만듭니다.

포인터를 적절하게 사용하면 실제로 많은 양치질을 달성 할 수 있다고 생각합니다. 그러나 오랫동안 이것을 보지 않았습니다.

기존의 모든 알고리즘은 실제로 해당 모델을 따릅니다. 이것이 문제의 핵심이며 매우 간단합니다. 그렇다면 왜 복잡하게 묻습니까?

많은 "최적화"가 LR (k), LL (k) 파서 구성 패밀리를 기반으로하는 문학에서 종종 제안되는데, 아마도 이러한 구성의 일부 정적 팩터링이있을 수있다 (Earley는 정적 팩터링이 없다). 이전 우선 순위 파서를 포함하여 알려진 모든 기술에 실제로 적용될 수 있습니다. 나는 일반적으로 당신이 무엇을 최적화하고 있는지, 심지어 실제로 최적화하고 있는지, 또는 개선의 이점이 파서의 복잡성을 더할 가치가 있는지 명확하지 않기 때문에 따옴표 사이에 "최적화"를 넣습니다. 이것에 대해 공식적이든 실험적이든 객관적인 데이터는 거의 없지만 많은 주장이 있습니다. 나는 관심이 없다고 말하는 것이 아닙니다. 똑똑한 아이디어가 있습니다.

이제 기본 개념을 알고 나면 문법에서 푸시 다운 오토 마톤을 구성하고 관심있는 파서 구성 기술의 종류에 따라 "최적화"또는 개선을 정적으로 (아마도 점차적으로) 도입 할 수 있습니다. 해당 오토 마톤 (문법과 거의 같은 것) 또는 해당 오토 마톤에서 파생 된 문법과의 교차를위한 교차 제품 구성.

그런 다음 종과 휘파람을 소개 할 수 있지만 대부분 기술적 세부 사항입니다.

아이작 뉴턴의 철학 자연주의 공리 수학은 물리학과 수학의 위대한 조각으로 알려져 있습니다. 나는 그것이 많은 학생들의 독서 목록에 있다고 생각하지 않습니다. 다른 모든 것들이 평등하다는 것은 Earley의 알고리즘을 가르치는 것이 매우 유용하다고 생각하지는 않지만 중요한 역사적 조각입니다. 학생들은 그대로 배울 수 있습니다. Knuth LR (k) 용지에 대해서도 많은 사람들이 격추 될 위험이 있다고 생각합니다. 그것은 이론적 분석에 대한 훌륭한 이론적 분석이며 아마도 이론가에게 중요한 독서 일 것입니다. 나는 하드웨어와 소프트웨어의 기술의 현재 상태를 감안할 때 파서 작성에 필수적이라는 것을 강력히 의심합니다. 파싱이 컴파일 시간의 중요한 부분이었던 시대는 지났습니다. 또는 컴파일러 속도가 중요한 문제인 경우 (약 30 년 전에 컴파일 비용으로 사망 한 한 회사를 알고있었습니다). 파싱 ​​전문가는 특정 시점에서 전문 지식을 배우기를 원할 수도 있지만 컴퓨터 과학, 프로그래밍 또는 엔지니어링 분야의 일반 학생에게는 필요하지 않습니다.

학생들이 구문 분석에 더 많은 시간을 소비해야하는 경우, 계산 언어에 사용되는 것과 같이보다 유용하고 형식적인 다른 확장이 있습니다. 교수의 첫 번째 역할은 과학 지식을 구조화하는 간단한 아이디어를 추출하는 것입니다. 학생들이 연구 과학자들이 겪어야하는 고통을 겪게하지 않도록하십시오 (의사 학생은 제외 : 통과 의례 :-).

작성자의 라이센스 CC BY-SA 3.0


2
"Earley ...는 가르치기에는 너무 복잡하고 더 간단한 알고리즘으로 대체 될 수 있습니다 ...". 더 간단한 알고리즘의 예를 제시해 주시겠습니까?
wjl

@wjl 위의 답변에 대한 부록으로 회신합니다. 내가 추천 한대로 검색을 수행하면 문학에서 일부를 찾을 수는 있지만 특정 알고리즘을 가리 키지는 않습니다. 오히려 단순하고 효율적인 알고리즘을 만드는 것이 왜 쉬운 지 설명하려고 노력했습니다. Earley 's는 아마도 가장 복잡한 것일 것입니다. Bar Hillel et al. 구성은 교과서의 약 반 페이지입니다. 예를 들어 증명 페이지가 있습니다.
babou

@wjl 요청에 응답하는 데 시간이 걸렸습니다. 도움이 되었습니까? . . . . . 실제 알고리즘을 원한다면 초기 질문 의 마지막 링크 에 알고리즘이 있습니다.
babou

네 감사합니다; 추가 세부 사항에 감사드립니다. 나는 내가하고있는 일과 다른 알고리즘에 대한 수많은 연구를 위해 일반화 된 파서 라이브러리에서 일하고 있습니다. 저는 알고리즘을 이해하기가 매우 쉬운 것처럼 보였고 결속 문법과 "블랙 박스"(컨텍스트에 따라 다름) 터미널로 확장하기 쉽기 때문에 Early 스타일 구현에 현재 기울고 있습니다. 나는 당신이 지적한 논문 중 일부를 감추고 인쇄했다. 그러나 나는 그들을 진지하게 읽지 않았습니다.
wjl

@wjl이 작업을 수행하는 경우 약간 문맥에 맞는 언어, 선형 문맥없는 재 작성 시스템 (LCFRS) 및 범위 연결 문법과 같은 주제를 살펴 봐야합니다. "블랙 박스"터미널이 무엇인지 잘 모르겠습니다. -이메일 : inbox.com의 babou - -
babou

5

큐빅 시간에 이진화 된 구문 분석 포리스트를 구축하는 방법을 설명하는 논문 (Angelo Borsotti의 게시물에서 언급)은 다음과 같습니다. 여기에서 찾을 수 있습니다 : http://dx.doi.org/10.1016/j.entcs.2008.03.044

이 문서에서는 가능한 모든 파싱 트리를 나타내는 SPPF (Shared Packed Parse Forest)의 구성에 대해 설명합니다. 서브 트리는 가능할 때마다 공유되며 동일한 비 터미널에서 동일한 서브 스트링의 다른 파생에 해당하는 노드가 결합됩니다.


포인터 주셔서 감사합니다. 큐빅 시간으로 이진화 된 파스-포리스트를 구축하는 것이 표준입니다. 이진화는 입방 시간을 얻는 유일한 방법이므로 복잡도 wrt 문법 크기에 대한 OP의 설명은 관련이 없습니다. 또 다른 문제는 구문 분석 포리스트가 이진화되는 방식을 이해하는 것입니다. 알고리즘에 따라 다를 수 있습니다. 다른 문제는 공유 포리스트의 공유 량과 구문 분석 전략의 실제 효율성입니다 (Earley는 나쁜 생각 일 수 있습니다). 이 모든 것은 OP의 마지막 참조에서 개발되었습니다. 이 문제에 대한 일반적인 공식 견해는 제 대답에 나와 있습니다.
babou

1

이 논문을 읽도록 제안하여 위의 답변을 에코하고 싶습니다.

http://dx.doi.org/10.1016/j.entcs.2008.03.044

이 백서에서 알고리즘을 구현했으며 오류가 있다고 생각하여 자격을 부여하고 싶습니다. 특히, 섹션 4의 두 번째 단락의 첫 번째 문장. Earley가 "스캐닝"단계라고 부르는 것에 대해 작성하는 선행 레이블은 다른 방향이 아니라 p에서 q를 가리켜 야합니다.

특히 다음 줄 :

E0을 항목으로 설정하십시오 (S :: = · α, 0). i> 0의 경우 각 q = (A :: = α · aiβ, j) ∈ Ei-1에 대해 항목 p = (A :: = αai · β, j)를 추가하여 Ei를 초기화하고 α =이면 q에서 p까지 i − 1로 표시되는 선행 포인터

"q에서 p로"가 아니라 "p에서 q로"를 읽어야합니다.

원래 언급 된대로 알고리즘을 구현했는데, 여기에서 포인터의 방향을 변경하면 수정 된 일부 수동 테스트 사례에서 오류가 발생했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.