250x250
Notice
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Today
Total
관리 메뉴

serendipity

지도 & 비지도 학습 본문

Study/AI

지도 & 비지도 학습

z 2021. 7. 10. 22:32
728x90

들어가기에 앞서 ...

임베딩 학습용 말뭉치는 라인 하나가 문서면 좋습니다.

한국어 위키백과, KorQuAD, 네이버 영화 리뷰 말뭉치 등을 이같이 전처리하였습니다.

 

 형태소 분석 방법

국어학 전문가들이 태깅한 데이터로 학습된 모델을 분석하는 지도 학습 기법

가지고 있는 말뭉치의 패턴을 학습한 모델을 적용하는 비지도 학습 기법 등이 있다.

 

 

 지도 학습이란? 

: 정답이 있는 데이터의 패턴을 학습해 모델이 정답을 맞도록 하는 기법

 

  1) 분류(Classification)

분류는 주어진 데이터를 정해진 카테고리(라벨)에 따라 분류하는 문제를 말한다. darknet의 YOLO, network architecture GoodLe Net for image classification을 이용하여 이미지를 분류한다. 분류는 맞다, 아니다 등의 이진 분류 문제 또는 사과다 바나나다 포도다 등의 2가지 이상으로 분류하는 다중 분류 문제가 있다. 예를 들어 입력 데이터로 메일을 주고 라벨을 스팸메일이다, 아니다 를 주면 모델은 새로운 메일이 들어올 때 이 메일이 스팸인지 아닌지 분류를 할 수 있게 된다.

 

    2) 회귀(Regression)

회귀는 어떤 데이터들의 Feature를 기준으로, 연속된 값(그래프)을 예측하는 문제로 주로 어떤 패턴이나 트렌드, 경향을 예측할 때 사용된다. 즉 답이 분류 처럼 1, 0이렇게 딱 떨어지는 것이 아니고 어떤 수나 실수로 예측될 수 있다. 예를 들어 서울에 있는 20평대 아파트 집값 가격, 30평대 아파트 가격, 지방의 20평대 아파트 가격등을 입력데이터로 주고 결과를 주면, 어떤 지역의 30평대 아파트 가격이 어느정도 인지 예측할 수 있게 된다. 

 

지도 학습 기반의 형태소 분석은 언어 전문가들이 직접 형태소 경계나 품사 정보를 모델에 가르쳐줘서 학습된 모델이다.

* 태깅(tagging) 이란 모델 입력과 출력 쌍을 만드는 작업 (입력 : 아버지가 방에 들어가신다 / 출력 : 아버지, 가,방,에, 들어가,신다)

 

1. KoNLPy 

은전한닢, 꼬꼬마,한나눔,Okt,코모란 등 5개 오픈소스 형태소 분석기를 파이썬 환경에서 사용할 수 있도록 인터페이스를 통일한 한국어 자연어 처리 패키지다. C++, 자바 등 각기 다르 언어로 개발된 오픈소스들을 한군데에 묶어 쉽게 사용할 수 있도록 돕는다.

 

(다음 코드들은 모두 파이썬 인터프리터 환경에서 실행해야 합니다.)

from konlpy.tag import Mecab
tokenizer = Mecab()
tokenizer.morphs('아버지가방에들어가신다')

>>> 실행 결과 : ['아버지가','가','방','에','들어가','신다']

 

형태소 분석기의 사용법은 5개 동일하다. 단, 처음 tokenizer를 선언할 때만 다르게 해주면 된다.

#예시를 보여주기 위해 작성한 get_tokenizer 함수
def get_tokenizer(tokenizer_name):
	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

 

KoNLPy에서는 분석기별 성능 정보 역시 제공하고 있다.

로딩 시간이란 분석기가 사용하는 사전 로딩을 포함해 형태소 분석기 클래스를 읽어 들이는 시간을 뜻한다.

실행 시간이란 10만 문자의 문서를 분석하는 데 소요되는 시간을 가리킨다.

 

 

