한국어 SQLite 전문검색에서 조사 문제를 해결해보자
FTS5 unicode61 토크나이저 전환에 조사 정규화까지 더해 한국어 키워드 검색 정확도를 22.6%에서 85%까지 끌어올렸다
한국어 SQLite 전문검색에서 조사 문제를 해결해보자
한국어 SQLite 전문검색에서 조사 문제를 해결해보자
개인 검색 인프라 프로젝트에서 FTS5로 한국어 검색을 돌리는데 “마트를” 같은 어절이 “마트”와 다른 토큰으로 잡혀 검색이 안 되는 경우가 많았다. 토크나이저를 바꾸고, 벡터를 섞어보고, 결국 조사를 정규식으로 벗겨내는 방법까지 가서야 정리가 됐다.
1. 서론 (Introduction)
- 문제/상황 (Problem): FTS5
unicode61토크나이저로도 한국어 조사(“을/를/은/는/에서/으로” 등)가 어절 끝에 붙으면서 같은 단어가 다른 토큰으로 인식돼 검색이 실패했다. - 목적 (Purpose): 토크나이저 전환과 조사 정규화로 한국어 전문검색의 키워드 매칭 정확도를 높인다.
- 대상 (Target Audience): SQLite FTS5로 한국어 문서를 검색하는 개발자.
2. 방법 및 과정 (Methods & Process)
배경 조사 및 데이터 (Data Collection): 조사 문제를 풀기 전에 이미 두 가지 병목을 먼저 걷어냈다. 검색어의 모든 단어를 AND로 요구하던 키워드 매칭을 OR로 완화해 정확도 43.3%→50.0%를 얻었고, 그다음 토크나이저별 키워드 단독 정확도를 비교했다.
단계 설정 키워드 단독 정확도 이전 trigram 토크나이저 22.6% 전환 후 unicode61 토크나이저 54.8% + 조사 정규화 unicode61 + 색인/쿼리 조사 제거 top_k 85% - 접근 방법 (Approach Methods):
- [방법 1]: FTS5 토크나이저를 trigram에서 unicode61로 바꾼다.
- [방법 2]: 색인 시점과 쿼리 시점 양쪽에서 동일한 규칙으로 조사를 제거하는 정규화 함수를 통과시킨다.
- 분석 및 해결 프로세스 (Analysis Flow):
- 도구/기술: SQLite FTS5 토크나이저 옵션, 조사 목록(50개 안팎, 긴 것부터 매칭) 기반 정규식 스트립 함수.
- 주요 단계: AND 조건 키워드 매칭을 OR로 완화(43.3%→50.0%) $\rightarrow$ trigram 토크나이저의 낮은 정확도 확인 $\rightarrow$ unicode61 전환 $\rightarrow$ 그래도 남은 조사 결합 문제 확인 $\rightarrow$ 벡터 후보 합류 실험(기각) $\rightarrow$ 조사 정규화 적용.
- 결과 도출 및 검증: 조사 정규화 적용 후 recall이 77%에서 89%(+12%p), 최종 top_k 정확도가 73%에서 85%(+12%p)로 올랐고, 지연은 오히려 1.2초에서 0.56초로 줄었다.
3. 결과 (Results)
- 분석 결과 요약: unicode61 전환만으로 정확도가 22.6%에서 54.8%로 두 배 넘게 뛰었다. 이후 “토크나이저 자체가 약하니 벡터를 더 섞어보자”는 시도를 먼저 해봤는데, recall은 2%p만 오르고 지연이 1.2초에서 4.0초로 3.3배 늘어 기본값을 OFF로 되돌렸다. 반면 조사 정규화는 recall +12%p, top_k 정확도 +12%p를 얻으면서 지연도 1.2초에서 0.56초로 줄었다.
4. 인사이트 및 액션 (Insights & Action)
- 인사이트 (Insight): 같은 목표(한국어 매칭 개선)를 두고 벡터 합류와 조사 정규화 두 방법을 붙여봤는데, 결과가 정반대였다. 벡터는 무거운 연산을 하나 더 얹는 방식이라 정확도 이득 대비 지연 비용이 컸고, 조사 정규화는 토큰 자체를 가볍게 정리하는 방식이라 정확도와 지연을 동시에 개선했다. 문제의 원인(조사 결합)에 정확히 맞는 저비용 수정이, 원인을 우회하는 고비용 수정보다 나았다.
- 실행 방안 (Action Plan): 토크나이저·언어 문제를 벡터로 우회하기 전에, 먼저 원인이 되는 언어 규칙(조사·어미·복합어)을 정규화로 제거할 수 있는지부터 확인한다. 비용 대비 효과가 맞는 쪽을 남긴다.
- 한 줄 결론 (Key Takeaway): 한국어 조사 문제는 벡터로 덮기보다 색인·쿼리 양쪽에 같은 조사 제거 규칙을 적용하는 쪽이 더 싸고 더 효과적이었다. 샘플 코드
- 다음 스텝 (Next Step): 현재 조사 목록은 규칙 기반 정적 리스트라 신조어·복합조사·구어체 축약형(“에서”가 “서”로 줄어드는 경우 등)은 못 잡는다. 형태소 분석기 없이 이 엣지 케이스를 얼마나 더 커버할 수 있는지가 남아 있다.
This post is licensed under CC BY 4.0 by the author.