본문 바로가기

My Work/웹 & 앱 서비스

Sementic Search (시맨틱 검색)_토스는 똑똑해

시멘틱 검색?

시맨틱 검색은 사용자의 검색 의도를 이해하고 자연어의 의미를 기반으로 검색 결과를 제공하는 기술이다. 이는 단순한 키워드 매치에 의존하지 않고, 문맥과 의미를 파악하여 더 정확한 정보를 제공하려는 접근 방식이다. 간닥하게 자동 원리로는자연어 처리와 AI 기술을 활용하는데 사용자가 입력한 질의의 의미를 이해한다고 보면 된다. 

 

실제로, 우리가 실생활에서 사용하는 앱들에서 시맨틱 검색이 적용된 사례를 찾아볼 수 있다. 대표적으로, 금융 앱에서 쉽게 확인할 수 있다. 금융 앱에서 다루는 용어들은 기본적으로 일반 사용자들이 어려워하는 경우가 많다. 때문에 시맨틱 검색 같이 사용자가 의도하는 검색 결과를 유추해서 앱 사용의 불편성을 느끼지 않게 하는 것이 중요하다. 

 

토스 VS 카카오페이

'카카오페이'에서 '뿜빠이' 라는 단어를 검색해보자. 뿜빠이는 우리나라에서 더치페이를 의미하는 속어이다. 따라서, 카카오페이에서 뿜빠이를 검색했을 때, '정산하기' 라는 기능이 검색되면 좋겠지만 아직 나오지 않는다;;

카카오페이에서 뿜빠이를 검색했을 때

 

반면, '토스'에서 검색을 해보면 '더치페이' 기능이 검색 결과로 나온다. 정확하게 사용자의 의도를 파악하고 사용자가 필요로 하는 정보를 제공한 셈이다.

토스에서 뿜빠이를 검색했을 때

 

위와 같이 시멘틱 검색은 사용자의 입력을 분석하여 단어의 의미와 의도를 이해한다. 뿜빠이는 특정 문맥에서 정산 또는 비용 나누기를 의미흐므로, 이를 통해 사용자가 원하는 기능이 무엇인지 파악한다. 그럼 시맨틱 기술의 중요성을 파악했으니 간단하게 시맨틱 검색에서 중요한 역할을 하는 기술인 Word2Vec을 간단하게 구현해보겠다. 

 

Word2Vec 

Word2Vec은 단어를 벡터 공간에서 표현하는 기술로, 단어 간의 의미적 유사성을 벡터 연산을 통해 분석할 수 있다. 이는 시맨틱 검색에서 중요한 역할을 한다. Word2Vec은 크게 2가지 방식으로 작동하는데 주변 단어들을 통해 중심 단어(Continuous Bag of Words)를 예측하거나 중심 단어를 통해 주변 단어(Skip-gram)를 예측한다. 또한, Word2Vec을 활용하여 사용자가 입력한 검색어의 의미를 이해하고, 관련성 높은 검색 결과를 제공한다.

 

예를 들어, 사용자가 '서울의 유명한 카페'를 검색하면, Word2Vec을 통해 '유명한', '카페', '서울'의 의미를 파악하여 적절한 결과를 제공한다. 또한, 추천 시스템에서도 사용되기도 한다. 사용자의 과거 검색 기록과 관련된 단어들을 벡터로 변환하여 유사한 콘텐츠를 추천한다. 사용자가 '스마트폰 리뷰'를 검색하면, 유사한 '전자 제품 리뷰'를 추천할 수 있다. 

 

아래는 내가 실습용으로 크립토 뉴스 기사를 데이터 전처리한 후, 훈련 데이터를 생성, 모델 정의, 임베딩 시각화로 프로세스를 구성해 tensorflow를 활용해서 임베딩 시각화를 한 것이다. 

 

코드 예시

import tensorflow as tf
import numpy as np
import os
import re

# 파일 경로
file_path = "(저장 위치)"

# 텍스트 파일 읽기
with open(file_path, 'r', encoding='utf-8') as file:
    text = file.read()

# 텍스트 전처리
def preprocess_text(text):
    text = re.sub(r'\[.*?\]', '', text)  # 대괄호 제거
    text = re.sub(r'\n', ' ', text)  # 개행문자 제거
    text = re.sub(r'[^a-zA-Z\s]', '', text)  # 영어, 공백 제외하고 제거
    text = text.lower()  # 소문자 변환
    words = text.split()
    return words

words = preprocess_text(text)
vocab = set(words)
vocab_size = len(vocab)
word2idx = {word: idx for idx, word in enumerate(vocab)}
idx2word = {idx: word for word, idx in word2idx.items()}

# 파라미터 설정
embedding_dim = 128
window_size = 2

# 데이터 준비
def generate_training_data(words, window_size):
    pairs = []
    for idx, word in enumerate(words):
        for neighbor in words[max(idx - window_size, 0): min(idx + window_size + 1, len(words))]:
            if neighbor != word:
                pairs.append((word, neighbor))
    return pairs

pairs = generate_training_data(words, window_size)
pairs_idx = [(word2idx[word1], word2idx[word2]) for word1, word2 in pairs]

# 모델 정의
class Word2Vec(tf.keras.Model):
    def __init__(self, vocab_size, embedding_dim):
        super(Word2Vec, self).__init__()
        self.target_embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=1)
        self.context_embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=1)

    def call(self, pair):
        target, context = pair
        target_emb = self.target_embedding(target)
        context_emb = self.context_embedding(context)
        dot_product = tf.reduce_sum(tf.multiply(target_emb, context_emb), axis=2)
        return dot_product

# 모델 인스턴스 생성
word2vec = Word2Vec(vocab_size, embedding_dim)

# 손실 함수와 옵티마이저 정의
word2vec.compile(optimizer='adam', loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True))

# 데이터셋 준비
targets, contexts = zip(*pairs_idx)
targets = np.array(targets).reshape(-1, 1)
contexts = np.array(contexts).reshape(-1, 1)
labels = np.ones((len(pairs_idx), 1))

# 모델 훈련
word2vec.fit([targets, contexts], labels, epochs=1000, verbose=2)

# 훈련된 임베딩 추출
embeddings = word2vec.target_embedding.get_weights()[0]

# 임베딩을 TSV 파일로 저장
embedding_file = 'C:/Users/rudol/Documents/AI/W2V/embeddings.tsv'
metadata_file = 'C:/Users/rudol/Documents/AI/W2V/metadata.tsv'

np.savetxt(embedding_file, embeddings, delimiter='\t')

with open(metadata_file, 'w') as f:
    for word in vocab:
        f.write(word + '\n')

print("임베딩 및 메타데이터 파일 생성 완료")

 

출력 예시

Word2Vec_크립토 뉴스

 

결론

Word2Vec을 비롯한 시맨틱 검색은 검색 시스템에서 중요한 역할을 담당하고 있다. 단순한 키워드 매칭을 넘어서서 사용자에게 더욱 의미 있고 관련성 높은 검색 결과를 제공하는 고마운 기술들이다. 앞으로도, 다양한 분야에서 사용자의 요구를 보다 정확하게 충족시킬 수 있는 시대가 올 것이다. 잘 대비하고 미리미리 공부해두자.