Mecab과 Nori, Fastcat 플러그인 색인 성능 비교
Photo by Joanna Wallace on coralogix
어떤 한국어 분석기를 사용할까 ?
다나와에서는 현재 Fastcat
기반의 상품명 분석기를 이용해서 검색과 색인을 처리하고 있습니다.
하지만 효율적인 유지보수 측면과 커뮤니티를 통한 지속적인 기능 향상이 어려워 신규 한국어 분석기를 탐색하게 되었습니다.
Mecab-ko
는 오픈소스 한글 형태소 분석기로, Mecab
이라고 하는 일본어 형태소 분석기를 차용하여 한글 특성을 반영한 분석기입니다.
Nori
는 엘라스틱서치에서 공식 지원하는 한글 형태소 분석기로, 역시 루씬 기반이며, 개발하는 커미터가 존재합니다.
분석기별 설정 방법
현재 검색 엔진에서 사용되는 엘라스틱서치 버전은 7.8.1 버전을 사용하고 있습니다.
Mecab-Ko
Mecab-Ko 초기 설정 방법은 아래를 참고해주세요. 여기서는 은전한닢에서 제공되는 가장 최신 버전을 사용합니다.
https://danawalab.github.io/common/2022/12/19/Mecab-Ko.html
Nori
Nori는 엘라스틱서치에서 다음과 같이 입력 및 재시작합니다. 또는 사용하는 버전의 엘라스틱서치 코드를 받아 직접 빌드하여 커스터마이징할 수 있습니다.
elasticsearch-plugin install analysis-nori
다나와 상품명 분석기
상품명 분석기는 private로 개발되어 있기 때문에 코드 오픈없이 진행하겠습니다. 사용 방법은 다른 플러그인과 유사하게 엘라스틱서치 기동 시 도커 볼륨으로 호스트와 연결해주겠습니다.
벤치 마크
성능 비교를 위해 각각 300만, 700만 건 문서 수의 인덱스를 플러그인별로 색인해보았습니다.
현재 플러그인에는 색인 속도 향상을 위한 아무 옵션도 설정하지 않은 상태입니다. 결과를 보면 Mecab-Ko와 Fastcat의 성능이 동일하고, Nori는 다른 분석기들보다 속도가 열위인것으로 보입니다. 자료만 보았을 때 엘라스틱에서 공식으로 지원하는 플러그인치고 성능이 그렇게 뛰어나다고 볼 수는 없습니다.
또한 이 결과를 통해 알 수 있는 사실은 현재 다나와 시스템에서 Nori는 사용하기 적합하지 않은 것으로 보입니다. 다만 추가적으로 생각해보아야 할 점은 사전
입니다. 사전이 많을 수록 색인할 때 후보군이 늘어나 색인시 필요한 사전만 컴파일해서 색인하는 테스트를 추가적으로 진행합니다.
~/mecab-ko-dic-2.1.1-20180720$ wc -l *.csv
148 CoinedWord.csv
2547 EC.csv
1820 EF.csv
51 EP.csv
133 ETM.csv
14 ETN.csv
11690 Foreign.csv
3176 Group.csv
125750 Hanja.csv
1305 IC.csv
44820 Inflect.csv
416 J.csv
14242 MAG.csv
240 MAJ.csv
453 MM.csv
140 NNB.csv
677 NNBC.csv
208524 NNG.csv
2371 NNP.csv
342 NP.csv
482 NR.csv
3 NorthKorea.csv
99230 Person-actor.csv
196459 Person.csv
19301 Place-address.csv
1145 Place-station.csv
30303 Place.csv
5 Preanalysis.csv
16 Symbol.csv
2360 VA.csv
7 VCN.csv
9 VCP.csv
7331 VV.csv
125 VX.csv
36762 Wikipedia.csv
83 XPN.csv
3637 XR.csv
19 XSA.csv
124 XSN.csv
23 XSV.csv
2 user-nnp.csv
1 user-person.csv
2 user-place.csv
816288 total
현재 약 81만개
의 단어를 가지고 색인을 진행하고 있습니다. (최신 버전에는 더 추가되었을 수도 있습니다)
다나와는 주로 상품에 대한 검색 결과를 제공하고 있기 때문에 동사, 형용사, 인명, 지명, 북한사전(?) 등을 제거하여 다시 색인을 진행하겠습니다.
~/mecab-ko-dic-2.1.1-20180720$ wc -l *.csv
140 NNB.csv
677 NNBC.csv
205269 NNG.csv
2371 NNP.csv
342 NP.csv
482 NR.csv
5 Preanalysis.csv
209286 total
불필요한 사전을 정리해서 약 20만개까지 줄였습니다.
모두 700만건의 문서 수를 가진 인덱스의 색인 결과입니다. 위의 데이터를 보면 사전 갯수의 제거에 따라 색인 소요 시간(Elapsed Time)
이 감소하는 것으로 나타났습니다. 따라서 다음과 같이 유추할 수 있습니다.
색인 시 사전이 적을수록 색인 성능이 좋아진다.
정리
기존에 사용하던 형태소 분석기외에 다른 분석기를 통해 색인을 하면 어떤 결과가 나올지 궁금증이 있었는데 이번 포스팅을 작성하면서 확실히 정리할 수 있었습니다. 성능 테스트 결과 기존 패스트캣 분석기 역시 다른 분석기와 동일한 성능을 보이고 있으므로 기존 코드를 리팩토링하여 효율적으로 유지보수하는 방안을 검토하고 있습니다.
참고 자료
공식 한국어 분석 플러그인 “노리” : https://www.elastic.co/kr/blog/nori-the-official-elasticsearch-plugin-for-korean-language-analysis