- 추천시스템을 구현하기 위해 각 컨텐츠마다 줄거리를 기반으로 유사한 줄거리를 가진 컨텐츠를 추천하고자 한다
- SBERT(Sentence-BERT)는 BERT 기반의 모델로, 문장이나 문단을 고정 길이의 벡터로 변환하는 데 효과적임. SBERT를 사용하여 각 줄거리 텍스트를 벡터로 변환.
movie = pd.read_csv('app/resources/VODs_1216_0137.csv')
description_list = movie['SMRY'].to_list()
# 줄거리들을 벡터로 변환
encoded_data = model.encode(description_list)
# faiss 인덱스 생성
# 임베딩한 값을 faiss 인덱스에 저장함.
index = faiss.IndexIDMap(faiss.IndexFlatIP(768))
index.add_with_ids(encoded_data, np.array(range(0, len(description_list))))
# 인덱스 저장
faiss.write_index(index, './VODS.index')
# 인덱스 불러오기
# index = faiss.read_index('./VODS.index')
- FAISS 인덱스를 통해 content_id를 찾을 수 있도록 faiss2content_id dict형태로 선언
- 임베딩 벡터를 NumPy 배열로 반환
def ContentId2FaissIndex(self, content_id: int) -> np.ndarray:
# faiss_index와 content_id는 매핑되어 있다.
faiss_index = self.FaissIndex2Content_id.get(content_id)
# 인덱스 객체에서 특정 벡터를 복원(retrieve)하는 기능
emb = self.index.reconstruct(faiss_index)
emb_np = np.array(emb).reshape(1, -1)
return emb_np
def search(self, query: dict) -> list[str]:
content_id_list = [int(item.content_id) for item in query]
print("content_id_list: ",content_id_list)
query_list = []
for content_id in content_id_list:
query = self.ContentId2FaissIndex(content_id)
query_list.append(query)
query_array = np.vstack(query_list)
k = 100
D, I = self.index.search(query_array, k)
index_list = I.flatten().tolist()
index_list = random.sample(index_list, 100)
recommend_content_id = [str(self.FaissIndex2Content_id.get(key)) for key in self.FaissIndex2Content_id.keys() if key in index_list]
return recommend_content_id
- FAISS Search함수는 두 개의 배열을 반환합니다. 하나는 거리를 나타내는 배열(D)이고, 다른 하나는 해당 인덱스를 나타내는 배열(I).
- FAISS는 유사성 검색에 필요한 거리 계산(예: 유클리디안 거리)을 효율적으로 수행. 이는 알고리즘적 최적화를 통해 구현
정의: 유클리디안 거리는 두 점(또는 두 벡터) 간의 "직선 거리"를 측정합니다. 이는 고등학교 수학에서 배우는 평면상의 두 점 사이 거리 공식의 일반화된 형태입니다.
계산 방법: 두 벡터 ( A )와 ( B )가 있을 때, 유클리디안 거리는 다음과 같이 계산됩니다:
사용 예: 유클리디안 거리는 물리적 공간 내의 거리를 측정하는 데 적합하며, 클러스터링(Clustering)이나 분류(Classification) 작업에 종종 사용됩니다.
정의: 코사인 유사도는 두 벡터 간의 각도를 측정하는 방식으로, 벡터의 방향성에 초점을 맞춥니다. 즉, 두 벡터의 방향이 얼마나 유사한지를 판단합니다.
계산 방법: 두 벡터 ( A )와 ( B )가 있을 때, 코사인 유사도는 다음과 같이 계산됩니다:
사용 예: 코사인 유사도는 텍스트 분석, 문서 검색, 추천 시스템 등에서 널리 사용되며, 벡터의 크기보다는 방향성에 더 중점을 두는 상황에서 유용합니다.