Engineering
연관 키워드 추천
John여기어때
2026년 1월 9일
원문에서 보기 ↗
안녕하세요. 여기어때 랭킹추천개발팀 존 입니다.
오늘 공유할 내용은 고가의 GPU 장비를 기반으로 하는, 복잡하고 거대한 모델링에 관한 이야기가 아닙니다. 물론 모델의 구조가 복잡하고 클수록 더 뛰어난 성능을 발휘하는 것이 일반적이지만 해결하고자 하는 문제에 따라서는 가벼운 고전 모델을 활용해도 충분히 만족할 만한 결과를 얻을 수 있습니다.
오늘은 이러한 접근 방식을 통해 “연관 키워드 추천” 시스템을 구축한 경험을 공유하려 합니다. SOTA 기술이 아닌, 데이터의 특성에 맞는 적정 기술을 선택하는 과정에 관한 이야기 입니다.
연관 키워드 추천
사용자가 입력한 검색어와 연관성이 높은 키워드를 제공하여 원하는 정보를 더 빠르고 효과적으로 탐색할 수 있도록 지원하는 기능입니다. 우리는 연관 키워드의 조건을 다음 두 가지로 정의했습니다.
동시 검색 패턴
사용자가 입력한 검색어와 실제로 함께 자주 검색되는 키워드여야 합니다.
지역적 & 맥락적 타당성
사용자가 결과를 봤을 때 직관적으로 납득할 수 있어야 합니다. 예를 들어 “경주”를 검색 했다면 경주 내 명소인 “황리단길”이나 인접 도시인 “포항”, “울산”이 추천 되어야 합니다.
데이터 들여다보기
정의한 연관 키워드를 모델링 하기 위해 실제 사용자들의 검색 로그를 분석해 보았습니다. 데이터는 다음과 같은 특징이 있었습니다.
Synonyms
여기어때 국내 숙소 검색 환경은 탐색할 키워드를 사용자가 직접 타이핑하는 엔터 검색 방식과 시스템이 제안하는 자동완성 키워드를 선택하는 방식 모두 지원합니다. 이로 인해 동일한 의도를 가진 검색어라도 다양한 형태로 파편화되어 입력 됩니다.
강릉,강릉시,강원도 강릉제주,제주시,제주도
Domain-Specific
여행 및 숙소 도메인의 검색 키워드는 일반적인 웹 검색과 다른 뚜렷한 특징을 보입니다.
- 명사 중심: 서술형 문장이나 형용사구 기반의 자연어 형태보다는 명확한 대상을 지칭하는 고유명사 위주의 입력 패턴이 많습니다.
- 주요 키워드: 검색어의 대다수는 지역명, 지하철역, 주요 명소, 특정 제휴점명 등 위치나 장소를 특정하는 키워드로 구성됩니다.
- 기타 키워드**:** 숙소 유형(호텔, 모텔, …)이나 시설 정보(자쿠지, 온천, …)를 직접 타이핑하여 입력하는 등 좀 더 구체적인 니즈가 반영된 키워드가 유입 되기도 합니다.
Long-Tail 분포
상위 5%의 인기 키워드에 트래픽의 40%가 집중된 반면, 나머지 95%의 하위 키워드군이 전체 유입의 60%를 견인하는 전형적인 롱테일(Long-tail) 분포가 나타납니다. 특히 하위 키워드 영역은 인기 키워드 보다 구체적인 세부 지역이나 특정 명소를 지칭하는 검색어들이 많이 포함되어 있습니다.

