딥러닝/NLP

한국어 임베딩 - 한국어 전처리

eunsour 2022. 9. 24.
반응형

 이 장에서는 임베딩 학습을 위한 한국어 데이터의 전처리 과정을 다룬다. 형태소 분석 방법에는 국어학 전문가들이 태깅한 데이터로 학습된 모델로 분석하는 지도 학습(supervised learning) 기법과 우리가 가진 말뭉치의 패턴을 학습한 모델을 적용하는 비지도 학습(unsupervised learning) 기법이 있다. 

 

지도 학습 기반 형태소 분석 

 품질 좋은 임베딩을 만들기 위해서는 문장이나 단어의 경계를 컴퓨터에 알려줘야 한다. 그렇지 않으면 어휘 집합에 속한 단어 수가 기하급수적으로 늘어나서 연산의 비효율이 발생한다. 특히 한국어는 조사와 어미가 발달한 교착어(agglutinative language)이기 때문에 이러한 처리를 좀 더 섬세히 해줘야 한다. 예를 들어 한국어 동사 [가다]는 다음과 같이 문맥에 따라 다양하게 활용될 수 있다.

 

한국어 동사 '가다'의 활용

 

 위 그림에 있는 활용형을 모두 어휘 집합에 넣는다면 어휘 집합에 속한 단어 수는 총 2개가 된다. 이 방식의 문제는 새로운 활용형이 나타날 때마다 어휘 집합을 계속 늘려야 한다는 점에 있다. [가겠더라, 가다] 라는 활용형도 말뭉치에 존재한다면 어휘 집합을 4개로 해야 한다. 이를 해결하기 위해 형태소 분석 기법을 사용해본다. 

형태소 분석 결과

 

 위 그림처럼 형태소를 분석한 뒤 각 형태소들을 단어로 취급한다면 어휘 집합은 총 4개가 된다. 여기에 [가겠더라]라는 활용형이 말뭉치에 추가됐다고 가정해보자. [가겠더라][가,겠,더라]로 분석된다. 따라서 우리는 어휘 집합을 수정하지 않고도 [가겠더라]라는 활용형을 처리할 수 있게 된다. 마찬가지로 우리는 [가, 다]로 분석되는 [가다] 역시 어휘 집합 추가 없이 처리할 수 있다.

 

 교착어인 한국어는 한정된 종류의 조사와 어미를 자주 이용하기 떄문에 각각에 대응하는 명사, 용언(형용사, 동사), 어간만 어휘 집합에 추가하면 취급 단어 개수를 꽤 줄일 수 있다. 형태소 분석기만 잘 활용해도 자연어 처리의 효율성을 높일 수 있다. 

 

 태깅(tagging)이란 아래처럼 모델 입력과 출력 쌍을 만드는 작업을 가리킨다. 이 모델들은 문자열이 주어졌을 때 사람이 알려준 정답 패턴에 최대한 가깝게 토크나이즈한다. 

  • 입력 : 아버지가방에들어가신다
  • 출력 : 아버지, 가, 방, 에, 들어가, 신다

 

KoNLPy 사용법

 KoNLPy은전한닢, 꼬꼬마, 한나눔, Okt, 코모란 등 5개 오픈소스 형태소 분석기를 파이썬 환경에서 사용할 수 있도록 인터페이스를 통일한 한국어 자연어 처리 패키지다. 

# prerequisite
pip install --upgrade pip
pip install -q konlpy
!bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

은전한닢 분석기 사용법
은전한닢 품사 정보 확인

 

 꼬꼬마, 한나눔, Okt 등 KoNLPy에 속한 다른 형태소 분석기의 사용법은 tokenizer의 선언 외에는 은전한닢과 동일하다. 

 

from typing import Optional
from konlpy.tag import Okt, Komoran, Mecab, Hannanum, Kkma

def get_tokenizer(tokenizer_name: Optional[str]=None):
    if tokenizer_name == "komoran":
        tokenizer = Komoran()
    elif tokenizer_name == "okt":
        tokenizer = Okt()
    elif tokenizer_name == "mecab":
        tokenizer = Mecab()
    elif tokenizer_name == "hannanum":
        tokenizer = Hannanum()
    elif tokenizer_name == "kkma":
        tokenizer = Kkma()
    else:
        tokenizer = Mecab()
    return tokenizer

# 꼬꼬마 사용 예시
tokenizer = get_tokenizer("kkma")
tokenizer.morphs("아버지가방에들어가신다")
tokenizer.pos("아버지가방에들어가신다")

