본문 바로가기
----------책----------/한국어 임베딩

3. 한국어 전처리

by 탶선 2021. 5. 20.
반응형

지도 학습 기반 형태소 분석

언어 전문가들이 직접 형태소 경계나 품사 정보를 모델에 학습하는 방법

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

은전한닢 분석기 사용법

 

# 은전한닢 형태소 분석 결과

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

# ['아버지', '가', '방', '에', '들어가', '신다']

 

은전한닢 품사 정보 확인

 

# 은전한닢 품사 정보 분석 결과

tokenizer.pos('아버지가방에들어가신다')
# [('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKB'), ('들어가', 'VV'), ('신다', 'EP+EC')]

 

꼬꼬마, 한나눔, Okt 등 KoNLPy의 형태소 분석 차이

 

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

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 == "kkma":
        tokenizer = Kkma()
    else:
        tokenizer = Mecab()
    return tokenizer
    
tokenizer = get_tokenizer("komoran")
tokenizer.morphs("아버지가방에들어가신다")

tokenizer = get_tokenizer("okt")
tokenizer.morphs("아버지가방에들어가신다")

tokenizer = get_tokenizer("mecab")
tokenizer.morphs("아버지가방에들어가신다")

tokenizer = get_tokenizer("kkma")
tokenizer.morphs("아버지가방에들어가신다")

 

Khaiii - 카카오에서 공개한 오픈소스 한국어 형태소 분석기

  • GPU 없이 형태소 분석 가능, 실행 속도 빠름
  • CNN 필터가 문자들을 슬라이딩해 정보를 추출

 

# Khaiii 클래스 선언
from khaiii import KhaiiiApi
tokenizer = KhaiiiApi()

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

# Khaiii의 품사 정보 확인
data = tokenizer.analyze("아버지가방에들어가신다")
tokens = []
for word in data:
    tokens.extend([str(m) for m in word.morphs])

print(tokens)
# Khaiii의 품사 정보 분석 결과
# ['아버지/NNG', '가/JKS', '방/NNG', '에/JKB', '들어가/VV', '시/EP', 'ㄴ다/EC']

 

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

데이터의 패턴을 모델 스스로 학습하여 형태소를 분석하는 방법

soynlp 형태소 분석기

  • 형태소 분석, 품사 판별 등을 지원하는 한국어 자연어 처리 패키지
  • 하나의 문장, 문서 보다 어느 정도 규모가 있으면서 동질적인 문서 집합에서 잘 작동
  • 데이터의 통계량을 확인해 만든 단어 점수 표로 작동
  • 단어 점수 : 응집 확률(Cohension Probability)과 브렌칭 엔트로피(Branching Entropy) 가 높을 때 해당 문자열을 형태소로 분석
    • 응집 확률 - 주어진 문자열이 유기적으로 연결돼 함께 자주 나타나는 것
    • 브렌칭 엔트로피 - 단어 앞뒤로 다양한 조사, 어미 혹은 다른 단어가 등장하는 경우

* 데이터 다운로드 주소 *

https://drive.google.com/file/d/1kUecR7xO7bsHFmUI6AExtY5u2XXlObOG/view

 

processed.zip

 

drive.google.com

 

import math
from soynlp.word import WordExtractor
from soynlp.tokenizer import LTokenizer

model_fname = "./processed/processed/soyword.model"

word_extractor = WordExtractor(min_frequency=100,
                              min_cohesion_forward=0.05,
                              min_right_branching_entropy=0.0)
word_extractor.load(model_fname)
scores = word_extractor.word_scores()
scores = {key:(scores[key].cohesion_forward * math.exp(scores[key].right_branching_entropy)) for key in scores.keys()}
tokenizer = LTokenizer(scores=scores)
tokens = tokenizer.tokenize("나는 오늘도 커피를 마신다")

print(tokens)
	# ['나는', '오늘', '도', '커피를', '마신다']

tokens = tokenizer.tokenize("아버지가방에들어가신다")
print(tokens)
	# ['아버지', '가방에들어가신다']

 

구글 센텐스피스(sentencepiece) - 구글에서 공개한 형태소 분석 패키지

  • - 바이트 페어 인코딩(BPE, Byte Pair Encoding)기법 지원 ( 말뭉치에서 가장 많이 등장한 문자열 병합으로 문자열 압축 )
  • - BPE를 활용하는 토크나이즈 메커니즘 : 원하는 어휘 집합 크기가 될 때까지 반복적으로 고빈도 문자열들을 병합, 어휘 집합에 추가(BPE 학습)
  • BPE 기법 예시
    • aaabdaaabac -> aa가 가장 많은 형태 이므로 aa를 Z로 치환하여 압축
    • aaabdaaabac -> ZabdZabac 로 압축 ->ab가 가장 많은 형태이므로 Y로 치환하여 다시 압축
    • aaabdaaabac -> ZabdZabac -> ZYdZYac

 

 

# 본 게시글은 한국어 임베딩 책을 읽고 게시하였습니다.

반응형

'----------책---------- > 한국어 임베딩' 카테고리의 다른 글

2. 벡터가 어떻게 의미를 가지게 되는가  (0) 2021.01.21
1. 서론  (0) 2020.10.21

댓글