-지난내용-
https://kyeum-d.tistory.com/29
[MySQL] Like 검색 vs 전문검색(n-gram)
들어가기에 앞서... 교육강의 플랫폼 infrun의 강의 검색 기능을 개발하던 중 강의명에 대한 검색을 Like절을 사용하여 처리하였고 이러한 질문을 받았습니다. Like 검색을 사용 했을 때 DB에서 어떤
kyeum-d.tistory.com
들어가며...
지난시간에 Like검색과 전문검색에 대해 비교하는 시간을 가졌습니다.
그런데 좀 더 근본적인 의문점부터 해결해야합니다. 우리가 전문검색을 사용해야하는 이유가 뭘까요?
오늘은 전문검색이 등장하게 된 이유와 n-gram의 문제점을 알아보고 그 문제점을 형태소 분석을 사용하면 어떻게 해결 할 수 있는지 알아보겠습니다.
전문검색이 왜 필요할까요?
네이버, 구글같은 거대한 검색엔진 시스템이 아니더라도 컨텐츠를 검색을 한다는 것은 굉장히 보편적인 행위입니다.
현재 제가 개발중인 사이드 프로젝트 infrun 강의 시스템의 경우에도 강의를 검색하는 행위는 반드시 필요한 동작입니다.
사용자가 많지 않고 등록된 강의가 많지 않다면 Where 절을 통한 Like검색을 실행하여도 별다른 문제가 발생하지 않을것입니다.
억지로 전문검색을 활용하지 않아도 문제가 없다는 의미입니다.
아무리 좋은 기술이라도 해당 기술이 필요한 순간에 적용을 시키는 것이 중요한데,
시스템이 성행하여 데이터가 많아진다면 어떻게 될까요?
전통적인 RDBMS의 경우 id를 기반으로 contents를 검색합니다.
예를들어 fox가 들어간 contents를 찾고싶다면
테이블의 모든 데이터를 순회하며 contents에 fox라는 단어가 있는지 검사하여 있는 경우에만 row를 반환합니다.
Like검색을 통한 기존 RDBMS 구조로 컨텐츠를 검색한다면
방대한 데이터를 Fullscan하는 이 방법은 굉장히 오랜 시간이 걸립니다.
그렇다면 이 문제를 어떻게 해결하면 좋을까요?
contents의 단어(내용)를 분할하여 인덱스화 하고 해당 단어를 가진 doc의 id를 찾아가도록 하는 방식을 채택하여 해결하는데,
이를 id를 통해 contents를 찾아가는 것이 아닌 contents의 내용을 토대로 역으로 id를 찾아간다고 하여 역인덱스(inverted index) 구조라고 합니다.
그리고 이 역인덱스를 사용해 컨텐츠를 찾는것이 바로 전문검색입니다.
N-gram의 문제점
지난 시간에 알아봤던 n-gram알고리즘을 통한 검색 또한 역인덱스를 통한 전문검색입니다.
본문의 내용을 n개의 단어로 잘라서 인덱싱하고 단어가 포함된 id를 찾아가는 구조였죠.
다만 MySQL의 이런 n-gram 알고리즘에는 두가지 문제점이 있습니다.
- 인덱스의 크기가 방대함
- 검색 품질이 다소 낮음
무조건 n개의 단어로 본문을 분할하기 때문에 무의미한 단어들 까지 인덱스로 생성되고
이러한 인덱스는 전부 별개의 행으로 생성되기 때문에 인덱스의 크기가 커지고
분할된 단어들이 혼용되는 용어인 경우도 있기 때문에 검색의 품질이 다소 낮습니다.
예를들어
"고기능 테이블"이라는 문장을 2-gram으로 분리한다면
"고기" "기능" "테이" "이블" 이렇게 총 4개의 단어로 인덱스가 생성되고
"고기"로 검색하여도 "고기능 테이블"이 결과로 반환되고
"테이"로 검색하여도 "고기능 테이블"이 결과로 반환됩니다.
검색에서는 검색자의 의도를 파악하는 것이 매우 중요한데
여기서 "고기"와 "테이"를 검색한 사용자가 "고기능 테이블"을 찾고자 하지는 않았을 것입니다.
그렇다고 n-gram이 무조건 좋지 않은 기술인 것은 아닙니다.
지금 당장 Like검색의 기능을 개선시켜야 하고, 검색 결과의 품질 보다 빠른 결과 반환이 중요한 상황일 때
다른 사전 준비 과정 없이 전문 인덱스를 생성하는 것만으로 바로 사용 할 수 있다는 장점이 있기 때문에
이런 상황에서는 n-gram이 좋은 선택이 될 수 있습니다.
가장 작은 의미를 가진 단어(형태소)로 분리해보자
n개의 단어로 무작정 분할하는 방식이 아니라
의미를 가진 단어로 분할하여 검색자의 의도를 파악하기 쉽게 하기 위해 등장 한 것이 "형태소 분석" 입니다.
여기서 형태소란, 의미를 가지는 최소 단위를 뜻하는데
형태소 분석은 정확히 형태소'로' 분석 한다는 것을 의미합니다.
형태소에도 여러 종류가 있는데 검색 시스템에서 다루는 형태소 분석의 형태소는 "실질 형태소"로 분석하는 것입니다.
실질 형태소란 단어자체에 어휘적인 의미가 있는 형태소를 의미하는데 여기서 제가 헷갈렸던 부분이
의미를 가지는 것과 / 어휘적인 의미를 가지는 것의 차이였습니다.
이게 정확히 무슨 말인가 하면
"형태소의 분석" 에서 // "형태소" 와 "분석" 은 실질 형태소이고
"의" 는 형식형태소 입니다.
즉, "의"도 의미를 가진 최소 단위인 형태소 이지만 어휘적인 의미가 없으므로
우리가 검색엔진에서 분석하고자 하는 형태소에는 해당하지 않는 것입니다.
형태소 분석을 사용하여 역인덱스를 생성한다면
위에서 든 예시인 "고기능 테이블"은 "고기능" 과 "테이블" 로 분리되어 "고기"와 "테이"로는 해당 컨텐츠를 찾을 수 없습니다.
하지만 "고기능" 혹은 "테이블"로 검색하였을 때 정확한 결과를 얻기 수월하고
이는 검색자의 의도를 파악하여 처리하기 쉽다는 것을 의미합니다.
따라서 검색의 품질이 굉장히 중요한 상황이라면 n-gram 보다는 형태소 분석을 선택하는 것이 좋을 수 있습니다.
형태소 분석이면 다 해결된다?
형태소 분석이 모든 것을 해결해줄 것 처럼 얘기했지만, 이 형태소 분석에도 단점이 존재하고 여러 주의사항을 수반합니다.
형태소 분석에서 "어휘적은 의미"를 가지는 최소 단위를 어떻게 구분해야할까요?
그렇습니다. 이 형태소 분석을 하기 위해서는 이러한 형태소를 정의 해놓은 사전이 필요합니다.
여기서 형태소 분석의 단점이 드러납니다.
이 사전을 준비하는 과정이 매우 전문적이고 어려운 과정(국문학..)이라 많은 노력과 시간이 들어간다는 점과
만든 사전에 지나치게 의존적인 형태의 인덱스가 생성된다는 것입니다.
이런 의존적인 구조는 여러 주의사항을 수반하는데
- 신조어(새로운 단어)의 등장에 항시 대응해야함
- 다의성과 동형성에 주의(한 형태소가 다양한 의미로 사용)
- 형태소 분석만으로는 문장 구조와 의미 파악의 어려움
1번 신조어의 등장에 항시 대응해야하므로 사전을 항상 최신으로 업데이트하는 추가적인 과정이 필요할 것이고
2번과 3번은 형태소분석에서 끝나는 것이 아니라 해당 형태소의 전/후로 같이 오는 단어를 파악하고 분석하여
문맥과 의미를 파악하는 과정이 있어야 더욱 정확한 인덱스를 생성하고 검색 품질을 높일 수 있다는 점입니다.
마치며...
n-gram과 형태소 분석 각각의 장단점을 잘 이해하고
상황에 맞도록 검색 방법을 선택하는 것이 중요할 것으로 생각됩니다.
다음 포스팅에서는 이 형태소 분석을 활용한 역인덱스 방식의 대표적인 기술인 ElasticSearch에 대해서 자세히 알아보는 시간을 가져볼까합니다
'Data' 카테고리의 다른 글
[Object Storage] - REST API를 통한 S3 Multipart Upload (1) | 2023.09.03 |
---|---|
[Object Storage] - Java SDK를 활용한 S3 Upload (0) | 2023.08.26 |
[Object Storage] - 객체 저장소, 왜 선택되었나 ? (0) | 2023.08.20 |
[전문검색] - Like 검색 vs 전문검색(n-gram) (0) | 2023.07.23 |