Long-Tail Distribution
Sequence 유형
사용자별 검색 기록을 시계열로 나열해 보니 우리가 정의 했던 지역적 & 맥락적 타당성을 모델링 할 수 있을 만한 패턴들이 발견 되었습니다.
- 지역 → POI:
경주→황리단길,강릉→정동진→경포대 - 지역 → 인접지역:
경주→포항,강릉→양양
모델 선정 하기
로그 데이터를 살펴보니 데이터에 내재된 사용자의 검색 패턴을 학습하는 것만으로도 우리가 정의한 ‘연관 키워드’의 요건을 충분히 충족할 수 있다고 판단했습니다. 이에 최적의 모델 구조를 결정하기 위해 다음과 같은 세 가지 핵심 기준을 세웠습니다.
순서성 VS 근접성
연관 키워드 추천에 있어 ‘A → B’와 ‘B → A’의 검색 순서는 크게 중요하지 않습니다. 두 키워드가 서로 관련이 있다는 사실 자체가 중요하기 때문입니다. 따라서 문장 내 단어의 순서나 방향성을 엄격하게 따지는 모델보다는 얼마나 가까운 위치에서 함께 등장했는가를 포착하는 근접성 중심의 접근이 더 유효하다고 판단했습니다.
키워드 간 동적 VS 전역적 관계
우리가 다루는 검색 키워드는 대부분 고유명사 입니다. ‘제주도’와 ‘제주공항’의 관계는 특정 문장 안에서만 성립하는 것이 아니라 전체 데이터셋에서 통용되는 전역적인 관계 입니다. 따라서 문맥에 따라 단어 간 관계가 변하는 무거운 모델보다는 단어 고유의 관계를 고정적으로 잘 표현하는 모델이 적합하다고 판단했습니다.
사전적 의미 VS 행동 기반 연관성
우리가 정의한 연관 키워드는 사전적으로 유사한 단어가 아니라 사용자가 탐색 과정에서 함께 자주 검색하는 키워드 입니다. 우리는 계절성과 트렌드가 반영된 사용자 행동 데이터 학습을 기반으로 하는 모델이 필요하다고 생각했습니다.
이러한 기준에 따라 시퀀스 모델이나 무거운 언어 모델은 우리에게 ‘오버 스펙’이라고 판단했습니다. 대신 윈도우 내 단어들의 동시 등장 패턴을 학습하여 순서에 구애받지 않고, 고정된 벡터를 통해 고유명사 간의 전역적 관계를 빠르고 효율적으로 파악할 수 있는 Word2Vec을 최종 모델로 선정하게 되었습니다.
데이터 모델링 하기
앞서 이야기 했던 로그 데이터에 파편화 되어 있는 동의어들을 전처리 없이 그대로 모델에 넣을 경우 같은 대상을 가리키는 단어들이 벡터 공간 상에서 서로 다른 위치로 흩어지는 문제가 발생합니다. 그래서 간단한 텍스트 전처리와 기존에 구축된 사내 질의어 분류기와 사전 데이터를 통해 텍스트 정규화 과정을 진행 하였습니다.
경주,경북 경주,경주시,경북 경주, … →경주강릉,강원 강릉,강릉시,강원도 강릉, … →강릉
정규화된 데이터를 바탕으로 Word2Vec 모델을 학습시켰으며 코사인 유사도를 기준으로 각 키워드별 연관 추천 목록을 생성했습니다.
경주: 포항, 황리단길, 부산, 울산, 영덕, 경주월드, 여수, ...
강릉: 속초, 정동진, 강원 고성군, 경포, 강원 양양군, 강원 동해시, 경포대, ...
결과를 확인해보니 전반적으로 우리가 의도했던 지역적 & 맥락적 타당성을 갖춘 키워드들이 잘 추천되는 것을 확인할 수 있었습니다. 하지만 상세 검수 과정에서 다음과 같이 이해하기 어려운 케이스들도 발견되었습니다.
홍대입구역: 합정역, 연남동, 상수역, 홍대, 신촌, 망원역, 망원, 가톨릭 목포 성지, ...
광화문: 서울 종로구, 서울 중구, 인사동, 대학로, 경복궁, 성수동 대림창고 갤러리, ...
“홍대입구역”의 연관 키워드로 뜬금없이 목포에 있는 가톨릭 성지가 등장하거나 “광화문”의 연관 결과로 인근 명소들을 제치고 “성수동 대림창고 갤러리”가 상위에 랭크되는 등 직관적으로 납득하기 어려운 결과들이 섞여 있었습니다.
Initialization Problem

