NLP/Embedding

부분구문분석(청크나누기, Chunking)

데이터 세상 2023. 7. 18. 13:48

부분구문분석(청크나누기, Chunking)

부분구문분석(shallow parsing) = 청크나누기(Chunking)

 

  • 명사, 동사, 형용사와 같은 문법 요소로 구성된 고차원의 단위를 유도해 내는 것
  • 사전 훈련된 품사태깅 모델이 존재함

 

여러 개의 품사로 구(pharase)를 만드는 것을 chunking이라 하고, 이 구(pharase)를 chunk라 합니다.

문장을 각 품사로 구분하고, Chunking에 의해 구로 구분하면 문장의 의미를 파악하기 용이해 집니다.

문장에서 (DT + JJ + NN), (DT + JJ + JJ + NN), (JJ + NN), 등의 시퀀스는 모두 명사구 (NP : Noun phrase)로 판단합니다.

 

겹치는 위치에서 태그 패턴이 일치하는 경우 가장 왼쪽 일치가 우선합니다.

 

spaCy을 활용한 chunking

import spacy
nlp = spacy.load('en')
doc = nlp(u"Mary slapped the green witch.")
for chunk in doc.noun_chunks:
  print('{} -> {}'.format(chunk, chunk.label_))
Mary -> NP
the green witch -> NP

 

정규식을 활용한 chunking

부분구문분석(chunking)모델 훈련에 사용될 데이터가 없다면, 정규식을 활용하여 부분구문분석을 진행할 수 있습니다.

nltk에서 RegexpParser를 사용할 수 있다고 합니다.

 


Chunk 구조 - IOB Tags

Chunk내의 각 품사의 위치에 따라 B (Begin), I (Inside), O (Outside)를 붙입니다. (chunk tag).

B-NP는 NP chunk의 시작 부분을 의미하고, I-NP는 NP chunk의 내부 부분을 의미합니다.

Chunk 구조는 IOB tags로 표현할 수도 있고, 트리 구조로 표현할 수도 있습니다.

 

NLTK 트리 구조

 

Clause(절)

문법에 clause (절)를 정의하면 문장을 아래와 같이 분석 (chunking) 할 수 있습니다.

Recursion in Linguistic Structure

grammar = r"""
NP: {<DT|JJ|NN.*>+} # Chunk sequences of DT, JJ, NN
PP: {<IN><NP>} # Chunk prepositions followed by NP
VP: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
CLAUSE: {<NP><VP>} # Chunk NP, VP
"""
cp = nltk.RegexpParser(grammar)
sentence = [("Mary", "NN"), ("saw", "VBD"), ("the", "DT"), ("cat", "NN"),
("sit", "VB"), ("on", "IN"), ("the", "DT"), ("mat", "NN")]
print(cp.parse(sentence))
(S (NP Mary/NN) saw/VBD (CLAUSE (NP the/DT cat/NN) (VP sit/VB (PP on/IN (NP the/DT mat/NN)))))

 

cp = nltk.RegexpParser(grammar, loop=2)
print(cp.parse(sentence))

 

(S (NP John/NNP) thinks/VBZ (CLAUSE (NP Mary/NN) (VP saw/VBD (CLAUSE (NP the/DT cat/NN) (VP sit/VB (PP on/IN (NP the/DT mat/NN)))))))

RegexpParser()에 loop = 2를 지정하면 아래와 같이 clause 안에 또 다른 clause를 재귀적(recursion)으로 분석합니다.

이와 같이 문장에 맞게 트리를 깊게 구성하는 것을 cascaded chunking (계단식 chunk) 이라 합니다.


Chinking

특정 부분을 chunk 밖으로 빼내는 것을 chinking이라고 합니다. Chink는 문장에서 chunk를 제외한 나머지 부분을 의미합니다.

문장 전체를 chunk로 정의하고, 특정 부분을 chinking하면 나머지 부분이 chunk가 됩니다.

Chinking을 이용해서 Chunking을 할 수도 있습니다.

 


References

반응형

'NLP > Embedding' 카테고리의 다른 글

[NLP] Doc2Vec  (0) 2021.04.08
[NLP] Word2Vec  (0) 2021.03.12
[NLP] Word Embedding  (0) 2021.03.11