[NLP 8] Embedding 3 : Cosine Similarity를 이용한 추천 함수 구현

방선생·2025년 1월 15일
0

CountVectorizer와 코사인 유사도를 이용한 추천 함수 구현

  1. dataset
    • movies_metadata.csv
    • 2017년 7월 또는 그 이전에 개봉된 영화 45,466편에 대한 각종 정보가 포함

  2. 영화 소개(줄거리, 텍스트 데이터)를 CountVectorizer를 이용하여 행렬로 변환

  3. 좋아하는 영화의 제목을 입력

  4. 입력한 영화의 줄거리와 유사한 줄거리를 가지는 영화 제목을 찾아서 추천

pandas

  • import pandas as pd
    • pd.read_csv - 특정파일(csv는 엑셀) 읽어오기
    • df.loc[a:b, [’A’,’B’]] - A와 B를 인덱싱하기 (팬시 인덱싱)
    • isnull().sum() - 누락된 데이터 확인(Ture = 1, False = 0)
    • to_csv(’path’) - 특정파일 유형으로 저장하기

  • pandas.DataFrame.dropna
    • inplace - 원본 데이터프레임을 수정할지, 아니면 수정된 결과를 복사본으로 반환할지를 결정
    • ignore_index - 제거한 후, 인덱스를 재정렬 할지 결정

  • Series.map - 특정 함수나 매핑을 적용하여 새로운 값을 반환 (다른 메소드를 활용할 수 있게 해줌)

이 글의 코드에서 이어서 작성됩니다

dataset 불러오기 (영화 제목 및 줄거리 데이터)

import pandas as pd #필요한 라이브러리 임폴트
movies_path = '/content/drive/MyDrive/NLP/movies_metadata.csv' #경로 설정

df = pd.read_csv(movies_path)
print(df)
# overview 컬럼, title 컬럼 > 팬시 인덱싱

df_movies = df.loc[:, ['overview', 'title']]
print(df_movies)

영화 추천 함수 구현 Code 1 (데이터 전처리)

# 누락 데이터 제거 (전처리)

num_df = df_movies.isnull().sum() #각 컬럼별 누락 데이터의 수 확인

df_movies.dropna(inplace=True, ignore_index=True) #누락 데이터 제거
print(df_movies)
#CountVectorizer 함수 호출, 단어 사전 생성
## 필요한 라이브러리 임폴트 (위에서 했기때문에 생략)

movies_cv = CountVectorizer(stop_words='english') #불용어 제거

'''
num_words_list = []

for text in df_movies.loc[:, 'overview']:
  num = len(text.split())
  num_words_list.append(num)

print(sum(num_words_list))
'''

df_movies1 = df_movies.iloc[0:10000, :] #데이터의 수 > 10000개로 축소

movies_loc = df_movies1.loc[:, 'overview']

#map 함수 활용 > overview 컬럼 소문자로 변환
df_movies1.loc[:, 'overview'] = movies_loc.map(lambda x: x.lower())

movies_cv.fit(movies_loc) #단어 사전 생성
movies_voca = movies_cv.vocabulary_
print(movies_voca)
  • 거대한 데이터로 단어사전을 만들경우 행렬의 크기가 매우커져 메모리가 과부화됨 > 데이터를 줄여야함
  • 주석부분은 데이터의 단어의 수를 확인한것 > 많다는 것을 확인하는 용도

영화 추천 함수 구현 Code 2 (코사인 유사도 측정)

#overview 컬럼 > 임베딩

overview_matrix = movies_cv.transform(movies_loc).toarray()

print(overview_matrix, '\n')
print(overview_matrix.shape) #임베딩 결과의 모양
# 10000개 영화 줄거리 > 코사인 유사도 측정

sim = cosine_similarity(overview_matrix, overview_matrix)

print(sim)
# 코사인 유사도 결과 값 > DataFrame 생성

#컬럼과 행 인덱스 설정
index = df_movies1.loc[:, 'title'].values
columns = df_movies1.loc[:, 'title'].values

df_sim = pd.DataFrame(data=sim, index=index, columns=columns) #DataFrame 생성

#print(df_sim)
df_sim
  • 코랩의 특수 명령어 - 한 코드 묶음의 마지막은 프린트 없이 출력이 가능함

영화 추천 함수 구현 Code 3 (결과 저장 및 불러오기)

# 결과 저장하기
file_path = '/content/drive/MyDrive/NLP/df_sim.csv'

df_sim.to_csv(file_path)
# 저장된 csv 파일 불러오기

# 파일 경로 설정
file_path='/content/drive/MyDrive/NLP/df_sim.csv'

# DataFrame 생성
loaded_df = pd.read_csv(file_path, index_col=0)

# print(loaded_df)
loaded_df

영화 추천 함수 구현 Code 4 (유사한 영화 추천 함수 생성)

# 특정 영화 기준 --> 줄거리(overview, 영화 소개)가 유사한 영화 추천 함수 생성

def top10_recommend(title):
    top10 = loaded_df.loc[:, title].sort_values(ascending=False).iloc[1:11]
    return top10


# 매개 변수(parameter)의 값(argument) 설정
name = 'GoldenEye'

# 함수 호출, 실행
top10 = top10_recommend(title=name)

# 결과 확인하기
print(top10)
  • .sort_values()
    • Series를 정렬하는 함수
    • ascending=False는 내림차순 True는 오름 차순
  • ~iloc[1:11] => 0은 자기자신이기 때문에 제외








참고자료

pandas.DataFrame.dropna 공식 문서

pandas.Series.map 공식 문서

profile
AI & Robotics

0개의 댓글