CountVectorizer와 코사인 유사도를 이용한 추천 함수 구현
- dataset
- movies_metadata.csv
- 2017년 7월 또는 그 이전에 개봉된 영화 45,466편에 대한 각종 정보가 포함
- 영화 소개(줄거리, 텍스트 데이터)를 CountVectorizer를 이용하여 행렬로 변환
- 좋아하는 영화의 제목을 입력
- 입력한 영화의 줄거리와 유사한 줄거리를 가지는 영화 제목을 찾아서 추천
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 - 특정 함수나 매핑을 적용하여 새로운 값을 반환 (다른 메소드를 활용할 수 있게 해줌)
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)
# 누락 데이터 제거 (전처리)
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)
#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
# 결과 저장하기
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
# 특정 영화 기준 --> 줄거리(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)
참고자료