본문 바로가기

SearchDeveloper/ElasticSearch

노리 형태소 분석기 이해하기 (2/2)

이 글은 ES 공식 블로그 공식 한국어 분석 플러그인 “노리” 내용 중 어떻게 형태소를 분석하는 가에 대해 중점을 둔 글이다. 공식 블로그를 먼저 읽어보고 이해를 돕기 위해 이 글을 읽는 것을 추천한다! (사실 노리라 쓰고 mecab 얘기를 더 많이했는지도 모른다😅)

버전

mecab-ko-dic-2.1.1-20180720

mecab-0.996-ko-0.9.1 2

더 좋은 분석임을 판단하는 기준

한국어형태소분석기 라는 명사구를 어떻게 분리하면 좋을까? 한국어 / 형태소 / 분석기 로? 아니면 한국어 / 형태 / 소분 / 석기 로?

사람이 보기에는 한국어 / 형태소 / 분석기 로 분리하는게 적절해 보인다. 한국어 / 형태 / 소분 / 석기 로 분리하기에는 뭔가 안어울리는 단어들끼리 붙어있다는 느낌이 들지 않은가? 컴퓨터가 판단할 때도 마찬가지이다. mecab 엔진은 비용 이라는 값으로 이를 판단한다. 예를 들어 한국어 / 형태소 / 분석기 로 분리했을 때 5 의 비용이 들고 한국어 / 형태 / 소분 / 석기 로 분리했을 때 10 의 비용이 들면 가장 적은 비용이 드는 한국어 / 형태소 / 분석기  로 최종 분석 결과를 제공한다.

그럼 mecab 의 방식대로 비용을 직접 계산해보자

한국어 / 형태소 / 분석기, 얼마면 되니!!

데이터 준비하기

최종 비용을 계산하려면 두 가지 값을 준비해야한다.

  1. 단어 비용 ⇒ 한국어 가 출연하려면 얼마?
  2. 연결 비용 ⇒ 한국어형태소 끼리 붙으려면 얼마?

이 값들은 mecab-ko-dic 사전에서 찾을 수 있다.

NNG.csv ⇒ 단어비용

