CYK 알고리즘
CYK algorithm| 학급 | 문맥이 없는 문법을 사용한 구문 분석 |
|---|---|
| data 구조 | 스트링 |
| 최악의 경우 성능 | ( n G) { \{ } \ ( {3 \ \ G \ }。여기서:
|
컴퓨터 공학에서 코크란...Younger-Kasami 알고리즘(CYK 또는 CKY)은 1961년 [1]사카이 이치로에 의해 발표된 문맥 없는 문법의 해석 알고리즘입니다.이 알고리즘의 이름은 재발견자인 John Cocke, Daniel Younger, Tadao Kasami 및 Jacob T의 이름을 따서 지어졌다. 슈와츠.상향식 구문 분석과 동적 프로그래밍을 사용합니다.
CYK의 표준 버전은 촘스키 표준 형식(CNF)에서 주어진 문맥이 없는 문법에서만 작동합니다.단, 문맥이 없는 문법은 (컨벤션 후에) 같은 언어를 표현하는 CNF 문법으로 변환할 수 있습니다(Sipser 1997).
CYK 알고리즘의 중요성은 특정 상황에서 높은 효율성으로 인해 발생합니다.빅 O 표기법을 사용하는 경우 CYK의 최악의 실행시간은O( 3 G입니다.여기서 n {O^{ G는 해석된 문자열의 길이,\\right는 CNF 크기입니다.(홉크로프트 & 울먼 1979, 페이지 140)이는 많은 실제 시나리오에서 평균 실행 시간이 더 나은 다른 알고리즘이 존재하지만 최악의 경우 점근 복잡성 측면에서 가장 효율적인 구문 분석 알고리즘 중 하나입니다.
표준형식
동적 프로그래밍 알고리즘은 현재 시퀀스를 두 개의 작은 시퀀스로 분할할 가능성을 테스트하기 때문에 컨텍스트 프리 문법을 촘스키 정규 형식(CNF)으로 렌더링해야 합니다.빈 문자열을 생성하지 않는 문맥 없는 문법은 (\ A \ (\A) S SS 의 생성 규칙만을 사용하여 CNF에서 나타낼 수 있습니다
알고리즘.
의사 코드로서
의사 코드의 알고리즘은 다음과 같습니다.
입력은 n개의 문자로 구성된 문자열 I로 합니다n.a1 . a . 문법에 r non terminal 심볼1 R ...을 포함하도록 합니다.시작r 기호 R을1 가진 R. P[n,n,r]를 부란의 배열이라고 하자.P의 모든 요소를 false로 초기화합니다.백[n,n,r]은 백포인트 트리플 리스트의 배열로 합니다.의 모든 요소를 빈 목록으로 초기화합니다.각 들 들어=1n에 각 단위 생산 Rv →을로 설정되어 P[1,s,v])사실 각 l=2n, 길이의 기간 동안 각 s=1에 n-l+1--시작의 기간 동안 각 p=1에 l-1--분할의 기간 동안 각 생산 Ra→ Rb Rc 만약 P[p,s,b]과 P[l-p,s+p,c] 다음을 세웠다 P[l,s,a])사실,append<>p,b,c>는 back[l,s,a]만약 P경우 n,.1,1]t은rue 그러면 나는 language return back의 멤버입니다.스텝을 되돌림으로써 문자열의 가능한 모든 해석 트리를 쉽게 작성할 수 있습니다.그렇지 않으면 "언어 구성원이 아님"을 반환합니다.
확률론적 CYK(가장 가능성이 높은 구문 분석의 경우)
모든 프로덕션의 확률을 고려하여 가장 가능성이 높은 해석을 복구할 수 있습니다.
입력은 n개의 문자로 구성된 문자열 I로 합니다n.a1 . a . 문법에 r non terminal 심볼1 R ...을 포함하도록 합니다.Rr, 시작 기호1 R. P[n,n,r]를 실수의 배열로 합니다.P의 모든 요소를 0으로 초기화합니다.백[n,n,r]을 일련의 백포인트 트리플로 하다각 들 들어=1n에 생산 Rv →as 각 나는을 P[1,s,v])Pr(Rv →as)을 세웠다 각 단위 x2n없이 말입니다--그리고 범위의 각에 길이 cm길이의 각 p1에 n-l+1, 시작하라=1l-1는 아름다운 각 생산 Ra→ Rb Rc prob_splitting)Pr(Ra→Rb Rc)*P[p,s,b]*P[l-p,s+p,c]만약, P[l,s,a] 다음 P을 세웠다 을 prob_splitting는 경우에는 l,s에 칸막이네,a 뻗는다)prob_sP[n,1,1]> 0인 경우 priting back [l,s,a]= <p,b,c> parse tree를 찾습니다.그렇지 않으면 parse tree가 반환됩니다.
산문으로
비공식적으로 말하면, 이 알고리즘은 입력 문자열의 가능한 모든 서브스트링을 고려하여 에서 하는 l의 서브스트링을 v에서 생성할 수 있는 경우 P[s Ps, 를 true로 합니다.길이 1의 서브스트링에 이어 길이 2의 서브스트링까지 이어집니다.길이 2 이상의 서브스트링의 경우 서브스트링의 가능한 모든 분할을 두 부분으로 나누어 A C A B가 생산되는지 확인합니다.는B디스플레이 스타일 가 첫 번째부분과 일치하고 C( C가 두 번째 부분과 일치합니다.이 경우 서브스트링 전체와 일치하는 것으로 A)가 기록됩니다.이 처리가 완료되면 입력 문자열 전체를 포함하는 부분 문자열이 시작 기호와 일치하면 문법에 의해 입력 문자열이 생성됩니다.
예
다음은 문법의 예를 제시하겠습니다.
이제 포크로 물고기를 먹는 문장은 CYK 알고리즘을 사용하여 분석됩니다.다음 표에서 P[ , , [ , j, ] p 、 i 、 is 、 is ( 、 is ( in1부터 시작하는 행의 번호입니다.j는 열의 번호입니다(왼쪽부터 시작).
| S | ||||||
| 부사장 | ||||||
| S | ||||||
| 부사장 | PP | |||||
| S | NP | NP | ||||
| NP | V, VP | 디트 | N | P | 검출 | N |
| 그녀는. | 먹다 | a | 물고기. | 와 함께 | a | 포크 |
가독성을 확보하기 위해 P의 CYK 테이블은 여기서 일련의 비말단 기호를 포함하는 2차원 매트릭스 M으로 표현됩니다.예를k 들어 R은M[ , \ M ,, k P , , ]\ displaystyle P [ i , , ]로 표시됩니다.문장은 문법에 의해 생성될 수 있다.
내선번호
해석 트리 생성
위의 알고리즘은 문장이 언어인지 아닌지만 판별하는 인식기입니다.해석 트리 노드를 부울 1이 아닌 어레이의 요소로 저장함으로써 해석 트리를 구성하는 파서로 확장하는 것은 간단합니다.노드는 트리 구조를 구축하기 위해 노드를 생성하는 데 사용된 배열 요소에 연결됩니다.해석 트리가 하나만 생성될 경우 각 어레이 요소에서 이러한 노드가 하나만 필요합니다.다만, 애매한 문장의 모든 해석 트리를 보관 유지하는 경우는, 해석 프로세스에서 대응하는 노드를 얻을 수 있는 모든 방법의 리스트를 어레이 요소에 격납할 필요가 있다.이것은 이른바 백포터라고 불리는 두 번째 테이블 B[n,n,r]를 사용하여 수행되기도 합니다.최종 결과는 가능한 해석 트리의 공유 포레스트가 되며, 여기서 공통 트리 부분은 다양한 해석 사이에 인수됩니다.이 공유 포레스트는 Lang(1994년)에 나타난 바와 같이 해석된 문장만 생성하지만 원래 문법과 동일한 모호성을 갖는 애매한 문법으로 쉽게 해석할 수 있으며, 동일한 해석 트리는 매우 단순한 비말단 이름 변경까지 가능하다.
CNF 이외의 컨텍스트프리 문법의 해석
Lange & Lei ((2009)가 지적한 바와 같이, 촘스키 정규형으로의 모든 알려진 변환의 단점은 문법 크기가 바람직하지 않은 팽창을 초래할 수 있다는 것이다.문법의 크기는 생성 규칙의 크기를 합한 것입니다. 여기서 규칙의 크기는 오른쪽의 길이를 더한 값입니다.gg)를 하여 원래 문법의 크기를 나타냅니다.최악의 경우 사용하는 변환 알고리즘에 따라서는(\2}) ~ 2의 사이즈가 됩니다.Lange와 Lei'는 교육에 사용하기 위해 "알고리즘의 효율성, 프레젠테이션의 명확성 또는 증명의 단순성을 해치지 않고" CYK 알고리즘의 약간의 일반화를 제안합니다(Lange & Lei™ 2009).
가중 컨텍스트 프리 문법 구문 분석
가중치 및 확률적 컨텍스트프리 문법을 사용하여 문자열을 해석하도록 CYK 알고리즘을 확장할 수도 있습니다.그런 다음 가중치(확률)가 부울란 대신 표 P에 저장되므로 P[i,j,A]는 i에서 j까지의 서브스트링이 A에서 파생될 수 있는 최소 가중치(최대 확률)를 포함합니다.알고리즘의 추가 확장을 통해 문자열의 모든 파스를 최소 무게에서 최대 무게로 열거할 수 있습니다(가장 높은 확률에서 가장 낮은 확률로).
수치 안정성
확률론적 CYK 알고리즘을 긴 문자열에 적용하면 많은 확률을 함께 곱하기 때문에 분할 확률이 매우 작아질 수 있다.이 문제는 확률을 곱하는 대신 로그 확률을 합산하여 해결할 수 있습니다.
발리안트 알고리즘
CYK의 최악의 실행 시간은 ( 3G) \ G)입니다여기서 n은 해석된 문자열의 길이이고 G는 CNF 문법 G의 크기입니다.이를 통해 실제로 문맥이 없는 일반적인 언어를 인식하기 위한 가장 효율적인 알고리즘 중 하나가 됩니다.Valiant(1975)는 CYK 알고리즘의 확장을 제공했다.그의 알고리즘은 CYK 알고리즘과 동일한 해석 테이블을 계산하지만, 그는 0-1 엔트리를 가진 행렬의 효율적인 곱셈을 위한 알고리즘이 이 계산을 수행하기 위해 사용될 수 있음을 보여주었다.
이러한 행렬을 곱하기 위해 Coppersmith-Winograd 알고리즘을 사용하면 점근적으로 최악의 경우(.}\ G가 .다만, Big O 표기법에 의해 숨겨진 상수 항이 너무 커서 Coppersmith-Winograd 알고리즘에 대해서만 가치가 있습니다.oo는 현재 컴퓨터에서 처리할 수 있는 큰 크기(Knuth 1997)이며, 이 접근 방식은 감산이 필요하므로 인식에만 적합합니다.효율적인 행렬 곱셈에 대한 의존은 완전히 피할 수 없다: Lee(2002)는 O 3-G)({ O G에서 동작하는 문맥 없는 문법에 대한 파서가( × style의곱을 계산하는 알고리즘으로 효과적으로 변환될 수 있음을 증명했다. n O에 0-1 엔트리가 있는 행렬( - / ){ O입니다.이것은 Aboud [3]등에 의해 확장되어 일정한 크기의 문법에 적용되었습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Grune, Dick (2008). Parsing techniques : a practical guide (2nd ed.). New York: Springer. p. 579. ISBN 978-0-387-20248-8.
- ^ Sipser, Michael (2006). Introduction to the theory of computation (2nd ed.). Boston: Thomson Course Technology. Definition 2.8. ISBN 0-534-95097-3. OCLC 58544333.
- ^ Abboud, Amir; Backurs, Arturs; Williams, Virginia Vassilevska (2015-11-05). "If the Current Clique Algorithms are Optimal, so is Valiant's Parser". arXiv:1504.01431 [cs.CC].
원천
- Sakai, Itiroo (1962). Syntax in universal translation. 1961 International Conference on Machine Translation of Languages and Applied Language Analysis, Teddington, England. Vol. II. London: Her Majesty’s Stationery Office. pp. 593–608.
- Cocke, John; Schwartz, Jacob T. (April 1970). Programming languages and their compilers: Preliminary notes (PDF) (Technical report) (2nd revised ed.). CIMS, NYU.
- Hopcroft, John E.; Ullman, Jeffrey D. (1979). Introduction to Automata Theory, Languages, and Computation. Reading/MA: Addison-Wesley. ISBN 0-201-02988-X.
- Kasami, T. (1965). An efficient recognition and syntax-analysis algorithm for context-free languages (Technical report). AFCRL. 65-758.
- Knuth, Donald E. (November 14, 1997). The Art of Computer Programming Volume 2: Seminumerical Algorithms (3rd ed.). Addison-Wesley Professional. p. 501. ISBN 0-201-89684-2.
- Lang, Bernard (1994). "Recognition can be harder than parsing". Comput. Intell. 10 (4): 486–494. CiteSeerX 10.1.1.50.6982. doi:10.1111/j.1467-8640.1994.tb00011.x. S2CID 5873640.
- Lange, Martin; Leiß, Hans (2009). "To CNF or not to CNF? An Efficient Yet Presentable Version of the CYK Algorithm". Informatica Didactica. 8.
- Lee, Lillian (2002). "Fast context-free grammar parsing requires fast Boolean matrix multiplication". J. ACM. 49 (1): 1–15. arXiv:cs/0112018. doi:10.1145/505241.505242. S2CID 1243491.
- Sipser, Michael (1997). Introduction to the Theory of Computation (1st ed.). IPS. p. 99. ISBN 0-534-94728-X.
- Valiant, Leslie G. (1975). "General context-free recognition in less than cubic time". J. Comput. Syst. Sci. 10 (2): 308–314. doi:10.1016/s0022-0000(75)80046-8.
- Younger, Daniel H. (February 1967). "Recognition and parsing of context-free languages in time n3". Inform. Control. 10 (2): 189–208. doi:10.1016/s0019-9958(67)80007-x.