반응형
지도 학습 기반 형태소 분석
언어 전문가들이 직접 형태소 경계나 품사 정보를 모델에 학습하는 방법
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
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 |
댓글