본문 바로가기
AI 관련/cs224n

CS224N Dependency Parsing (win 2021)

by 세계 최고의 AI Engineer_naknak 2023. 10. 6.

오랜만에 글을 쓰네요.. 요즘 정신이 없어서 ㅎㅎ...

본 포스팅은 cs224n 스터디를 하면서 필자가 공부한 내용을 기록하는 데에 의의가 있습니다!

혹시 틀리거나 보충하고 싶으신 (궁금하거나!) 내용은 댓글로 넣어주시면 대댓하겠습니다!

 

 cs224n 4번째 강의는 Dependency Parsing이라는 주제를 다루며 각 문장의 문법적인 구성이나 구문을 분석하는 과정인 pasing을 다루고 있습니다.

 

 

 

 

 

Pasing

- 각 문장의 문법적인 구성 또는 구문을 분석하는 과정을 의미합니다.

- 이를 통해 구문 분석 트리를 구성하는 과정도 포함되어 있습니다.

 

 

 

 

 

 

Constituency Parsing 

- 문장 분석을 하는 방법 중 하나로 본 강의에서는 context-free grammars 와 같다고 합니다.

 

(*CFGs 는 간략하게 말해서 문장에 있는 단어들의 관계를 나타내는, 언어의 문법을 규칙 세트로 정의한, 종속성 기반 표준 문법 정의라고 생각하시면 됩니다. i.e. S -> NP VP <문장 S는 명사구 NP와 동사구 VP로 이루어져 있다.> 다른 블로그 가보시면 G ( V T P S ) 해서 A -> x 면 뭐고 뭐다 라고 하는데 간단하게 생각해서 문장을 단어들 간의 관계로 나타낸 표준 문법이다. 라고 생각하시면 될 거 같아요. 

* 참고로 V : 비단말기호-일반적으로 쓰는 단어(고양이 등) T : 단말 기호-개념이 없는 단어(숫자 등) P : 생성 규칙(종속성이 생기는 규칙?) S : Start 라고 하네요. 출처는 스터디 조원이 알고 있습니다. )

 

- 각 단어는 문법적인 의미를 가지면서 단어끼리 결합해 어떤 구 phase를 구성한다. 이를 통해 문장의 구조를 파악하는 것이 목적이라고 하네요. (* 문장 -> 구 -> 단어 <문법적인 의미를 가짐>) 이 과정으로 분해가 가능합니다.

이런 식으로 단어에 문법적인 의미를 부여하고 구를 만들고 구를 더 큰 구로 합쳐서 문장 구조를 파악할 수 있게 됩니다.

 

 

 

 

 

Dependency Parsing

본 강의의 주요 골자라고 생각하시면 됩니다. 이 친구는 단어 간의 의존 관계를 파악해서 문장 구조를 파악하는 방법입니다.

보시는 것처럼 dependency 구조는 한 단어가 다른 단어에 어떻게 의존하는 지를 보는 방식입니다.

이쪽 부분이 헷갈렸는데 나중에 보겠지만 화살표를 주는 부분을 head(수식을 해준다, 종속을 받는 쪽, 해당 단어가 화살표를 주는 단어에 어떠한 성격, 상태를 준다) 라고 생각하시면 되고 화살표를 받는 쪽이 modifier(수식을 받는다, 종속이 되는 쪽) 라고 생각하시면 됩니다.

Look ---> crate 

 

이렇게 2가지로 각 문장의 문법적인 구성 또는 구문을 분석을 하는 parsing 과정, structure를 확인 할 수 있었습니다.

 

 

 

 

 

문장 구조를 사용하는 이유 

사람은 뜻을 전달할 때 단어를 나열하고 그 단어의 나열에서 연결 관계를 통해서 전달 합니다. 뜻이 복잡하고 커질수록 문장은 더 복잡해지겠죠.

 

그러나 문장 중에는 뜻이 ambiguity 모호한 구조가 많기 때문에 컴퓨터가 이런 복잡한 문장의 뜻을 제대로 파악하려면 문장 구조 분석이 필수적이라는 것을 전달하고자 한 게 아닐까 생각이 됩니다. 왜냐면 ambiguity 를 보여준 후 Dependency paths를 보여 주면서 문장 내에 단어 간의 관계 tree를 보여 주셨거든요.

 

 

 

 

 

Dependency Grammar and Dependency Structure

요약하자면 문장 내에 단어 사이의 관계를 나타내는 Dependency Structure 이고 거기에 Dependency Grammar 를 추가한 Tree 입니다. 아까 위에서 언급 했듯이 화살표가 출발하는 부분을 head 라고 하며 가리키는 방향은 modifier 혹은 dependent라고 합니다. 보시면 submitted 가 bills에 제출되었다는 상태를 부여하는, 수식을 해주는, 종속을 받는 것을 확인 할 수 있죠.

 

 

 

 

 

Dependency Parsing

여기서 projectivity 한 문장과 non-projectivity 한 문장으로 나뉘는데 그 기준은 간단합니다.

