본문 바로가기

SearchDeveloper/ElasticSearch

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

노리는 Lucene 7.4 (= ElasticSearch 6.4) 부터 제공되는 ES 공식 한국어 형태소 분석기이다.

노리 가 만들어지기까지 어떤 과정을 거쳐왔는지 살펴보고,

다음글에서는 노리가 어떻게 문장에서 형태소를 분석하는지 알아볼 것이다.

노리가 세상에 나오기까지

노리가 나오기까지

💡 말뭉치가 뭐야?
도서관,1781,3535,2110,NNG,*,T,도서관,Compound,*,*,도서/NNG/*+관/NNG/* 이런거다.
예를 들면 형태소 분석기를 만든다고 할 때,
“[도서관]은 일반명사인 [도서]와 일반명사인 [관]으로 분리돼” 
같이 학습을 위해 필요한 데이터를 뜻한다. (노리는 81만개 이상)
영어로는 코퍼스(corpus) 라고 부른다.

1. 노리의 조상은 mecab 이라는 일본어 형태소 분석엔진이다.

mecab 은 일본에서 개발한 형태소 분석 엔진이다. 일본에서 만들어졌지만 말뭉치에 의존하지 않도록 설계됐기 때문에 일본어 대신 한글 말뭉치를 넣어서 한글용 형태소 분석기도 만들 수 있다.

mecab

 

말뭉치를 사용해 CRF(Conditional Random Fields) 라는 모델을 학습시킨 후 예측을 통해 사전을 만든 후, 문장이 들어오면 사전 탐색과 여러 단계를 통해 형태소 분석 결과를 도출할 수 있다.

노리의 형태소 분석 엔진인 kuromoji는 요 mecab 을 발전시킨 엔진이기 때문에 mecab 의 동작방식을 알면 노리의 동작방식을 이해한 것이다.

2. 한글을 위한 형태소 분석기 은전한닢(mecab-ko) 를 만들자!

mecab 엔진에 일본어 말뭉치 대신 한글 말뭉치를 쌱 넣어 만든게 은전한닢 (mecab-ko 라고도 부르지!) 형태소 분석기이다.

한글 말뭉치는 mecab-ko-dic 이라고 부르며 아래와 같이 생겼다.

NNG.csv

문맥ID, 단어의 비용, 품사, 종성 유무, 복합어 유무, 분리된 단어의 품사 등의 정보를 품고 있으며 이 정보를 학습해 적절한 형태소 분석을 하는 모델을 생성한다. 약 81만개 단어(2018년 기준) 가 있으며 사전 크기는 약 200MB 이다.

3. ES 에 넣기에 200MB는 너무 커! 24MB 로 줄였지. 이름은 nori

사전 크기를 줄이자

노리은전한닢 에서 사용하는 mecab-ko-dic 사전 내용을 사용한다. 하지만 그대로 ElasticSearch에 넣기에는 파일 크기가 200MB 나 되기 때문에 꽤 부담스럽다. 그래서 데이터 양은 그대로인 채 사전 크기를 88% 나 감소시켰다. 어떻게!?

  • mecab-ko-dic 사전은 .csv 파일이다. 이를 .dat 형식의 바이너리로 변환시켰다.
  • 말뭉치를 보면 단어 [대학] 이 여러 번 출현한다. [대학] 문자열을 숫자 형태로 부호화해 중복 출현을 최소화한다.
  • 숫자 필드(ex. 문맥ID, 비용) 를 int 에서 short 자료형으로 변환한다.
  • short 중 2비트는 compound 여부 표시에 사용한다. compound 컬럼을 없앨 수 있다.

형태소 분석 엔진을 발전시키자

또한 mecab 의 상위 버전인 kuromoji 를 형태소 분석 엔진으로 채택하였다. 루씬 소스에서도 kuromoji 를 확인할 수 있다.

( kuromojimecab 보다 어떤 점이 나아졌는지 찾아봐도 잘 안나와요… 누군가 찾으신다면 공유부탁드립니다 😂)

https://github.com/apache/lucene/tree/main/lucene/analysis

노리 vs. 은전한닢

결론으로, 노리은전한닢은 다음과 같은 차이가 있다.

  • 같은 내용의 말뭉치이지만, 노리에 들어가는 사전 크기가 은전한닢 보다 88% 작다.
  • 노리kuromoji 엔진 (mecab 상위 버전), 은전한닢mecab 엔진을 사용한다.
💡 노리를 만든 사람은 누구?
jim ferenczi 라는 프랑스 사람이 만들었다.
kuromoji 엔진도 jim 이 만들었다.
jim 이 처음으로 붙인 이름은 nori 가 아니라 godori 였다. (화투가 생각나는ㅋㅋ) 이름 바꾸라 해서 고른게 nori 인데 일본어로 김, 행운이란 뜻을 가진다 한다. 그래서 ES 공식블로그에도 썸네일이 김 사진인가보다ㅋㅋ

김노리

그래서 형태소 분석을 어떻게 하는거야?

다음 글에서 보여줄게요!

왕추천 하는 영상

https://www.youtube.com/watch?v=80WiaOdnjXU

엘라스틱서치 한국인 직원이 발표한 meet up 영상이다. 영상 시기는 노리가 ES 에 반영되기 전이고 노리를 소개하는 내용이 담겨있다. (36:08 부터!)

 

레퍼런스

ES meet up 유투브

공식 한국어 분석 플러그인 “노리”

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

https://tape22.tistory.com/6

루씬 Git

6.7.2 노리 (nori) 한글 형태소 분석기

 

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

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