개요
한 일
1. 데이터 수집
한계
- 논문 데이터 본문이 필요 -> 저작권 문제로 대량 구하기 쉽지 않음
해결
2. 데이터 전처리
텍스트 임베딩 모델
FAISS라이브러리를 활용해 텍스트 전처리, Sbert임베딩, 최적화까지 한번에 해결되었다.
- 장점: C++로 개발되어 검색 속도가 1초도 되지 않는다.
- 단점: 내부 동작 원리를 몰라 커스터마이징이 어렵다.
# 패키지 IMPORT
# !pip install faiss-gpu
# !pip install -U sentence-transformers
import numpy as np
import os
import pandas as pd
import urllib.request
import faiss
import time
from sentence_transformers import SentenceTransformer
# SBERT embedding
model = SentenceTransformer('distilbert-base-nli-mean-tokens')
encoded_data = model.encode(data)
print('임베딩 된 벡터 수 :', len(encoded_data))
# 인덱스 정의 및 데이터 추가
index = faiss.IndexIDMap(faiss.IndexFlatIP(768))
index.add_with_ids(encoded_data, np.array(range(0, len(data))))
faiss.write_index(index, 'abc_news')
# 검색 시간 측정
def search(query):
t = time.time()
query_vector = model.encode([query])
k = 10
top_k = index.search(query_vector, k)
print('total time: {}'.format(time.time() - t))
return [data[_id] for _id in top_k[1].tolist()[0]]
# 쿼리 입력
query = str(input())
results = search(query)
print('results :')
for result in results:
print('\t', result)
결과

- 순서대로 input - time - results이다.
- 입력 쿼리에는 논문에서 타 논문을 참조한 부분을 발췌한 문장이다.
- 검색 속도는 5개밖에 안돼서 큰 의미는 없지만 매우 짧다.
기존 embedding모델은 5초이상 걸렸다.
- 결과값은 DB에 저장된 논문들의 초록이다. 가장 유사도가 높은 순서대로 출력된다.

3. 의의
- 라이브러리가 다 했지만 성능을 높이는 과제가 남아있어 공부목적으로 좋다.
- 유명한 딥러닝 기반 임베딩 모델
FAISS를 공부해볼 수 있다.
- 데이터가 약간 지저분해서 전처리 연습용으로 좋다.
- 웹서비스 구현까지 이어질 희망이 보인다. HUGGINGFACE 프로젝트가 그 선례다.
할 일
FAISS라이브러리 내부 동작 원리 및 전처리 과정 뜯어보기
- 검색 성능 올리기 위한 전략 수립(아직 의도한 결과가 나오지는 않았다.)