# 결과
[('아버지', 'NNG'),
 ('가방', 'NNG'),
 ('에', 'JKM'),
 ('들어가', 'VV'),
 ('시', 'EPH'),
 ('ㄴ다', 'EFN')]

 

KoNLPy 내 분석기 별 성능 차이 분석

 KoNLPy에서는 분석기별 성능 정보 역시 제공하고 있다. 아래 코드는 '소녀시대 - 다시 만난 세계' 가사의 일부를 이용하여 각 분석기 별 분석 결과와 소요 시간을 나타내고 있다. 짧은 문장이라 한나눔을 제외하고는 크게 도드라지는 성능 차이는 나타내고 있지 않지만, 은전한닢의 수행 시간이 가장 빠른 것을 확인할 수 있다. 

 

import time

tokenizer_lst = ['komoran', 'okt', 'mecab', 'hannanum', 'kkma']

for tag in tokenizer_lst:
    start = time.time()
    
    tokenizer = get_tokenizer(tag)
    pos = tokenizer.pos("사랑해널이느낌이대로그려왔던헤매임의끝이세상속에서반복되는슬픔이젠안녕")
    
    print(f">> tokenizer : {tag}")
    print(f"분석 결과 : {pos}")
    print(f"수행 속도 : {round(time.time() - start, 2)} 초\n")

 

 밑의 그림은 KoNLPy에서 제공하는 10만 문자의 문서를 분석하는데 소요되는 시간을 가리킨다. 은전한닢이 다른 분석기 대비 속도가 빠른 것을 확인할 수 있다. 좀 더 자세한 내용은 KoNLPy 품사 태깅 클래스 간 비교에서 확인할 수 있다. 

 

문자 개수 대비 실행 시간 (출처 : KoNLPy)

 

 속도만큼 중요한 지표가 형태소 분석 품질이다. 어떤 형태소 분석기를 사용할지는 자신이 가진 데이터로 시험 삼아 형태소 분석을 해보고 속도나 품질을 비교해서 고르는 것이 좋다. 

 

Khaiii 사용법

 khaiii(Kakao Hangul Analyzer III)는 카카오가 2018년 말 공개한 오픈소스 한국어 형태소 분석기다. 세종 코퍼스를 이용해 CNN 모델을 적용해 학습했다. 네트워크 구조는 다음과 같다. 

 

khaiii 네트워크 구조

 

 입력 문장을 문자 단위로 읽어 들인 뒤 컨볼루션 필터가 이 문자들을 슬라이딩해 가면서 정보를 추출한다. 이 네트워크의 말단 레이어에서는 이렇게 모은 정보들을 종합해 형태소의 경계와 품사 태그를 예측한다. GPU 없이도 형태소 분석이 가능하며 실행 속도 역시 빠르다고 한다. khaiii의 빌드 및 설치는 여기에서 확인할 수 있다. 

 

 

비지도 학습 기반 형태소 분석

 위의 지도 학습 기법은 언어 전문가들이 직접 형태소 경계나 품사 정보를 모델에 가르쳐줘서 학습된 모델들이다. 이와 달리 비지도 학습 기법들은 데이터의 패턴을 모델 스스로 학습하게 함으로써 형태소를 분석하는 방법이다. 데이터에 자주 등장하는 단어들을 형태소로 인식한다.

 

 

soynlp 형태소 분석기

 soynlp는 형태소 분석, 품사 판별 등을 지원하는 파이썬 기반 한국어 자연어 처리 패키지다. 데이터 패턴을 스스로 학습하는 비지도 학습 접근법을 지향하기 때문에 하나의 문장 혹은 문서에서보다는 어느 정도 규모가 있으면서 동질적인 문서 집합(homogeneous documents)에서 잘 작동한다. 

 

 soynlp 패키지에 포함된 형태소 분석기는 데이터의 통계량을 확인해 만든 단어 점수 표로 작동한다. 단어 점수는 크게 응집 확률(Cohesion Probability)과 브랜칭 엔트로피(Branching Entropy)를 활용한다. 주어진 문자열이 유기적으로 연결돼 함께 자주 나타나고(응집 확률이 높을 때), 그 단어 앞뒤로 다양한 조사, 어미 혹은 다른 단어가 등장하는 경우(브랜칭 엔트로피가 높을 때) 해당 문자열을 형태소로 취급한다. 

 

 예를 들어 말뭉치에서 [꿀잼]이라는 단어가 연결돼 자주 나타났다면 [꿀잼]을 형태소라고 본다(응집 확률이 높음). 한편 [꿀잼] 앞에 [영화], [정말], [너무] 등 문자열이, 뒤에 [ㅋㅋ], [ㅎㅎ], [!!] 등 패턴이 다양하게 나타났다면 이 역시 [꿀잼]을 형태소로 취급한다(브랜칭 엔트로피가 높음). 

 

 soynlp의 형태소 분석기는 말뭉치의 통계량을 바탕으로 하기 때문에 별도의 학습 과정을 거쳐야 한다. 말뭉치의 분포가 어떻게 돼 있는지 확인하고 단어별로 응집 확률과 브랜칭 엔트로피 점수표를 만드는 절차가 필요하다.

 

 