(좌) projectivity (우) non-projectivity

(* Dependency 구조를 만들 때 fake Root를 추가하여 모든 단어가 무언가에 dependent하도록 한다. 네 그렇다고 하네요)

 

네, 관계를 나타내는 저 화살표가 다른 화살표에 겹치게 되면 non-projectivity라고 합니다.

이쪽에서 나왔던 질문이 저 겹치는 것이 어떤 영향을 끼치길래 non-projectivity라고 분류하고 parser 성능과 정확도에 큰 영향을 미치는가? 였습니다. 

GPT 한테 물어봤습니다. 

  • Projective Parsing: 의존 관계에서 화살표가 서로 교차하지 않는 경우를 말합니다. 즉, 단어 사이의 의존성이 문장에서 연속적인 단어 그룹(구)을 형성합니다.
  • Non-Projective Parsing: 화살표가 서로 교차하는 경우로, 이는 특정 단어가 문장에서 멀리 떨어진 다른 단어와 의존 관계를 가지고 있음을 의미합니다.

네 그렇습니다. 중요한 건 저 화살표가 겹친다는 게 특정 단어가 문장에서 멀리 떨어진 다른 단어와 의존 관계를 가지고 있음을 의미하는 거였습니다. 그리고 화살표가 겹친다는 건 구문적 모호성의 한 형태를 나타낼 수 있다고 합니다. 그래서 현대 NLP에서 언어적 특성(모호성)을 잘 다루기 위해서 이 두 가지 구조를 구분해서 이해하고 처리할 필요가 있다고 합니다. 그리고 처리할 때의 알고리즘이 다르다고도 하네요.

 

 

 

 

 

Dependency Parsing 방법

총 4가지가 있는데 본 강의에서 중요하게 다룬 Transition based parsing에 대해서만 살펴보도록 하겠습니다.

Transition based parsing은 두 단어의 의존여부를 순서대로 결정해서 점진적으로 dependency structure를 구성해나가는 방법이라고 합니다.

일단 로직만 보면 이렇게 생겼습니다. 

TBP(Transition Based Parsing)는 pasing 과정에서 Buffer, Stack, Set of Arcs 라는 3가지 구조를 가지고 있습니다.

Buffer은 B, Stack은 σ, Arcs 는 A로 표기 됩니다. 

  • stack (): ROOT symbol로 시작
  • buffer (): 입력 문장으로 시작
  • dependency arc 집합 (): 비어있는 상태로 시작

의 역할을 가집니다.

그래서 이 구조를 통해 어떤 State를 생성하게 됩니다. 이 State를 모델(SVM 등등)에 넣어서 어떤 Action을 취할 것인지 예측하도록 합니다. 예시를 보면 다음과 같습니다.

 

Shift 를 통해 Stack에 Buffer 에 저장된 데이터(모든 입력 문장 토큰화된 상태로 들어갑니다)가 이동하게 됩니다.

 

 

그래서 두 단어의 의존성을 판단해서 왼쪽으로, 혹은 오른쪽으로 관계를 예측한 뒤 Arcs에 추가합니다.

이렇게 하면 Dependency Structure가 Arcs에 남게 되겠죠?

 

이러한 Action을 어떻게 예측하느냐? 

고전적인 방법으로는 저기 단어들 + 품사 + 관계들을 one hot encoding으로 벡터화 예측 모델에 넣었습니다. 이렇게 하면 벡터가 sparse 해져서 비효율적이다. 라는 문제점이 있었죠. 

 

그래서 나온게 A neural dependency parser [Chen and Manning 2014] 입니다. 저 one hot encoding, Indicator Features를 dense한 벡터로 변경해서 ML에 넣는게 아니라 Deep Learning으로 예측을 하는 것이죠. 결과는 DL이 SOTA를 달성했다고 합니다. 해당 내용은 강의에서 다루지는 않고 아마 Assignment를 진행하시거나 추가 공부를 원하시는 분들이 진행할 듯 합니다. 

 

Parsing은 현재 문장의 구문을 해석하여 컴퓨터가 문장의 의미를 제대로 파악할 수 있도록 하는 방법으로 BERT, Copilot 등 여러 모델에서 사용되는 개념입니다. NLP Engineer라면 한번쯤 짚고 넘어가야 할 중요한 개념인듯 합니다.

 

참고 블로그와 강의 Site 입니다.

 

 

https://velog.io/@tobigs-text1415/Lecture-5-Linguistic-Structure-Dependency-Parsing#3-transition-based-dependency-parsing

https://enjoythehobby.tistory.com/entry/Lec-4-Dependency-Parsing

Video: https://youtu.be/PSGIodTN3KE?list=PLoROMvodv4rOSH4v6133s9LFPRHjEmbmJ

 

'AI 관련 > cs224n' 카테고리의 다른 글

CS224N Language Models and Recurrent Neural Networks (win 2021)  (0) 2023.10.11

댓글