노리
는 Lucene 7.4 (= ElasticSearch 6.4) 부터 제공되는 ES 공식 한국어 형태소 분석기이다.
노리
가 만들어지기까지 어떤 과정을 거쳐왔는지 살펴보고,
다음글에서는 노리
가 어떻게 문장에서 형태소를 분석하는지 알아볼 것이다.
노리가 세상에 나오기까지
💡 말뭉치가 뭐야?
도서관,1781,3535,2110,NNG,*,T,도서관,Compound,*,*,도서/NNG/*+관/NNG/* 이런거다.
예를 들면 형태소 분석기를 만든다고 할 때,
“[도서관]은 일반명사인 [도서]와 일반명사인 [관]으로 분리돼”
같이 학습을 위해 필요한 데이터를 뜻한다. (노리는 81만개 이상)
영어로는 코퍼스(corpus) 라고 부른다.
1. 노리의 조상은 mecab
이라는 일본어 형태소 분석엔진이다.
mecab
은 일본에서 개발한 형태소 분석 엔진이다. 일본에서 만들어졌지만 말뭉치에 의존하지 않도록 설계됐기 때문에 일본어 대신 한글 말뭉치를 넣어서 한글용 형태소 분석기도 만들 수 있다.
말뭉치를 사용해 CRF(Conditional Random Fields) 라는 모델을 학습시킨 후 예측을 통해 사전을 만든 후, 문장이 들어오면 사전 탐색과 여러 단계를 통해 형태소 분석 결과를 도출할 수 있다.
노리의 형태소 분석 엔진인 kuromoji
는 요 mecab
을 발전시킨 엔진이기 때문에 mecab
의 동작방식을 알면 노리의 동작방식을 이해한 것이다.
2. 한글을 위한 형태소 분석기 은전한닢(mecab-ko)
를 만들자!
mecab
엔진에 일본어 말뭉치 대신 한글 말뭉치를 쌱 넣어 만든게 은전한닢
(mecab-ko 라고도 부르지!) 형태소 분석기이다.
한글 말뭉치는 mecab-ko-dic 이라고 부르며 아래와 같이 생겼다.
문맥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
를 확인할 수 있다.
( kuromoji
가 mecab
보다 어떤 점이 나아졌는지 찾아봐도 잘 안나와요… 누군가 찾으신다면 공유부탁드립니다 😂)
노리 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 부터!)
레퍼런스
http://taku910.github.io/mecab/
글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.
노리 형태소 분석기 이해하기 (1/2)
'SearchDeveloper > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] synonym_graph 의 start_offset, end_offset, position, position_length 이해하기 (0) | 2024.03.07 |
---|---|
노리 형태소 분석기 이해하기 (2/2) (2) | 2023.04.11 |
[트러블슈팅] Too many dynamic script compilations within, max: [75/5m] (0) | 2022.11.16 |
ElasticSearch Full GC 해결 과정 (2) | 2022.09.11 |
ElasticSearch refresh, flush API 동작 원리 (2): ElasticSearch 관점 + translog (0) | 2022.07.30 |