본문 바로가기
TIL _Today I Learned/2024.09

[DAY 50] 구문 분석 (Syntactic Parsing)

by gamdong2 2024. 9. 25.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.09.25

📕 학습 목록

  • 구문 분석
  • 형태소 분석
  • spaCy, KoNLPY

 

📗 기억할 내용

1. 구문 분석 (Syntactic Parsing)

1) 한국어 구문 분석 기본 개념

 

① 형태소 분석 (Morphological Analysis)

  • 문장을 구성하는 단어들을 최소 의미 단위인 형태소로 분해하는 과정
  • 한국어에서는 어미, 접사 등의 형태소가 중요한 역할

② 의존 구문 분석 (Dependency Parsing)

  • 문장의 각 단어가 어떤 다른 단어에 의존하는지 분석하는 방법
  • 주어, 목적어, 서술어 등 문장 성분의 관계를 분석하여 문장의 의미적 구조를 파악

③ 문장 성분의 역할

  • 주어(SUBJ), 서술어(VERB), 목적어(OBJ)와 같은 문장 성분들이 문장에서 어떤 역할을 하는지 분석
  • 이러한 성분들은 문장의 의미를 이해하는 데 필수적인 정보

 

2) 자연어 처리 라이브러리 활용

 

① spaCy와 KoNLPy를 이용한 한국어 구문 분석

  • 한국어 구문 분석에서 두 라이브러리를 사용하여 형태소 분석, 의존 구문 분석을 구현
  • spaCy는 다양한 자연어 처리 작업에 유용한 구조화된 도구들을 제공
  • KoNLPy는 한국어 전용 형태소 분석을 지원하는 도구

② Token 객체의 속성 분석

  • text: 토큰(단어) 자체의 텍스트
  • dep_: 해당 토큰의 의존 관계 (예: 주어, 목적어 등)
  • head: 해당 토큰이 의존하는 지배소
  • lemma_: 형태소 분석을 통해 얻은 원형(어근)
  • tag_: 단어의 품사 정보
  • is_stop: 해당 토큰이 불용어인지 여부 확인

③ 토큰의 의존 관계와 지배소 확인 방법

  • 문장 내 토큰 간의 의존 관계를 분석하고, 각 토큰이 어느 지배소에 의존하는지 확인
  • 이를 통해 문장의 전체 구조를 이해하고 분석 결과를 해석할 수 있음

 

3) 구문 트리 시각화

 

① 구문 분석 결과 시각화 방법 (displacy 사용)

  • spaCy의 displacy 도구를 사용하여 구문 분석 결과를 트리 형태로 시각화할 수 있음
  • 각 토큰 간의 의존 관계를 그래픽적으로 표현하여 직관적으로 문장 구조를 이해할 수 있음

② 토큰의 품사(POS Tagging) 시각화

  • 토큰마다 해당 품사 정보를 태깅하고, 이를 시각적으로 나타내는 방법
  • 명사, 동사, 형용사 등 각 품사에 따른 구문 분석 결과를 쉽게 파악할 수 있음

 

4) 정오답 분석 시스템 구현

 

① 문제 자동 생성 프로그램

  • 구문 분석을 활용하여 퀴즈 문제를 자동으로 생성하고, 사용자가 입력한 답에 대한 정오답 여부를 판별
  • 정답 확인뿐 아니라, 틀린 답에 대한 해설을 제공하여 학습을 도움

② 로그 기록 시스템

  • 사용자의 입력 데이터(답안), 정답 여부, 문제를 푼 시간, 출제된 문제 정보를 기록
  • 로그를 분석하여 사용자의 학습 진행 상황을 추적할 수 있음

 

5) 구문 분석을 통한 자연어 처리 응용

 

① 문장의 의존 관계를 통한 의미 분석

  • 구문 분석을 통해 각 문장 성분이 문장에서 어떤 의미적 역할을 수행하는지 분석
  • 주어, 목적어, 서술어 간의 관계를 이해함으로써 문장의 전체 의미를 추출

② 형태소 분석 결과를 활용한 키워드 추출

  • 형태소 분석을 통해 중요한 단어(키워드)를 추출하고, 이를 기반으로 텍스트의 핵심 내용을 요약할 수 있음

③ 불용어 처리 및 형태소 기반 구문 분석 응용

  • 불용어(의미가 크지 않거나 자주 등장하는 단어)를 제거한 후, 형태소 분석을 통해 중요한 정보를 얻음
  • 문장 구조를 바탕으로 의미 있는 정보만을 추출하여 다양한 자연어 처리 응용 분야에 활용 가능

 

📘 코드 실습

  • 구문 분석
# 구문 분석(Syntactic Parsing): 문법적 구조에 따라 자연어를 분해하고 분석하는 과정
# 주요 라이브러리: spacy, nltk, ckonlpy (KoNLPy의 확장 버전)

import spacy
from spacy import displacy
import nltk
from ckonlpy.tag import Twitter

# 1. spaCy를 이용한 한국어 구문 분석

# 한국어 처리 모델 로드 ('ko_core_news_sm'은 한국어 소형 모델)
nlp = spacy.load('ko_core_news_sm')

# 문장 분석
doc = nlp('이것은 한국어로 된 문장입니다')

# 토큰 속성 확인: text(단어), dep_(의존관계), head(지배소), lemma_(원형), tag_(품사), is_stop(불용어 여부)
for token in doc:
    print(token.text, token.dep_, token.head.text, token.lemma_, token.tag_, token.is_stop)

# 의존 관계를 시각적으로 표시 (Jupyter 환경에서)
displacy.render(doc, style='dep', jupyter=True)

# 2. KoNLPy의 확장 버전인 ckonlpy를 사용하여 한국어 고유 명사 처리 및 구문 분석

# KoNLPy 기반의 Twitter 형태소 분석기 사용
tokenizer = Twitter()

# 입력 텍스트 (구문 분석 대상 문장)
target_text = '신카이 마코토의 작화와, 미유와 하나카나가 연기를 잘해줘서 더 대박이었다.'

# 형태소 분석 결과 확인 (고유 명사로 처리되지 않은 기본 형태)
print(tokenizer.pos(target_text))

# 고유 명사 등록 (예: '미유', '하나카나'는 이름이므로 명사로 처리)
tokenizer.add_dictionary(['미유', '하나카나'], 'Noun')

# 형태소 분석 결과 재확인 (고유 명사로 등록된 후)
print(tokenizer.pos(target_text))

# 3. nltk를 사용한 구문 분석 규칙 정의 및 처리

# 구문 분석 규칙 정의: 명사구(NP), 동사구(VP), 형용사구(AP)를 정의
grammar = '''
    NP: {<N.*>*<Suffix>?}  # 명사구
    VP: {<V.*>*}           # 동사구
    AP: {<A.*>*}           # 형용사구
'''

# nltk의 RegexpParser를 사용하여 구문 분석기 생성
parser = nltk.RegexpParser(grammar=grammar)

# 구문 분석 실행 (정의된 규칙에 따라 텍스트 구문 분석)
chunks = parser.parse(tokenizer.pos(target_text))

# 구문 분석 결과 출력
print(chunks)

 

 

📙 내일 일정

  • TF-IDF 학습