이 글은 ES 공식 블로그 공식 한국어 분석 플러그인 “노리” 내용 중 어떻게 형태소를 분석하는 가에 대해 중점을 둔 글이다. 공식 블로그를 먼저 읽어보고 이해를 돕기 위해 이 글을 읽는 것을 추천한다! (사실 노리라 쓰고 mecab 얘기를 더 많이했는지도 모른다😅)
버전
mecab-ko-dic-2.1.1-20180720
mecab-0.996-ko-0.9.1 2
더 좋은 분석임을 판단하는 기준
한국어형태소분석기
라는 명사구를 어떻게 분리하면 좋을까? 한국어 / 형태소 / 분석기
로? 아니면 한국어 / 형태 / 소분 / 석기
로?
사람이 보기에는 한국어 / 형태소 / 분석기
로 분리하는게 적절해 보인다. 한국어 / 형태 / 소분 / 석기
로 분리하기에는 뭔가 안어울리는 단어들끼리 붙어있다는 느낌이 들지 않은가? 컴퓨터가 판단할 때도 마찬가지이다. mecab 엔진은 비용
이라는 값으로 이를 판단한다. 예를 들어 한국어 / 형태소 / 분석기
로 분리했을 때 5 의 비용이 들고 한국어 / 형태 / 소분 / 석기
로 분리했을 때 10 의 비용이 들면 가장 적은 비용이 드는 한국어 / 형태소 / 분석기 로 최종 분석 결과를 제공한다.
그럼 mecab 의 방식대로 비용을 직접 계산해보자
한국어 / 형태소 / 분석기
, 얼마면 되니!!
데이터 준비하기
최종 비용을 계산하려면 두 가지 값을 준비해야한다.
- 단어 비용 ⇒
한국어
가 출연하려면 얼마? - 연결 비용 ⇒
한국어
랑형태소
끼리 붙으려면 얼마?
이 값들은 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"
- %phl : 좌문맥 ID
- %phr : 우문맥 ID
- %pw : 단어 비용
- %pC : 연결 비용
- %pc : 이전 비용 + 단어 비용 + 연결 비용
어? 근데 연결비용이나 단어비용은 누가 만드는거지?
비용 사전 만들기
바로 CRF(Conditional Random Field) 라는 통계적 학습 모델이 알려준다.
형태소 분석이 잘 되어있는 거대한 말뭉치를 정답셋으로 던져주면, CRF 가 학습한 후에 단어 비용과 연결 비용을 예측해 우리에게 결과물로 던져준다.
준비물
1. 한글 말뭉치 (by 21세기 세종 계획)
2. 단어와 품사 정보가 들어있는 {품사}.csv 파일
좌문맥ID, 우문맥ID, 단어비용은 모델이 만들어 줄 값이니 비워놓는다.
산출물
1. 단어비용
{품사}.csv
2. 연결비용
matrix.def
분석 시간을 줄이자
형태소 분석은 최대한 빠른 시간 내에 이뤄져야 한다. 왜냐하면 사용자가 검색어를 입력 후 엔터를 쳤을 때 형태소 분석이 비로소 시작되기 때문에 검색 결과를 빨리 주기 위해선 거의 실시간성으로 분석 결과를 줘야 하기 때문이다.
노리는 비터비 알고리즘 을 사용해 속도 문제를 해결한다. 동적프로그래밍을 활용해 모든 단어를 탐색하는 게 아니라 최소값을 갖는 단어만 따라가기 때문에 탐색 단계를 최소화한다.
왕추천하는 PPT
mecab 에 대한 자세한 설명이 들어있다.
레퍼런스
http://taku910.github.io/mecab/learn.html
http://eunjeon.blogspot.com/2014/03/blog-post.html?m=1
http://openuiz.blogspot.com/2018/12/mecab-ko-dic.html
글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.
노리 형태소 분석기 이해하기 (2/2)
'SearchDeveloper > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] update_by_query version_conflict_engine_exception & update 쿼리 비교 (1) | 2024.07.14 |
---|---|
[ElasticSearch] synonym_graph 의 start_offset, end_offset, position, position_length 이해하기 (0) | 2024.03.07 |
노리 형태소 분석기 이해하기 (1/2) (0) | 2023.04.01 |
[트러블슈팅] Too many dynamic script compilations within, max: [75/5m] (0) | 2022.11.16 |
ElasticSearch Full GC 해결 과정 (2) | 2022.09.11 |