구문 분석¶
문장에 품사를 부착한 후에는 품사들을 조금 더 큰 단위의 묶음, 즉 구문으로 묶을 수 있습니다.
이곳에서는 형태소 분석된 결과와 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)