***단어, 좌문맥ID, 우문맥ID, 단어비용, 품사, 의미부류, 받침유무, 읽기, 타입, 첫번째품사, 마지막품사, 원형*** 
한국어, 1780, 3533, -239, NNG, *, F, 한국어, Compound, *, *, 한국/NNG/*+어/NNG/*
형태소, 1780, 3533, 2433, NNG, *, F, 형태소, Compound, *, *, 형태/NNG/*+소/NNG/*
분석기, 1780, 3533, 2721, NNG, *, F, 분석기, Compound, *, *, 분석/NNG/행위+기/NNG/*
  • 좌문맥ID: 단어의 시작 위치에 ID 라는 숫자를 부여함 / 우문맥ID: 단어의 끝 위치에 ID 라는 숫자를 부여함
    • matrix.def 에서 단어 사이의 연결비용을 찾기 위함
  • 의미부류: *, 인명, 지명, 장소, 행위 등
  • 받침유무: 마지막 글자에 종성이 있는가 → 바로 뒤에 붙을 조사를(이/가, 을/를 등) 정하기 위해
  • 읽기: 단어가 “韓國” 면 읽기는 “한국”
  • 타입: *, Compound, Inflected 등

matrix.def ⇒ 연결비용

***좌문맥ID 우문맥ID 연결비용***
0 1780 -1133
3533 1780 269
  • ID 3533 이랑 ID 1780 이랑 붙으려면 269 의 비용이 듦
  • 단어의 끝다음단어의 시작 이 연결되는 비용
  • 좌문맥ID 가 0이면 문장의 시작이란 뜻

최종비용 계산하기

최종비용을 구하는 식은 간단하다. 출연한 단어비용과 연결비용을 한껏 더해주면 된다.

최종비용 = [문장처음+한국어] 연결비용 + [한국어] 단어비용 +

                  [한국어+형태소] 연결비용 + [형태소] 단어비용 +

                  [형태소+분석기] 연결비용 + [분석기] 단어비용

(수식의 숫자가 어디서 나왔는지 궁금하다면 배경색이 같은 숫자를 따라가보자)

한국어 / 형태소 / 분석기 분석 과정

한국어 / 형태소 / 분석기 의 최종 비용은 4320 이다.

사실 비용이라는 값을 만드는 이유는 숫자 자체에 의미가 있다기 보단 다른 분석 결과보다 얼마나 더 좋은지 안좋은지 비교하기 위한 목적이 더 크다.

그러니 한국어 / 형태 / 소분 / 석기 의 최종 비용도 구해보고 뭐가 더 좋은지 비교해보자!

한국어 / 형태 / 소분 / 석기 분석 과정

한국어 / 형태 / 소분 / 석기 의 최종 비용은 5191 이다.

결론

한국어 / 형태소 / 분석기 의 비용이 더 저렴하므로 mecab 도 사람처럼 의도한대로 잘 분리했다.

(참고) mecab 으로 확인하기

mecab 엔진으로도 계산과정을 확인할 수 있다. (설치는 여기 17, 18 페이지 참조)

echo "한국어형태소분석기" | mecab -d mecab-ko-dic-2.1.1-20180720 -N2 -F"%m\t%f[0],%f[1],%phl,%phr,%pw,%pC,%pc\n"

mecab 분석 결과

  • %phl : 좌문맥 ID
  • %phr : 우문맥 ID
  • %pw : 단어 비용
  • %pC : 연결 비용
  • %pc : 이전 비용 + 단어 비용 + 연결 비용

어? 근데 연결비용이나 단어비용은 누가 만드는거지?

비용 사전 만들기

바로 CRF(Conditional Random Field) 라는 통계적 학습 모델이 알려준다.

형태소 분석이 잘 되어있는 거대한 말뭉치를 정답셋으로 던져주면, CRF 가 학습한 후에 단어 비용과 연결 비용을 예측해 우리에게 결과물로 던져준다.

CRF 학습 및 예측

준비물

1. 한글 말뭉치 (by 21세기 세종 계획)

한글 말뭉치 샘플

2. 단어와 품사 정보가 들어있는 {품사}.csv 파일

품사.csv

좌문맥ID, 우문맥ID, 단어비용은 모델이 만들어 줄 값이니 비워놓는다.

산출물

1. 단어비용

{품사}.csv

품사.csv

2. 연결비용

matrix.def

matrix.def

분석 시간을 줄이자

형태소 분석은 최대한 빠른 시간 내에 이뤄져야 한다. 왜냐하면 사용자가 검색어를 입력 후 엔터를 쳤을 때 형태소 분석이 비로소 시작되기 때문에 검색 결과를 빨리 주기 위해선 거의 실시간성으로 분석 결과를 줘야 하기 때문이다.

형태소 분석 후 검색

노리는 비터비 알고리즘 을 사용해 속도 문제를 해결한다. 동적프로그래밍을 활용해 모든 단어를 탐색하는 게 아니라 최소값을 갖는 단어만 따라가기 때문에 탐색 단계를 최소화한다.

왕추천하는 PPT

은전한닢 프레젠테이션

mecab 에 대한 자세한 설명이 들어있다.

 

레퍼런스

http://taku910.github.io/mecab/learn.html

https://tape22.tistory.com/6

mecab-ko-dic 사전 형식

은전한닢 프레젠테이션

http://eunjeon.blogspot.com/2014/03/blog-post.html?m=1

http://openuiz.blogspot.com/2018/12/mecab-ko-dic.html

CRF 설명

mecab-ko-dic (학습 전)

mecab-ko-dic (학습 후)

글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.

노리 형태소 분석기 이해하기 (2/2)