구글 센텐스피스

 센텐스피스(sentencepiece)는 구글에서 공개한 비지도 학습 기반 형태소 분석 패키지다. 바이트 페어 인코딩(BPE, Byte Pair Encoding) 기법 등을 지원한다. 

 

 BPE의 기본 원리는 말뭉치에서 가장 많이 등장한 문자열을 병합해 문자열을 압축하는 것이다.

  • aaabdaaabac

이 문자열에서 [aa]가 가장 많이 나타났다. 이를 [Z]로 치환하면 원래 문자열을 다음과 같이 압축할 수 있다. 

  • ZabdZabac

 위 문자열을 또 한 번 압축할 수 있다. [ab]가 가장 많이 나타났으므로 이를 [Y]로 치환한다.

  • ZYdZYac

 

 자연어 처리에서 BPE가 처음 쓰인 것은 기계 번역 분야다. Sennrich et al. (2015)은 BPE 알고리즘을 적용해 토크나이즈를 수행했다. BPE를 활용해 토크나이즈하는 메커니즘의 핵심은 다음과 같다. 우선 원하는 어휘 집합 크기가 될 때까지 반복적으로 고빈도 문자열들을 병합해 어휘 집합에 추가한다. 이것이 BPE 학습이다. 

 

 학습이 끝난 이후의 예측 과정은 이렇다. 문장 내 각 어절(띄어쓰기로 문장을 나눈 것)에 어휘 집합에 있는 서브워드가 포함돼 있을 경우 해당 서브워드를 어절에서 분리한다(최장 일치 기준). 이후 어절의 나머지에서 어휘 집합에 있는 서브워드를 다시 찾고, 또 분리한다. 어절 끝까지 찾았는데 어휘 집합에 없으면 미등록 단어(unknown word)로 취급한다. 

 

 BERT(Devlin et al., 2018) 모델은 BPE로 학습한 어휘 집합을 쓴다. BPE는 문자열 기반의 비지도 학습 기법이기 때문에 데이터만 확보할 수 있다면 어떤 언어에든 적용이 가능하다. 

 

 

요약

  • 지도 학습 기반의 형태소 분석 모델은 언어학 전문가들이 태깅한 형태소 분석 말뭉치로부터 학습된 기법들이다. 이 모델들은 문자열이 주어졌을 때 사람이 알려준 정답 패턴에 최대한 가깝게 토크나이즈한다. KoNLPy, Khaiii 등이 이 부류에 속한다.
  • 비지도 학습 기반의 형태소 분석 모델은 데이터의 패턴을 모델 스스로 학습하게 함으로써 형태소를 나누는 기법이다. 데이터에 자주 등장하는 단어들을 형태소로 인식한다. soynlp, 구글 센텐스피스 등이 이 부류에 속한다. 

 

 

Reference

 
한국어 임베딩
저자 : 이기창
감수 : NAVER Chatbot Model
출판 : 에이콘출판사
발매 : 2019.09.26

 

 

형태소 분석 및 품사 태깅 — KoNLPy 0.5.2 documentation

형태소 분석 및 품사 태깅 형태소 분석 이란 형태소를 비롯하여, 어근, 접두사/접미사, 품사(POS, part-of-speech) 등 다양한 언어적 속성의 구조를 파악하는 것입니다. 품사 태깅 은 형태소의 뜻과 문

konlpy.org

 

GitHub - kakao/khaiii: Kakao Hangul Analyzer III

Kakao Hangul Analyzer III. Contribute to kakao/khaiii development by creating an account on GitHub.

github.com

 

 

반응형

댓글