2019-09-07(토) 폭풍속에서 성대히 치뤄진 "[JavaCafe] 생초보를 위한 엘라스틱서치 가이드" 강의에 대한 메모입니다.
02. 한글 형태소 분석하기 기초 [김흥래 자바카페 운영진]
https://www.slideshare.net/heungrae_kim/ss-169921949
앞선 시간 강의(https://12teamtoday.tistory.com/35)를 통해 엘라스틱서치의 기반인 Apache Lucene과 검색엔진의 필요성에 대해 알아봤다. 이번에는 한국에서 사용하는 검색엔진에 대해 이야기를 들어본다.
한글형태소 분석기
모든 언어는 각 언어마다의 고유한 특성이 있다. 영어와 한글만 비교하더라도 영어는 "Hello World"식으로 알파벳의 나열인 반면 한글은 "안녕 세상아" == "ㅇㅏㄴㄴㅕㅇ ㅅㅔㅅㅏㅇㅇㅏ"라는 자음과 모음의 조합으로 이뤄진다. 그렇기에 언어의 특성에 맞도록 토큰필터를 만드는 것은 쉬운 일이 아니다. 텍스트를 토큰으로 만들기 위해 필터를 거치는데, 이 때에 한글형태소 분석기가 적용된다. Apache Lucene은 20년 전에 나왔지만 영문에 특화되어 있어서 한글 검색에 적합하지 않았다. 그동안 여러 한글형태소 분석기가 등장했고, 대표적으로 은전한닢과 꼬꼬마 등이 있다. 각 라이브러리는 슬라이드 내부 링크를 통해 확인할 수 있다. 그리고 몇달전에 Apache Lucene에서 "Nori"라는 형태소 분석기가 공식적으로 등장했다. 아직까지는 은전한닢이 더 효과적이지만 앞으로는 official한 Nori가 대세가 될 것으로 예측된다. 첨언으로 Nori는 한국인이 아닌 프랑스 개발자가 만들었다고 한다.
한글의 토큰분리
어떤 문장이든지 절의 집합으로 분해할 수 있다. 그 절들은 다시 구의 집합으로 분해할 수 있다. 그 구들은 다시 특정 품사를 갖는 단어들로 분해할 수 있다. 구문분석이란 품사, 구, 절과 그것들 사이의 관계를 밝히는 작업을 의미한다. 말뭉치(corpus)는 자연언어 연구를 위해 관련 단어를 표출한 것으로 말뭉치가 많을수록 정확도가 높아진다(확률모델). 쉽게 말해 '거미가 거미줄을 친다'라는 문장이 있을 때, 이 거미가 동물 거미인지, 가수 거미인지를 구분하는 데에 핵심적인 역할을 하는 단어와 함께 묶어낸 것이 말뭉치라고 할 수 있다. 한국에는 세종 한국어 말뭉치라는 국가 오픈소스 프로젝트가 있고, 대부분의 한글 형태소 분석기들이 사용하고 있는 사전이 이 세종 한국어 말뭉치에서 파생되었다.
POS 태깅
POS는 Part Of Speech의 약자로 단어를 명사, 동사, 형용사 같은 품사확인을 하고 태깅한다. POS태깅은 이미 POS태그를 붙여놓은 문서의 말뭉치를 이용하여 만든다. 아래와 같은 형태로 나타난다.
형태소 분석기마다 형태소 분석결과가 달라질 수 있다. 또한 Pos태깅이 인공지능과 만나면 객체식별이 가능하다. 향상된 동음이의어. 거미 파리 등.
엘라스틱서치에서의 형태소분석기.
주요한 한글 형태소 분석기로는 앞서 설명했듯 은전한닢과 Nori가 있다. 한 가지 팁을 주신 것은 은전이 C++로 되어 있어 java로 되어 있는 엘라스틱서치에서 메모리릭이 발생하면 해제가 안 되는 이슈가 있다는 것이었다. 이 문제 없이 사용할 수 있는 것이 Seunjeon이다.
Seunjeon(은전한닢)을 스칼라로 재컴파일한 라이브러리다. 기존 eunjeon과는 달리 스칼라로 재컴파일 했기 때문에 최신 자바에서 바로 불러와서 사용할 수있는 장점이 있다. 속도는 eunjeon보다 느릴 수 있겠지만 체감하기 힘든 수준이라고 한다. 2019년까지는 이 Seunjeon을 추천해주셨다. 앞으로는 오피셜한 한글형태소분석기 Nori로 대동단결되지 않을까 예측해주셨다.
2.대 시절의 엘라스틱서치에서 보안이슈 발생하면서 플러그인에서 할 수 있는 다수의 기능이 제한되었다. 엘라스틱서치별 빌드버전 형태소분석기가 나와야하는데 이에 따라올 수 있는 형태소 분석기가 많지 않았다고 한다. 엘라스틱서치의 발전속도가 상당하여 새로운 버전이 계속 업데이트되고 있다. 현재 시점에서의 추천안정버전은 6.4.3 안정버전이라고 한다.
'.etc' 카테고리의 다른 글
[생초보를 위한 엘라스틱서치 가이드] 엘라스틱 서치를 위한 키워드들 (0) | 2019.09.12 |
---|---|
[생초보를 위한 엘라스틱서치 가이드] Elasticstack으로 생초보도 할 수 있는 데이터 시각화 (0) | 2019.09.10 |
[생초보를 위한 엘라스틱서치 가이드] 검색엔진과 DB Like 검색의 결과가 다른 이유 (0) | 2019.09.09 |
CSRF란? (0) | 2019.07.04 |
0. JWT(Json Web Tocken)의 기본 개념 (0) | 2019.07.04 |