Posts List

[자연어처리] 6. Syntax & Syntactic Parsing (작성중)

Syntax & Syntactic Parsing

※ Parsing은 Analysis와 유사한 의미로 사용되며, 특히 syntax를 분석할 때 parsing이란 말을 주로 쓴다.

syntax는 교환법칙이 성립하는 수학과는 달리 어순이 달라지면 전혀 다른 의미를 가진다. 그래서 syntax는 단순한 차원이 아닌 좀 더 고차원의 데이터로 간주해야하며, 대표적으로 syntax를 표현하는 개념이 바로 constituencydependency가 있다.

constituency는 의미적으로 긴밀한 단어들을 grouping하는 개념이다. (단위 : constituent)

반면 dependency는 단어간 영향력을 표현한 개념이다. (morphological/syntactic/semantic) 예를 들어 morphological한 개념에서 She는 have/has를 결정할 수 있음으로 영향력을 끼친다고 할 수 있다.

※ constituency, dependency의 개념 정도만 기억해 두자.

둘 중 dependency 자료 구조가 어순에 자유로워 ML에도 주로 사용되는 자료 구조이다.

Chunk는 언어학에서 '구'의 개념보다는 작은단위이며, (앞으 수식어는 포함시키되, 후의 수식어는 제외시키는 개념) Base NP(혹은 NP chunk)라고 부른다. 

Text chunking은 문장에서 나오는 모둔 chunk를 찾는 것이다. 그리고 chunking을 추출하기 위해 앞서 배운 Sequence labeling을 활용할 수 있다. 

※ 통상 알려진 NP chunking의 F1 score는 96%, text chunking은 94.13%로 알려져있다. (CoNLL data)

그런데 이런 partial parsing을 넘어 full parsing을 하려면 엄청나게 큰 전자 사전이 필요하다. 그런데 이 사전을 개발하는것 자체에 엄청난 resource가 필요하다. 최근에는 이런 사전이 없어도 DNN을 활용하면 NLP를 수행할 수 있는 시대가 왔지만, 학습 데이터의 의존도가 매우 높아 학습 데이터에 없는 데이터에는 성능이 급격히 떨어지는 단점이 있다. 그래서 모든 단어의 정보를 포함한 full parsing에 대해 알고 있을 필요가 있다.

일단 작은 단위의 parsing부터 알아보자. dependency parsing은 정보를 주는 입장에서 정보를 받는 입장으로 arc를 이어주는 것이다. 이런 관계를 tree형태로 표현한 것이 Dependency Tree(D-tree)라 한다. 이 때 위와 같이 arc가 겹치지 않으면 projective한 tree라고 할 수 있는데,

위 그림과 같이 문장이 복잡해 arc가 겹치는 문장을 non-projective한 성질을 가진다고 하며, 분석에 어려움을 겪는다. 참고로 영어보다 한글이 non-projective한 경우가 훨씬 많다.

이제 parsing을 하는 방법을 알아볼텐데, parsing은 크게 2가지로 볼 수 있다.

첫번째는 아주 전통적인 방법인 Grammar-based parsing인데, 이런 parsing은 언어 전문가가 없이는 상당히 힘든 작업이고, 사실상 성능도 그렇게 좋지 못했다.

최근에는 Data-driven parsing 방법을 주로 도입한다. Data-driven parsing에는 Graph-based modelTransition-based model이 있다.

본 포스팅에서는 Graph-based model은 건너뛰고 Transition-based model에 집중한다.

Transition system은 현재 configuration을 계속해서 변경(transition)시키면서 terminal configuration에서 종료되는 시스템이다.

configuration은 stack / buffer / arc set이라는 data structure로 구성된다.

  • stack : LIFO특징을 가지는 자료 저장 구조 (↔ queue)
  • buffer : 남은 단어들을 기억하는 저장 공간이다. (queue로 구현)
  • arc set : arc로 연결된 노드의 튜플을 원소로하는 set (수학적인 set(집합)과 동일)

※ initial : buffer에 단어가 모두 들어가있는 상태, terminal : buffer가 비어있는 상태

Transition-based parsing은 앞서 언급했듯 terminal configuration에 도달하면 문장의 분석을 끝냈다고 할 수 있고, 그 결과를 D-tree로 출력하는 것이다. 중요한 것은 어떻게 initial에서 terminal까지 도달하게 하느냐인데, 이 때 간단한 action을 최대한 적게 사용해서 도달하게 해야 한다. 이 때 최적의 action을 선택할 Oracle(classifier)가 있으면 성공적인 결과를 낼 수 있을 것이고, 이 Oracle을 Machine Learning이 대신하게 된다.

위 그림은 transition-based parsing을 위한 notation을 보여준다. (Nivre 2003)

위 notation에서는 4개의 action(shift/reduce/right arc/left arc)가 존재한다. 예제를 한번 살펴보자.

현재 Arc set은 텅 비어있고, Stack에는 ROOT만 들어있다. (ROOT는 가상의 단어이다.)

ROOT는 가상의 단어이기 때문에 left/right arc action은 취할 수 없다. 사실상 Stack에도 텅 비어있다고 볼 수 있기 때문에 buffer에 있는 단어를 shift action을 통해서 stack에 담을 필요가 있다.

그래서 Economic을 stack에 집어넣었다. 일단 각 단어간의 dependency를 계산할 수 있다고 가정하면, Economic과 news, had ... 간의 dependency를 파악한 후 news→Economic으로 left arc가 만든 후 stack에서 economic을 빼 와야한다.

2번째 confidence가 완성 됐다. (C2) 다음 동작은 news를 stack에 넣고 dependency를 파악한 후

had와 news간의 left arc가 만들어져야한다.

반복하면


------------------------↑ 설명이 부족함. 강의 다시 돌려볼 것.-------------------------------

이렇게 하면 분석이 성공적으로 끝났는데, 이 모든 것은 사람이 직접 oracle의 역할을 잘 했기 때문이다. 







댓글 쓰기

0 댓글