제가 등록한 물건이 보이지 않아요: 텀분절

Jukyoung LEE
당근 테크 블로그
8 min readJan 4, 2022

검색 서비스를 운영하다보면 등록한 게시글이 검색 결과에 보이지 않는다는 문의를 자주 받아요. 다양한 이유가 존재하지만 잘못된 텀분절 결과 때문인 경우가 비교적 많았어요. 오늘은 텀분절에 대해 설명하고 당근마켓 검색팀은 관련 문제들을 어떻게 접근했는지 이야기 해볼게요.

색인어와 텀분절

대부분 검색엔진은 문서에 포함된 텍스트에서 키워드를 추출하고 사용자가 입력한 검색어가 추출한 키워드에 포함된 문서들을 검색 결과로 보여줘요. 이때 문서로 부터 추출한 키워드를 색인어라고 불러요.

색인어를 추출하는 방법은 다양하지만 쉬운 설명을 위해 당근마켓 중고거래 판매글 제목을 띄어쓰기 기준으로 색인어를 만들어 봤어요. 예시를 보면 삼성노트북이라는 키워드가 보이는데요. 이 키워드는 삼성, 노트북이라는 두 개 단어로 구성된 복합명사에요. 이처럼 하나의 단어로 되어있는 복합명사를 분리 시켜주는 작업을 텀분절이라 말해요. 텀분절은 색인어 추출에 사용할 뿐만 아니라 사용자가 입력한 검색어에도 적용해요.

관련된 내용은 이미 잘 정리된 자료가 많기 때문에 구글에 검색엔진 역색인로 검색하시면 쉽게 찾아볼 수 있을 거예요.

예시: 텀분절를 적용한 색인어 추출

텀분절이 왜 필요한가요?

사용자는 같은 의미의 검색어를 입력할때 띄어쓰기를 포함하거나 포함하지 않을 수 있어요. 실제 당근마켓 중고거래에서도 삼성노트북을 거래하기 위한 검색에 26%가 띄어쓰기를 포함해서 검색하고 있는데요. 이를 다르게 말하면 텀분절 결과를 활용하지 않으면 해당 검색에 26%는 “삼성노트북 팝니다” 처럼 제목에 복합명사가 포함된 판매글들을 볼 수 가없어요.

삼성노트북 VS 삼성 노트북

다른 예시로 사용자가 검색을 통해 이케아 의자를 찾는 상황을 생각해 볼게요. 당근마켓 중고거래에는 다양한 이케아 의자를 판매하는 글들이 있어요. 때문에 다양한 판매글을 검색 결과로 보여주면 보다 물건을 탐색하기 편할거에요. 만약 판매글로부터 이케아, 의자와 같은 주요 키워드를 추출하지 못 한다면 검색어와 매칭이 되지 않아 아래 이미지 처럼 문서들이 검색결과에 노출이 되지 않을거에요. 이처럼 텀분절은 사용자가 찾고자 하는 물건들을 보다 잘 찾는 데 도움을 줘요.

정보검색(IR, Information retrieval)이론에서는 전체 문서를 기준으로 사용자가 찾고자 하는 문서를 잘 찾아 주는 것을 재현률(Recall)이 높다고 이야기해요. 이 부분도 정보검색 재현률로 검색하면 쉽게 정리된 자료를 볼 수 있어요.

예시: 이케아의자, 노트북

사전을 통한 텀분절 개선하기

설명한 것 처럼 텀분절은 검색품질을 높이는데 중요한 역할을 하고 있어요. 하지만 모든 키워드의 텀분절 결과가 완벽할 수 없는데요. 이를 개선하기 위해 크게 두가지 방향이 있어요. 좋은 형태소 분석기를 개발하거나 (A), 형태소 분석기가 사용하는 사전의 내용을 보다 풍부하게 만드는 방법이에요 (B).

퍼즐 → 퍼, 즐
테니스라켓 → 테, 니스, 라켓
반죽기 → 반, 죽, 기

A. 텀분절은 형태소 분석기라는 모듈에서 진행해요. 좋은 형태소 분석기가 있다면 검색 품질을 개선하는데 많은 도움이 되지만 분석 속도와 검색엔진에 적용을 고려하면서 보다 좋은 분석기를 만드는건 쉬운일이 아니에요. 사실 분절기(Tokenizer)라는 표현이 더 정확하지만 편의를 위해 형태소 분석기라 이야기할께요.

B. 많은 형태소 분석기는 사용하는 사전을 수정하여 서비스에 맞게 고도화를 할 수 있는 기능을 제공해요. 현재 당근마켓 검색팀에서 사용하는 노리(Nori) 형태소 분석기도 사용자 사전을 수정하여 텀분절 결과를 변경할 수 있어요.

# 테니스라켓을 테니스, 라켓으로 분절
테니스라켓 테니스 라켓
# 반죽기는 텀분절 시키지 않음
반죽기

형태소 분석기 개발은 지속적으로 집중할 수 있는 인원과 시간이 충분하다면 장기적 관점에서 시도하기 좋지만 단기간에 효과를 보기는 어려워요. 사전을 수정하고 잘 관리하는 방법은 전략적으로 진행한다면 빠르게 서비스에 좋은 영향을 줄 수 있어요. 자원이 충분한 상황이 아니라면 처음부터 형태소 분석기 개발을 고려하기 보다는 사용하고 있는 사전을 잘 관리하는게 더 중요하다고 생각해요.

