검색 품질 결정하기
검색 엔진의 퀄리티를 높일 수 있는 요소는 크게 다음과 같습니다.
1. 텍스트 전처리
2. 색인
3. 검색 알고리즘
이 문서에서는 위 세 가지 요소에 대한 기초 지식을 다룰 예정입니다.
이전 글에서 색인 과정에서의 전처리에 대해 언급했습니다.
사용자의 검색어를 죄다 뜯어서 사전을 만든다고 생각해 봅시다. 문제집 맨 뒷장에 보면 주요 키워드들이 어느 페이지에 나오는지 적혀있던 기억을 떠올려 보세요. 그 키워드 사전을 만들기 위해 필요한 것이 텍스트 전처리 과정입니다.
검색 결과가 나오지 않는 문제는 텍스트 전처리 과정을 의심해 볼 수 있습니다. 아예 사전에 등재돼있지 않은 키워드를 찾으려고 하는 꼴이니까요.
과정의 순서가 중요한 것은 아니나, 일반적인 흐름으로 소개합니다.
사용자가 검색할 때는 대소문자를 구분하지 않는 경우가 많습니다. 따라서 전처리 단계에서 사용자가 입력한 검색 키워드의 텍스트 데이터를 모두 소문자나 대문자로 통일시킵니다. 보통을 소문자로 통일합니다.
공백, 특수문자, 숫자, 불용어를 제거합니다. 불용어는 '그리고', '어떻게', 'the' 같은 분석에 큰 의미가 없는 단어들입니다. 불용어 모음 자료는 쉽게 찾아보실 수 있습니다.
검색 키워드로 일관된 처리를 하기 위해, 보통은 ascii(아스키) 코드 순서대로 문자를 재정렬합니다. 기획자로서 꼭 알아야 하는 단계는 아니지만, 그냥 검색어를 한번 정렬할 필요가 있다는 차원에서 이해해 주세요.
텍스트 전처리 과정에서 가장 품이 많이 드는 과업입니다. 검색 결과 자체가 안 나온다면 형태소 분석 문제일 확률이 높습니다. 형태소는 의미를 가지는 가장 작은 말의 단위입니다. 색인화 작업을 하려면 문장을 형태소 단위로 분리하고, 각 형태소의 품사를 판별하는 작업이 필요합니다.
형태소 분석을 하면 검색 쿼리를 더 정확하게 이해하고, 문서의 색인화를 효과적으로 할 수 있습니다. 이렇게 텍스트를 단어 또는 형태소로 분리하는 작업을 '토큰화'라고도 부릅니다.
위 과정을 통해 중복되는 데이터가 발생하면 그 단어들을 병합시켜 주는 과정입니다. 동의어를 처리하기도 하고, 단어의 어간이나 표제어를 추출해서 기본 형태를 일치시키는 작업입니다.
영어 키워드를 예로 들면 "running", "ran", "runs" 모두 "run"이라는 기본 형태의 표제어로 통일해 처리합니다. 이 과정에서는 해당 단어가 가지는 문법적인 의미를 고려해야 하기 때문에, 단어의 의미가 중요한 한국어 검색 개발 작업을 할 때 신경 써야 하는 과정입니다.
텍스트 전처리로 검색어를 구조화하고, 텍스트를 정제해서 검색 결과의 정확성을 높입니다. 그 후에 색인이 이루어지면, 검색 엔진은 색인을 활용해서 사용자의 검색 쿼리에 대한 결과를 찾아냅니다.
다시 말하자면, 검색 결과는 나오지만 내용이 일치하지 않는다면 색인을 의심해 볼 수 있습니다.
색인은 사전과도 같다고 설명했는데, 색인의 데이터베이스 예시를 보여드리겠습니다.
어렵게 생각하지 마시고 엑셀 데이터를 본다고 생각해 주세요.
각 용어에 대한 정보를 저장하는 테이블이 있습니다. 이 테이블은 다음 정보를 저장합니다.
- term_id: 용어의 ID(고유 식별자)
- term_text: 실제 용어의 텍스트
- document_frequency: 해당 용어가 등장한 페이지의 수
설명) '스티커'라는 용어는 용어 테이블에서 1이라는 ID로 관리되고, 전체 페이지에서 500번 등장합니다.
용어 테이블과 별개로, 형태소 테이블을 만들 수도 있습니다.
- morpheme_id: 형태소의 ID(고유 식별자)
- morpheme_text: 실제 형태소의 텍스트
설명) '농구화'라는 용어는 형태소 분석에 따라 '농구' + '화'로 구분합니다. '농구'는 morpheme_id 3, '화'는 morpheme_id 4 로 분류하여 테이블에 저장됩니다.
웹이나 앱 상세페이지, 문서에 대한 정보를 저장하는 테이블입니다.
- document_id: 문서의 ID(고유 식별자)
- title: 문서의 제목
- url: 문서의 URL
설명) '서울 소품샵 모음'이라는 문서는 문서 테이블에서 101이라는 ID로 관리되고, url은 http://example1.com 입니다.
각 문서에 등장한 용어의 정보를 저장하는 테이블입니다.
- document_id: 문서의 ID(고유 식별자)
- term_id: 용어의 ID(고유 식별자)
- term_frequency: 해당 용어가 문서에서 등장한 횟수
설명) document_id 101인 '서울 소품샵 모음' 페이지에서 term_id 1인 '스티커'는 100번 등장했습니다.
실제로는 더 복잡한 구조와 다양한 최적화 기법이 적용됩니다. 이런 방식으로 색인 사전을 구축하고 고도화하며 검색 품질을 높이는 방법이 있습니다.
다양한 검색 알고리즘이 있지만, 검색 알고리즘들의 공통점은 사용자의 검색 쿼리에 대해 가장 관련성 높은 문서를 찾아내려는 목적을 갖고 있다는 것입니다. 실제로 검색 엔진은 다양한 알고리즘을 조합해서 최적의 결과를 제공하는 것이 일반적입니다. 어떤 검색 알고리즘을 선택하는지에 따라 검색 품질이 결정되곤 합니다.
따라서, 검색 결과는 나오지만 그 품질이 이상하다면 검색 알고리즘을 개선할 필요가 있습니다.
기획자로서 알아야 할 부분은 검색 엔진의 기본 원리입니다. 검색 엔진이 문서들을 어떻게 색인하고, 검색 쿼리에 대한 결과를 어떻게 순위 매기는지를 이해하는 것이 중요합니다.
검색 서비스 기획자에게는 검색 쿼리를 분석하는 능력도 요구됩니다. 사용자들이 어떤 검색 쿼리를 주로 사용하는지 분석하고, 해당 쿼리에 대한 검색 결과의 품질을 개선하는 방법에 대해 고민하는 것이 중요합니다. 서로 다른 검색 알고리즘을 A/B 테스트를 통해 비교해서 성능과 사용자 반응을 평가할 수도 있습니다.
검색 알고리즘의 기본 원리는 색인화된 문서와 전처리된 텍스트를 바탕으로, 알고리즘마다 중요하게 생각하는 방법에 따라 사용자에게 가장 관련성 높은 결과를 상위에 표시하는 것입니다.
대표적인 검색 알고리즘으로는 TF-IDF, BM25 와 같은 단어의 빈도수를 고려하는 알고리즘이 있습니다. 저는 이런 수단에 대한 내용은 다루지 않고, 검색 알고리즘을 채택할 때 기획자가 고려할 요소에 대해 안내하겠습니다.
(1) 데이터의 특성과 규모
- 우리 서비스의 검색 대상이 되는 데이터의 양과 특성을 고려합니다.
- 대용량의 데이터인지, 특정 도메인의 전문 용어가 많이 사용되는지를 검토합니다.
- 대용량 데이터를 다룰 때는 주로 Elasticsearch의 TF-IDF 또는 BM25 모델을 사용합니다.
(2) 검색 결과의 정확성
- 우리 서비스는 얼마나 정확한 검색 결과를 제공해야 하는지 고려합니다.
- 문서의 길이나 정확성을 다룰 때는 주로 Okapi의 BM25 모델을 사용합니다.
(3) 검색 속도
- 우리 서비스는 얼마나 빠른 응답 시간을 제공해야 하는지 고려합니다.
- 단일 키워드, 다중 키워드, 구문 검색을 다룰 때는 주로 Elasticsearch의 BM25 모델을 사용합니다.
방법론에 대한 것은 개발자의 고민입니다. 기획자의 역할은 우리 서비스의 검색 기능에서 어떤 요소를 중요하게 생각할지, 우선순위를 결정하는 것입니다.
다양한 검색 알고리즘을 바탕으로 검색한 결과에 가중치를 부여합니다. 각 검색 결과에 대한 가중치를 부여하고 랭킹을 매기는 과정입니다. 이때, 검색 알고리즘이 고려하는 요소에 따라 검색 결과의 순서가 결정됩니다.
가령 특정 단어가 얼마나 자주 등장하는지를 측정하는 TF-IDF 모델을 이용한다면, 검색한 단어가 전체 문서에서 얼마나 등장하는지를 고려해 결과를 랭크합니다. 사용자가 검색한 검색 쿼리가 가장 많이 등장하는 문서가 가장 첫 번째에 랭크되겠죠.
최종적으로 가장 높은 랭킹을 받은 문서들을 사용자에게 제공합니다. 여기서 정할 것들은 몇 개의 문서 목록을 제공할지, 필터링은 어떻게 제공할지, 정렬은 어떻게 제공할지 등이 있습니다.
이때 고려할 점은 페이징 정책입니다. 한 페이지에 몇 개의 문서를 불러올지, 속도나 성능은 어떻게 할지, 첫 번째/마지막/특정 페이지로 이동하는 기능을 제공할지 정할 수 있습니다.
실무에서는 검색 품질을 개선하는 작업을 많이 하게 됩니다. '검색 결과가 내 의도에 맞지 않는다', '비슷한 주제의 다른 결과도 보여줬으면 좋겠다' 등의 피드백을 받고, 이와 관련된 이슈를 해결하거나 검색 품질을 높이는 일을 담당하게 됩니다.
다음 편에서는 실무 사례 위주로, 사용자 피드백에 따라 검색 알고리즘의 어떤 부분을 점검하면 좋을지에 대한 가이드를 다루겠습니다.