[python] NLTK를 사용해 문맥 자유 문법을 분석하는 방법은 무엇인가요?

NLTK는 자연어 처리를 위한 파이썬 라이브러리로, 많은 기능을 제공합니다. 이 중에서도 NLTK는 문맥 자유 문법 분석에 유용한 기능을 제공합니다.

먼저, NLTK를 사용하기 위해 nltk 모듈을 import합니다:

import nltk

NLTK에서 제공하는 기본적인 CFG 분석 도구를 사용하기 위해 nltk.CFG 클래스와 nltk.ChartParser 클래스를 import합니다:

from nltk import CFG, ChartParser

이제 분석할 문법을 작성합니다. 문법은 규칙(rule)의 집합으로 구성됩니다. 각 규칙은 특정 심볼(symbol)의 형태를 정의합니다. 심볼은 단어 또는 문법 내에서 사용되는 토큰입니다.

예를 들어, 간단한 문법을 작성해보겠습니다:

grammar = CFG.fromstring("""
    S -> NP VP
    NP -> DET N
    VP -> V NP
    DET -> 'the' | 'a'
    N -> 'cat' | 'dog'
    V -> 'chased' | 'bit'
""")

이제 문법을 사용하여 문장을 분석해보겠습니다. ChartParser 클래스를 사용하여 문장을 파싱합니다:

parser = ChartParser(grammar)
sentence = "the cat chased the dog"
parsed_sentences = parser.parse(sentence.split())

ChartParser.parse() 메서드는 입력 문장을 분석하고, 가능한 모든 파싱 트리를 반환합니다. 반환된 파싱 트리를 순회하며 원하는 정보를 추출할 수 있습니다.

예를 들어, 첫 번째 파싱 트리의 구조를 확인해보겠습니다:

for tree in parsed_sentences:
    print(tree)
    tree.pretty_print()
    break

출력 결과:

``` (S (NP (DET the) (N cat)) (VP (V chased) (NP (DET the) (N dog)))) S __| | VP | __|_ NP | NP |__ | __| DET N V DET N | | | | | the catch