어떤 키워드를 등록하면 좋을까요?

그렇다면 사전에는 어떤 키워드를 얼마나 등록하면 좋을까요? 당근마켓은 한달에도 몇백만개 검색어가 검색이 되고있고 계속해서 새로운 검색어가 생기기 때문에 모든 단어를 검토해서 사전에 추가하는건 사실상 불가능해요. 당근마켓 검색팀은 막연하게 일을 하기보다는 데이터를 참고해 우선순위를 정해 사전에 반영할 검색어들을 결정했어요.

우선 사용자가 구입을 원하는 물건에 집중하기 위해 검색수를 기준으로 검색어를 결정 했어요. 당근마켓 검색에 검색어와 검색수는 롱테일 (Long tail) 형태에 분포를 가지고 있어 비교적 적은 검색어들로 많은 검색을 대응할 수 있어요. 이런 특성을 참고하여 전체 검색에 25%, 50%와 같이 개선하고 싶은 검색의 범위를 정하고 포함되는 검색어를 검토하여 사전에 반영하고 있어요.

예시: 검색어별 검색수, 누적 검색수 분포

문서의 포함되는 키워드의 분포는 검색수의 분포와 달라요. 중고거래를 예로 들면 사용자가 구입을 선호하는 물건과 판매하고 싶은 물건이 다를 수 있고 판매글에는 사이즈, 색상, 메모리 용량과 같은 물건을 설명하기 위한 표현들도 포함되어 있어요. 이런 이유로 검색수만을 기준으로 잡지 않고 문서에 포함되어있는 키워드에 빈도수도 참고해 사전에 반영하기 위한 시도를 했어요.

이를 위해 당근마켓 머신러닝팀에 도움을 받아 사용자들의 검색 패턴을 학습하여 중고거래 판매글의 제목, 본문으로 부터 주요 키워드를 추출하는 모델을 만들었어요. 공백을 기준으로 추출한 결과와 비교하면 팝니다,입니다 와 같이 문장 구성에 필요한 키워드들이 보이는 반면 모델에서 추출한 키워드는 당근마켓에서 거래되고 있는 물건들을 보다 잘 표현하는 것을 확인할 수 있어요. 키워드 추출 모델에 대한 내용은 기회가 된다면 머신러닝팀에 제이(정욱재)가 공유해 줄 거예요.

중고거래 카테고리 별 키워드 추출 모델이 추출한 키워드 (랜덤추출)

사전에 등록하지 못한 키워드 대응하기

모든 검색어를 사전에 반영하지 못하기 때문에 잘못된 텀분절 결과가 발생할 수 밖에 없어요. 특히 현재 사용하고 있는 노리 형태소 분석기는 외래어를 한글로 표기한 키워드에 좋지 않은 성능을 보여요. 게다가 주위 단어들에 따라 텀분절 결과가 다를 수 있어 검색어와 동일한 키워드가 문서에 존재한다 해도 검색 결과에 보이지 않을 수 있어요.

이런 부분들을 완화시키기 위해 노리 텀분절 결과와 공백을 기준으로 추출한 키워드를 함께 사용하게 되었어요. 아래 예시를 보면 원래대로라면 같은 키워드를 노리 형태소 분석기가 다르게 분절 시켜 검색 결과에 노출이 되지 않아야 하지만 공백으로 추출한 키워드가 이를 보정해주는걸 확인할 수 있어요. 이처럼 하나의 형태소 분석기만을 사용하기보다는 다양한 분석기를 활용하여 검색 품질을 개선할 수 있어요.

이 부분은 Elasticsearch에서 제공하는 whitespace analyzer 를 활용해서 구현이 가능해요.

예시: 노리, 화이트 스페이스 분석기 텀분절 결과

언어 자원 관리와 저빈도 키워드 상향 평준화

검색 서비스 개발에 있어 텀분절은 검색 품질에 많은 영향을 주는 중요한 작업이에요. 당근마켓 검색팀은 그 중요성을 인지하고 개선하기 위해 많은 노력을 했어요. 오늘은 개발 초기에 적은 노력으로 최대 효과를 보기 위해 검색팀이 고민한 내용들은 소개했어요. 검색 서비스를 처음 시작하는 분들에게 도움이 되었으면 좋겠어요.

앞으로 보다 좋은 검색 품질을 개선하기 위해 이부분들을 고도화할 필요가 있어요. 이를 위해 형태소 분석 사전과 같이 검색에 필요한 언어자원을 어떻게 잘 관리할지 고민이에요. 또 다른 고민은 지금까지는 검색이 많이 되는 검색어들을 수작업으로 개선하는 방향으로 진행했다면 앞으로는 사람이 직접 검토하기 어려운 규모에 저빈도 검색어들에 텀분절 결과를 상향 평준화 시켜주기 위한 방법들을 생각해 보고 있어요.

당근마켓 검색팀과 함께 다양한 문제에 도전하고 싶으신 분은 언제든 아래 이메일로 연락을 주시거나 당근마켓 채용 사이트를 찾아주세요.

감사합니다

aiden@daangn.com
https://team.daangn.com/jobs/

--

--