구문 분석

문장에 품사를 부착한 후에는 품사들을 조금 더 큰 단위의 묶음, 즉 구문으로 묶을 수 있습니다.

이곳에서는 형태소 분석된 결과와 nltk:nltk.chunk.regexp.RegexpParser 를 이용하여 간단하게 한국어 문장에서 명사구, 동사구, 형용사구를 찾는 법을 살펴보도록 하겠습니다.

#! /usr/bin/python2.7
# -*- coding: utf-8 -*-

import konlpy
import nltk

# POS tag a sentence
sentence = u'만 6세 이하의 초등학교 취학 전 자녀를 양육하기 위해서는'
words = konlpy.tag.Twitter().pos(sentence)

# Define a chunk grammar, or chunking rules, then chunk
grammar = """
NP: {<N.*>*<Suffix>?}   # Noun phrase
VP: {<V.*>*}            # Verb phrase
AP: {<A.*>*}            # Adjective phrase
"""
parser = nltk.RegexpParser(grammar)
chunks = parser.parse(words)
print("# Print whole tree")
print(chunks.pprint())

print("\n# Print noun phrases only")
for subtree in chunks.subtrees():
    if subtree.label()=='NP':
        print(' '.join((e[0] for e in list(subtree))))
        print(subtree.pprint())

# Display the chunk tree
chunks.draw()

여기에서는 세 가지 구문 문법(chunk grammar)을 정의해보았습니다. 먼저, 명사가 연속적으로 등장한 후 접미사(suffix)가 선택적으로 붙은 경우를 명사구(NP)로 정의하였습니다. (목적에 따라, 또 어떤 형태소 분석기를 사용하느냐에 따라 이 문법 규칙은 바뀌어야겠죠.) 마찬가지 방식으로 동사구(VP)와 형용사구(AP)를 정의하였습니다.

결과물은 트리(tree) 형태로 콘솔에 출력하거나, 이미지로 출력할 수 있습니다.

  • 출력 결과:

    # Print whole tree
    (S
      (NP /Noun 6/Number /Noun 이하/Noun)
      /Josa
      (NP 초등학교/Noun 취학/Noun /Noun 자녀/Noun)
      /Josa
      (NP 양육/Noun)
      (VP 하기/Verb 위해서/Verb)
      /Eomi)
    
    # Print noun phrases only
     6  이하
    (NP /Noun 6/Number /Noun 이하/Noun)
    초등학교 취학  자녀
    (NP 초등학교/Noun 취학/Noun /Noun 자녀/Noun)
    양육
    (NP 양육/Noun)
    
  • chunking.png
    ../../_images/chunking.png