2.Khaiii

카카오가 2018년 말 공개한 오픈소스 한국어 형태소 분석기다. 국립 국어원이 구축한 세종코퍼스를 이용해 CNN 모델을 적용해 학습했다.입력 문장을 문자 단위로 읽어 들인 뒤 컨볼루션 필터가 이 문자들을 슬라이딩해 가면서 정보를 추출한다. 네트워크의 말단 레이어에서는 이렇게 모은 정보들을 종합해 형태소의 경계와 품사 태그를 예측한다 또한, 모델을 C++로 구현해 GPU없이도 형태소 분석이 가능하며 실행 속도 역시 빠르다고 카카오가 설명한 점도 있다.

 

from khaiii import KhaiiiApi
tokenizer = KhaiiiApi()


data = tokenizer.analyze('아버지가방에들어가신다')
tokens = []
for word in data :
	tokens.extend([str(m).split('/')[0] for m in word.morphs])
    
>>> 분석 결과 : ['아버지','가','방에','들','어','가','시','ㄴ다']

 


비지도 학습이란? 

: 정답 라벨이 없는 데이터를 비슷한 특징끼리 군집화 하여 새로운 데이터에 대한 결과를 예측하는 기법


클러스터링(Clustering):

대표적인 비지도 학습 종류입니다. 이 외에도 Dimentionality Reduction, Hidden Markov Model이 있다. 예를 들어 여러 과일의 사진이 있고 이 사진이 어떤 과일의 사진인지 정답이 없는 데이터에 대해 색깔이 무엇인지, 모양이 어떠한지 등에 대한 피처를 토대로 바나나다, 사과다 등으로 군집화 하는 것이다.

 

비지도 학습 기반의 형태소 분석 방법은 데이터의 패턴을 모델 스스로 학습하게 함으로써 형태소를 분석하는 방법이다. 

데이터에 자주 등장하는 단어들을 형태소로 인식한다.

 

 

1. soynlp 형태소 분석기

형태소 분석, 품사 판별 등을 지원하는 파이썬 기반 한국어 자연어 처리 패키지입니다. 

데이터 패턴을 스스로 학습하는 비지도 학습 접근법을 지향하기 때문에 하나의 문장 혹은 문서에서보다는 어느 정도 규모가 있으면서 동질적인 문서 집합에서 잘 작동합니다. 

 

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

 

 

2. 구글 센텐스피스 sentencepice

구글에서 공개한 비지도 학습 기반 형태소 분석 패키지다 1994년 제안된 바이트 페어 인코딩(BPE) 기법 등을 지원하며 pip 설치를 통해 파이썬 콘솔에서도 사용할 수 있습니다. 구글 sentencepiece 패키지를 활용해 Byte Pair Encoding 기법으로 단어 사전(vocabulary)을 만들고, 이를 BERT 모델에 맞도록 후처리한다.

 

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

예를 들어, 다음과 같은 데이터를 가지고 있다고 가정,

>>> aaabdaaabac

이 문자열에서는 aa가 가장 많이 나타났고, 이를 z로 치환하면 원래 문자열을 다음과 같이 압축가능

>>> zabdzabac

이를 또 한번 압축하여,, ab가 가장 많이 나타났으므로 이를 y로 치환

>>> zydzyac

 

구글이 공개한 BERT 모델 코드에는 BPE로 학습한 어휘 집합으로 토큰을 분리하는 클래스인 FullTokenizer가 포함되어 있다.

from models.bert.tokenization import FullTokenizer

tokenizer = FullTokenizer(vocab_file=vocab_fname,do_lower_case=False)
tokenizer.tokenize('집에좀 가자'

>>> ['집에','##좀','가자']
728x90

'Study > AI' 카테고리의 다른 글

GloVe , Swivel  (0) 2021.07.11
FastText , LSA  (0) 2021.07.11
NPLM , Word2Vec  (0) 2021.07.11
NLP 벡터  (0) 2021.07.10
임베딩  (0) 2021.07.09
Comments