Initialization Problem & Quality Degradation
이러한 현상의 원인을 분석한 결과, 우리는 이것이 모델 학습 초기에 발생하는 초기화 문제임을 확인했습니다. Word2Vec과 같은 임베딩 모델은 학습을 시작할 때 모든 단어 벡터를 임의의 값으로 초기화하여 벡터 공간에 무작위로 배치합니다. 이후 학습 데이터를 순회하며 관련된 단어들은 가깝게, 관련 없는 단어들은 멀어지도록 벡터를 조금씩 이동시킵니다.
하지만 위 사례처럼 학습 데이터가 충분하지 않은 경우, 단어 벡터들이 자신의 위치를 제대로 찾아가지 못하고 초기화된 랜덤 위치 근처에 그대로 머무르는 현상이 발생합니다.
즉, “홍대입구역”과 “가톨릭 목포 성지”가 가깝게 나온 것은 두 단어 사이에 실제 연관성이 있어서가 아니라 초기에 우연히 서로 가까운 위치에 랜덤하게 배정 되었고 학습 과정에서 이를 수정할 만큼 충분한 업데이트가 일어나지 않았기 때문입니다.
Initialization Problem 해결하기
가장 쉬운 해결책은 min_count 파라미터를 상향 조정하여 빈도수가 낮은 단어를 학습에서 아예 배제하는 것입니다. 하지만 앞서 로그 데이터에서 확인했듯이 사용자의 구체적인 니즈가 담긴 세부 지역이나 명소들은 대부분 출현 빈도가 낮은 롱테일(Long-tail) 영역에 분포해 있습니다. 따라서 단순히 빈도수를 기준으로 데이터를 잘라내면 노이즈를 제거하려다 오히려 꼭 필요한 핵심 키워드들까지 학습 기회를 잃게 되는 부작용이 발생합니다. 그래서 단순히 빈도수 관련 파라미터를 조절하는 것이 아니라 실제 데이터의 통계적 사실을 결합하는 하이브리드 파이프라인을 설계하여 이 문제를 해결했습니다.
- Step 1. Word2Vec 우선 모델을 통해 폭넓게 연관 키워드 후보를 생성합니다. 설령 노이즈가 섞이더라도 최대한 많은 후보를 확보 하는 것이 목적 입니다.
- Step 2. Co-occurrence Filtering 후보로 뽑힌 키워드들이 실제 로그상에서 동시 출현(Co-occurrence) 했는지 통계적으로 검증합니다.
즉 모델이 추천했더라도 실제 로그에서 단 한 번도 같이 검색된 적이 없다면 과감히 버린다는 원칙을 적용하여 초기화 문제로 인한 현상을 효과적으로 제거했습니다. 이 로직을 적용한 결과 초기화 문제로 발생했던 노이즈가 제거되고 지역적 & 맥락적 타당성을 갖춘 키워드들이 상위로 올라오는 것을 확인했습니다.
홍대입구역: 합정역, 연남동, 상수역, 신촌, 홍대, 망원역, 망원, 이대역, ...
광화문: 서울 종로구, 서울 중구, 인사동, 대학로, 경복궁, 청계천, ...
맺음말
연관 키워드 추천 시스템 구축은 단순히 유사한 단어를 나열하는 것을 넘어, 사용자의 실제 탐색 맥락을 보존 하면서도 시스템의 운영 효율성을 동시에 확보한 유의미한 과정이었습니다.
랭킹추천개발팀은 앞으로도 실제 서비스에서 쌓이는 피드백을 바탕으로 추천의 정교함을 높이는 동시에, 이를 가장 효율적으로 구현할 수 있는 기술적 최적화를 지속하겠습니다. 사용자에게는 가장 적절한 탐색 경험을, 시스템에는 단단한 안정성을 선사할 수 있도록 기술을 다듬어 나가도록 하겠습니다.
읽어주셔서 감사합니다.